/ Hex Artifact Content
Login

Artifact 038c248267e74ff70a2bb9b1884d40fd145c5183b017823ecb6cbb14bc781478:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  nArg==0 );.  UNU
2870: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70  SED_PARAMETER(ap
2880: 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72  Arg);.  p = (str
2890: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
28a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28b0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28c0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
28d0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ( p ){.    p->nT
28e0: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
28f0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
2900: 74 5f 72 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20  t_rankInvFunc(. 
2910: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2920: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2930: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2940: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2950: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
2960: 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f  nt *p;.  UNUSED_
2970: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2980: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
2990: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
29a0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
29b0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
29c0: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
29d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
29e0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
29f0: 70 29 29 3b 0a 20 20 70 2d 3e 6e 53 74 65 70 2b  p));.  p->nStep+
2a00: 2b 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  +;.}.static void
2a10: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c   percent_rankVal
2a20: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
2a30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2a40: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2a50: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  t *p;.  p = (str
2a60: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
2a70: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2a80: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2a90: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2aa0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  ( p ){.    p->nV
2ab0: 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b  alue = p->nStep;
2ac0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2ad0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2ae0: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2af0: 29 70 2d 3e 6e 56 61 6c 75 65 20 2f 20 28 64 6f  )p->nValue / (do
2b00: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2b10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b20: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2b30: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2b40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b50: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2b60: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2b70: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2b80: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 46 69 6e   percent_rankFin
2b90: 61 6c 69 7a 65 46 75 6e 63 20 70 65 72 63 65 6e  alizeFunc percen
2ba0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 0a  t_rankValueFunc.
2bb0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2bc0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
2bd0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
2be0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
2bf0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2c00: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2c10: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2c20: 0a 2a 2a 0a 2a 2a 20 20 20 47 52 4f 55 50 53 20  .**.**   GROUPS 
2c30: 42 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57  BETWEEN 1 FOLLOW
2c40: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
2c50: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73  D FOLLOWING.*/.s
2c60: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2c70: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c90: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
2ca0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
2cb0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
2cc0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2cd0: 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t *p;.  UNUSED_P
2ce0: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 20  ARAMETER(nArg); 
2cf0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
2d00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d10: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20  METER(apArg);.  
2d20: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2d30: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2d40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2d50: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2d60: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
2d70: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a     p->nTotal++;.
2d80: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d90: 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75  d cume_distInvFu
2da0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2db0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2dc0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2dd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2de0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2df0: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2e00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2e10: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2e20: 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  rg==0 );.  UNUSE
2e30: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70 41 72  D_PARAMETER(apAr
2e40: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2e50: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2e60: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2e70: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2e80: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e  eof(*p));.  p->n
2e90: 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63  Step++;.}.static
2ea0: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2eb0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2ec0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2ed0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2ee0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2ef0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2f00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
2f30: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28      double r = (
2f40: 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74 65 70  double)(p->nStep
2f50: 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e  ) / (double)(p->
2f60: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73 71 6c  nTotal);.    sql
2f70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
2f80: 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20 7d  le(pCtx, r);.  }
2f90: 0a 7d 0a 23 64 65 66 69 6e 65 20 63 75 6d 65 5f  .}.#define cume_
2fa0: 64 69 73 74 46 69 6e 61 6c 69 7a 65 46 75 6e 63  distFinalizeFunc
2fb0: 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65 46   cume_distValueF
2fc0: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
2fd0: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 74  xt object for nt
2fe0: 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e  ile() window fun
2ff0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ction..*/.struct
3000: 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69 36   NtileCtx {.  i6
3010: 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20 20  4 nTotal;       
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3030: 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20 70   Total rows in p
3040: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36  artition */.  i6
3050: 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20 20  4 nParam;       
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   Parameter passe
3080: 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a 2f  d to ntile(N) */
3090: 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20  .  i64 iRow;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
30c0: 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  w */.};../*.** I
30d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30e0: 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20 61   ntile(). This a
30f0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
3100: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
3110: 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65 64  .** been coerced
3120: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   to:.**.**   ROW
3130: 53 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  S CURRENT ROW AN
3140: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
3150: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
3160: 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46 75  void ntileStepFu
3170: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3180: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
3190: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
31a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
31b0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74  g.){.  struct Nt
31c0: 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73 73  ileCtx *p;.  ass
31d0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20  ert( nArg==1 ); 
31e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31f0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
3200: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29  truct NtileCtx*)
3210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3220: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3230: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3240: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3250: 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a  p->nTotal==0 ){.
3260: 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20        p->nParam 
3270: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3280: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
3290: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
32a0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
32b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
32c0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
32d0: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
32e0: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
32f0: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
3300: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
3310: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
3320: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 54  .    }.    p->nT
3330: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
3340: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49  atic void ntileI
3350: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
3360: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3370: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3380: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3390: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
33a0: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
33b0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
33c0: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
33d0: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55 4e  ETER(nArg);.  UN
33e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
33f0: 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74  pArg);.  p = (st
3400: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
3410: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3420: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
3430: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
3440: 3e 69 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >iRow++;.}.stati
3450: 63 20 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75  c void ntileValu
3460: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3470: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3480: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
3490: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
34a0: 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69  t NtileCtx*)sqli
34b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
34c0: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
34d0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
34e0: 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20   && p->nParam>0 
34f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  ){.    int nSize
3500: 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20   = (p->nTotal / 
3510: 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20  p->nParam);.    
3520: 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  if( nSize==0 ){.
3530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3540: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
3550: 20 70 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20   p->iRow+1);.   
3560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
3570: 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54  4 nLarge = p->nT
3580: 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d  otal - p->nParam
3590: 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36  *nSize;.      i6
35a0: 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67  4 iSmall = nLarg
35b0: 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20  e*(nSize+1);.   
35c0: 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d     i64 iRow = p-
35d0: 3e 69 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73  >iRow;..      as
35e0: 73 65 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e  sert( (nLarge*(n
35f0: 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50  Size+1) + (p->nP
3600: 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69  aram-nLarge)*nSi
3610: 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29  ze)==p->nTotal )
3620: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  ;..      if( iRo
3630: 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20  w<iSmall ){.    
3640: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3650: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31  lt_int64(pCtx, 1
3660: 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31   + iRow/(nSize+1
3670: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
3680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3690: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
36a0: 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b  tx, 1 + nLarge +
36b0: 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e   (iRow-iSmall)/n
36c0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
36d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69     }.  }.}.#defi
36e0: 6e 65 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65  ne ntileFinalize
36f0: 46 75 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46  Func ntileValueF
3700: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
3710: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61  xt object for la
3720: 73 74 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f  st_value() windo
3730: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
3740: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3750: 74 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  tx {.  sqlite3_v
3760: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
3770: 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t nVal;.};../*.*
3780: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3790: 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29   of last_value()
37a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37b0: 20 6c 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46   last_valueStepF
37c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
37d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
37e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
37f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
3800: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c  rg.){.  struct L
3810: 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a  astValueCtx *p;.
3820: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3830: 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20  ER(nArg);.  p = 
3840: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3850: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3860: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3870: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3880: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3890: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
38a0: 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20  free(p->pVal);. 
38b0: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c     p->pVal = sql
38c0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61  ite3_value_dup(a
38d0: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pArg[0]);.    if
38e0: 28 20 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->pVal==0 ){.
38f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3900: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
3910: 28 70 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73  (pCtx);.    }els
3920: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  e{.      p->nVal
3930: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3940: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3950: 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20  _valueInvFunc(. 
3960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3970: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
3980: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
3990: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
39a0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
39b0: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
39c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
39d0: 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g);.  UNUSED_PAR
39e0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
39f0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73   p = (struct Las
3a00: 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74  tValueCtx*)sqlit
3a10: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3a20: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
3a30: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c  f(*p));.  if( AL
3a40: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
3a50: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
3a60: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
3a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3a80: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
3a90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
3aa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
3ab0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3ac0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
3ad0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3ae0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
3af0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
3b00: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
3b10: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
3b20: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3b30: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3b40: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
3b50: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
3b60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
3b70: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
3b80: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
3b90: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46  void last_valueF
3ba0: 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69  inalizeFunc(sqli
3bb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
3bc0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
3bd0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
3be0: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
3bf0: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
3c00: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3c10: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
3c20: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
3c30: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
3c40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3c50: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
3c60: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
3c70: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3c80: 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56  pVal);.    p->pV
3c90: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
3ca0: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e 61 6d 65  *.** Static name
3cb0: 73 20 66 6f 72 20 74 68 65 20 62 75 69 6c 74 2d  s for the built-
3cc0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3cd0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 73 65  on names.  These
3ce0: 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73   static.** names
3cf0: 20 61 72 65 20 75 73 65 64 2c 20 72 61 74 68 65   are used, rathe
3d00: 72 20 74 68 61 6e 20 73 74 72 69 6e 67 20 6c 69  r than string li
3d10: 74 65 72 61 6c 73 2c 20 73 6f 20 74 68 61 74 20  terals, so that 
3d20: 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 74 73 0a  FuncDef objects.
3d30: 2a 2a 20 63 61 6e 20 62 65 20 61 73 73 6f 63 69  ** can be associ
3d40: 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74  ated with a part
3d50: 69 63 75 6c 61 72 20 77 69 6e 64 6f 77 20 66 75  icular window fu
3d60: 6e 63 74 69 6f 6e 20 62 79 20 64 69 72 65 63 74  nction by direct
3d70: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  .** comparison o
3d80: 66 20 74 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e  f the zName poin
3d90: 74 65 72 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ter.  Example:.*
3da0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 70  *.**       if( p
3db0: 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d  FuncDef->zName==
3dc0: 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  row_valueName ){
3dd0: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63   ... }.*/.static
3de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 72 6f 77 5f   const char row_
3df0: 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20  numberName[] =  
3e00: 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73   "row_number";.s
3e10: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3e20: 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b   dense_rankName[
3e30: 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f 72 61 6e  ] =   "dense_ran
3e40: 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  k";.static const
3e50: 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d   char rankName[]
3e60: 20 3d 20 20 20 20 20 20 20 20 20 22 72 61 6e 6b   =         "rank
3e70: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e80: 63 68 61 72 20 70 65 72 63 65 6e 74 5f 72 61 6e  char percent_ran
3e90: 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65  kName[] = "perce
3ea0: 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63  nt_rank";.static
3eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 63 75 6d 65   const char cume
3ec0: 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20  _distName[] =   
3ed0: 20 22 63 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74   "cume_dist";.st
3ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3ef0: 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  ntileName[] =   
3f00: 20 20 20 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74       "ntile";.st
3f10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3f20: 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d  last_valueName[]
3f30: 20 3d 20 20 20 22 6c 61 73 74 5f 76 61 6c 75 65   =   "last_value
3f40: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3f50: 63 68 61 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61  char nth_valueNa
3f60: 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76  me[] =    "nth_v
3f70: 61 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  alue";.static co
3f80: 6e 73 74 20 63 68 61 72 20 66 69 72 73 74 5f 76  nst char first_v
3f90: 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66  alueName[] =  "f
3fa0: 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61  irst_value";.sta
3fb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c  tic const char l
3fc0: 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  eadName[] =     
3fd0: 20 20 20 20 22 6c 65 61 64 22 3b 0a 73 74 61 74      "lead";.stat
3fe0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61  ic const char la
3ff0: 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  gName[] =       
4000: 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a     "lag";../*.**
4010: 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74   No-op implement
4020: 61 74 69 6f 6e 73 20 6f 66 20 78 53 74 65 70 28  ations of xStep(
4030: 29 20 61 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28  ) and xFinalize(
4040: 29 2e 20 20 55 73 65 64 20 61 73 20 70 6c 61 63  ).  Used as plac
4050: 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72  e-holders.** for
4060: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4070: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4080: 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 6f 73 65  never call those
4090: 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a   interfaces..**.
40a0: 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65  ** The noopValue
40b0: 46 75 6e 63 28 29 20 69 73 20 63 61 6c 6c 65 64  Func() is called
40c0: 20 62 75 74 20 69 73 20 65 78 70 65 63 74 65 64   but is expected
40d0: 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20   to do nothing. 
40e0: 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70   The.** noopStep
40f0: 46 75 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Func() is never 
4100: 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69  called, and so i
4110: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
4120: 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c   NO_TEST to.** l
4130: 65 74 20 74 68 65 20 74 65 73 74 20 63 6f 76 65  et the test cove
4140: 72 61 67 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  rage routine kno
4150: 77 20 6e 6f 74 20 74 6f 20 65 78 70 65 63 74 20  w not to expect 
4160: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
4170: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a   be.** invoked..
4180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4190: 6f 6f 70 53 74 65 70 46 75 6e 63 28 20 20 20 20  oopStepFunc(    
41a0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71  /*NO_TEST*/.  sq
41b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
41c0: 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  ,        /*NO_TE
41d0: 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  ST*/.  int n,   
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4210: 61 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f  a          /*NO_
4220: 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20  TEST*/.){       
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
4250: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4260: 45 52 28 70 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(p);       /*N
4270: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
4280: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 20  D_PARAMETER(n); 
4290: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
42a0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
42b0: 45 54 45 52 28 61 29 3b 20 20 20 20 20 20 20 2f  ETER(a);       /
42c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61 73 73  *NO_TEST*/.  ass
42d0: 65 72 74 28 30 29 3b 20 20 20 20 20 20 20 20 20  ert(0);         
42e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
42f0: 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20 20 20  T*/.}           
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73 74 61   /*NO_TEST*/.sta
4320: 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56 61 6c  tic void noopVal
4330: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
4340: 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55 4e 55 53  ontext *p){ UNUS
4350: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
4360: 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a 0a 2f 2a   /*no-op*/ }../*
4370: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
4380: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
4390: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
43a0: 3a 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  : xStep, xFinal,
43b0: 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20  .** xValue, and 
43c0: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66  xInverse */.#def
43d0: 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c  ine WINDOWFUNCAL
43e0: 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72  L(name,nArg,extr
43f0: 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c         \.  nArg,
4420: 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51   (SQLITE_UTF8|SQ
4430: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
4440: 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20  |extra), 0, 0,  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
4470: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
4480: 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20  # FinalizeFunc, 
4490: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
44a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44b0: 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76   \.  name ## Inv
44c0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61  Func, name ## Na
44d0: 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20  me, {0}         
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4500: 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e  }../* Window fun
4510: 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
4520: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
4530: 67 20 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74  g bytecode and t
4540: 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f  hus have.** no-o
4550: 70 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  p routines for t
4560: 68 65 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  heir methods */.
4570: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55  #define WINDOWFU
4580: 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67  NCNOOP(name,nArg
4590: 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20  ,extra) {       
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
45c0: 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46  Arg, (SQLITE_UTF
45d0: 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  8|SQLITE_FUNC_WI
45e0: 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20  NDOW|extra), 0, 
45f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4600: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
4610: 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61  StepFunc, noopVa
4620: 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c  lueFunc, noopVal
4630: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65       \.  noopSte
4660: 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e  pFunc, name ## N
4670: 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20  ame, {0}        
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77    \.}../* Window
46b0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
46c0: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
46d0: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
46e0: 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f  , the.** same ro
46f0: 75 74 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c  utine for xFinal
4700: 69 7a 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61  ize and xValue a
4710: 6e 64 20 77 68 69 63 68 20 6e 65 76 65 72 20 63  nd which never c
4720: 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e  all.** xInverse.
4730: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44   */.#define WIND
4740: 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72  OWFUNCX(name,nAr
4750: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4780: 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45  .  nArg, (SQLITE
4790: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8|SQLITE_FUN
47a0: 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c  C_WINDOW|extra),
47b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
47d0: 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63  name ## StepFunc
47e0: 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46  , name ## ValueF
47f0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
4800: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4810: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f           \.  noo
4820: 70 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20  pStepFunc, name 
4830: 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20  ## Name, {0}    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
4870: 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65  * Register those
4880: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4890: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
48a0: 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67  are not also agg
48b0: 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64  regates..*/.void
48c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75   sqlite3WindowFu
48d0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
48e0: 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20   static FuncDef 
48f0: 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d  aWindowFuncs[] =
4900: 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e   {.    WINDOWFUN
4910: 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  CX(row_number, 0
4920: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4930: 46 55 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b  FUNCX(dense_rank
4940: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
4950: 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30  DOWFUNCX(rank, 0
4960: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4970: 46 55 4e 43 41 4c 4c 28 70 65 72 63 65 6e 74 5f  FUNCALL(percent_
4980: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
4990: 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 63   WINDOWFUNCALL(c
49a0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 30 29 2c  ume_dist, 0, 0),
49b0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49c0: 4c 4c 28 6e 74 69 6c 65 2c 20 31 2c 20 30 29 2c  LL(ntile, 1, 0),
49d0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49e0: 4c 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31  LL(last_value, 1
49f0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4a00: 46 55 4e 43 41 4c 4c 28 6e 74 68 5f 76 61 6c 75  FUNCALL(nth_valu
4a10: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
4a20: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 66 69 72 73  NDOWFUNCALL(firs
4a30: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
4a40: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a50: 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c 0a  OP(lead, 1, 0),.
4a60: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a70: 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 0a  OP(lead, 2, 0),.
4a80: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a90: 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c 0a  OP(lead, 3, 0),.
4aa0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4ab0: 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a 20  OP(lag, 1, 0),. 
4ac0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
4ad0: 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20 20  P(lag, 2, 0),.  
4ae0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50    WINDOWFUNCNOOP
4af0: 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d  (lag, 3, 0),.  }
4b00: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72  ;.  sqlite3Inser
4b10: 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57  tBuiltinFuncs(aW
4b20: 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61  indowFuncs, Arra
4b30: 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e  ySize(aWindowFun
4b40: 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  cs));.}..static 
4b50: 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46 69  Window *windowFi
4b60: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4b70: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c  , Window *pList,
4b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4b90: 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  me){.  Window *p
4ba0: 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
4bb0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69   p; p=p->pNextWi
4bc0: 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  n){.    if( sqli
4bd0: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4be0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
4bf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
4c00: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
4c10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c20: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 77  arse, "no such w
4c30: 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61 6d  indow: %s", zNam
4c40: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4c50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
4c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4c70: 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
4c80: 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   after resolving
4c90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
4ca0: 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64  me.** for a wind
4cb0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
4cc0: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
4cd0: 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20  ement. Argument 
4ce0: 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69  pList is a.** li
4cf0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e  nked list of WIN
4d00: 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  DOW definitions 
4d10: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
4d20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4d30: 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46  ..** Argument pF
4d40: 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63 74  unc is the funct
4d50: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a  ion definition j
4d60: 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64  ust resolved and
4d70: 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20   pWin.** is the 
4d80: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65  Window object re
4d90: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61  presenting the a
4da0: 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63  ssociated OVER c
4db0: 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66  lause. This.** f
4dc0: 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
4dd0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4de0: 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  pWin as follows:
4df0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
4e00: 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65  e OVER clause re
4e10: 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64  fered to a named
4e20: 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22   window (as in "
4e30: 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22  max(x) OVER win"
4e40: 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68  ),.**     search
4e50: 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20   list pList for 
4e60: 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f  a matching WINDO
4e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e  W definition, an
4e80: 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a  d update pWin.**
4e90: 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79       accordingly
4ea0: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e  . If no such WIN
4eb0: 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62  DOW clause can b
4ec0: 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61  e found, leave a
4ed0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69  n error.**     i
4ee0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  n pParse..**.** 
4ef0: 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74    * If the funct
4f00: 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69  ion is a built-i
4f10: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
4f20: 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  n that requires 
4f30: 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  the.**     windo
4f40: 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20  w to be coerced 
4f50: 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57  (see "BUILT-IN W
4f60: 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22  INDOW FUNCTIONS"
4f70: 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20   at the top.**  
4f80: 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29     of this file)
4f90: 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74 65  , pWin is update
4fa0: 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d here..*/.void 
4fb0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64  sqlite3WindowUpd
4fc0: 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ate(.  Parse *pP
4fd0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
4fe0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
5000: 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77   of named window
5010: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
5020: 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70  T */.  Window *p
5030: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
5040: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5050: 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65   frame to update
5060: 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70   */.  FuncDef *p
5070: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Func            
5080: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
5090: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
50a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ion */.){.  if( 
50b0: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70  pWin->zName && p
50c0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 30  Win->eFrmType==0
50d0: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
50e0: 70 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70  p = windowFind(p
50f0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57  Parse, pList, pW
5100: 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  in->zName);.    
5110: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5120: 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  n;.    pWin->pPa
5130: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
5140: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
5150: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72  rse->db, p->pPar
5160: 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
5170: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
5180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5190: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
51a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  p->pOrderBy, 0);
51b0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72  .    pWin->pStar
51c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
51d0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
51e0: 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
51f0: 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73    pWin->pEnd = s
5200: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
5210: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e  arse->db, p->pEn
5220: 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  d, 0);.    pWin-
5230: 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
5240: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
5250: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
5260: 20 20 20 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70     pWin->eFrmTyp
5270: 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79 70 65 3b  e = p->eFrmType;
5280: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5290: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
52a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
52b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
52c0: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
52d0: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
52e0: 66 28 20 28 70 57 69 6e 2d 3e 65 46 72 6d 54 79  f( (pWin->eFrmTy
52f0: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20  pe==TK_RANGE).  
5300: 20 26 26 20 28 70 57 69 6e 2d 3e 70 53 74 61 72   && (pWin->pStar
5310: 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29  t || pWin->pEnd)
5320: 20 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70   .   && (pWin->p
5330: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57  OrderBy==0 || pW
5340: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
5350: 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20  xpr!=1).  ){.   
5360: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5370: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5380: 22 52 41 4e 47 45 20 77 69 74 68 20 6f 66 66 73  "RANGE with offs
5390: 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c  et PRECEDING/FOL
53a0: 4c 4f 57 49 4e 47 20 72 65 71 75 69 72 65 73 20  LOWING requires 
53b0: 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  one ORDER BY exp
53c0: 72 65 73 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a  ression".    );.
53d0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 46    }else.  if( pF
53e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
53f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
5400: 44 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DOW ){.    sqlit
5410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5420: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69  >db;.    if( pWi
5430: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5450: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
5460: 20 20 20 20 20 20 20 22 46 49 4c 54 45 52 20 63         "FILTER c
5470: 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62  lause may only b
5480: 65 20 75 73 65 64 20 77 69 74 68 20 61 67 67 72  e used with aggr
5490: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
54a0: 63 74 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b  ctions".      );
54b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
54c0: 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 55    struct WindowU
54d0: 70 64 61 74 65 20 7b 0a 20 20 20 20 20 20 20 20  pdate {.        
54e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
54f0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
5500: 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 20  FrmType;.       
5510: 20 69 6e 74 20 65 53 74 61 72 74 3b 0a 20 20 20   int eStart;.   
5520: 20 20 20 20 20 69 6e 74 20 65 45 6e 64 3b 0a 20       int eEnd;. 
5530: 20 20 20 20 20 7d 20 61 55 70 5b 5d 20 3d 20 7b       } aUp[] = {
5540: 0a 20 20 20 20 20 20 20 20 7b 20 72 6f 77 5f 6e  .        { row_n
5550: 75 6d 62 65 72 4e 61 6d 65 2c 20 20 20 54 4b 5f  umberName,   TK_
5560: 52 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  ROWS,   TK_UNBOU
5570: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
5580: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 64   }, .        { d
5590: 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 2c 20 20  ense_rankName,  
55a0: 20 54 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55   TK_RANGE,  TK_U
55b0: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
55c0: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20  RENT }, .       
55d0: 20 7b 20 72 61 6e 6b 4e 61 6d 65 2c 20 20 20 20   { rankName,    
55e0: 20 20 20 20 20 54 4b 5f 52 41 4e 47 45 2c 20 20       TK_RANGE,  
55f0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5600: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
5610: 20 20 20 20 20 7b 20 70 65 72 63 65 6e 74 5f 72       { percent_r
5620: 61 6e 6b 4e 61 6d 65 2c 20 54 4b 5f 47 52 4f 55  ankName, TK_GROU
5630: 50 53 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20  PS, TK_CURRENT, 
5640: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d    TK_UNBOUNDED }
5650: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 63 75 6d  , .        { cum
5660: 65 5f 64 69 73 74 4e 61 6d 65 2c 20 20 20 20 54  e_distName,    T
5670: 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 46 4f 4c  K_GROUPS, TK_FOL
5680: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
5690: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
56a0: 20 7b 20 6e 74 69 6c 65 4e 61 6d 65 2c 20 20 20   { ntileName,   
56b0: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
56c0: 54 4b 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b  TK_CURRENT,   TK
56d0: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
56e0: 20 20 20 20 20 20 20 7b 20 6c 65 61 64 4e 61 6d         { leadNam
56f0: 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  e,         TK_RO
5700: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
5710: 45 44 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  ED, TK_UNBOUNDED
5720: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6c   }, .        { l
5730: 61 67 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  agName,         
5740: 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 55   TK_ROWS,   TK_U
5750: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
5760: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 7d  RENT }, .      }
5770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5780: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5790: 41 72 72 61 79 53 69 7a 65 28 61 55 70 29 3b 20  ArraySize(aUp); 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
57b0: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
57c0: 61 55 70 5b 69 5d 2e 7a 46 75 6e 63 20 29 7b 0a  aUp[i].zFunc ){.
57d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
57e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
57f0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
5800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5820: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
5830: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64        pWin->pEnd
5840: 20 3d 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20   = pWin->pStart 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
5860: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20  Win->eFrmType = 
5870: 61 55 70 5b 69 5d 2e 65 46 72 6d 54 79 70 65 3b  aUp[i].eFrmType;
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5890: 3e 65 53 74 61 72 74 20 3d 20 61 55 70 5b 69 5d  >eStart = aUp[i]
58a0: 2e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  .eStart;.       
58b0: 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20     pWin->eEnd = 
58c0: 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20 20 20  aUp[i].eEnd;.   
58d0: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 78         pWin->eEx
58e0: 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
58f0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65       if( pWin->e
5900: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
5910: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
5920: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
5930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
5940: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 31  , TK_INTEGER, "1
5950: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
5960: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5980: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
5990: 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  Win->pFunc = pFu
59a0: 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  nc;.}../*.** Con
59b0: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
59c0: 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74  ed through sqlit
59d0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29  e3WalkExprList()
59e0: 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e   to.** selectWin
59f0: 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62  dowRewriteExprCb
5a00: 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  () by selectWind
5a10: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5a30: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
5a40: 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b  e WindowRewrite;
5a50: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65  .struct WindowRe
5a60: 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77  write {.  Window
5a70: 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73   *pWin;.  SrcLis
5a80: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
5a90: 69 73 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c  ist *pSub;.  Sel
5aa0: 65 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b  ect *pSubSelect;
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 43 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65  Current sub-sele
5ad0: 63 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b  ct, if any */.};
5ae0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
5af0: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
5b00: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
5b10: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66  writeEList(). If
5b20: 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74   necessary,.** t
5b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
5b40: 65 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ends to the outp
5b50: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
5b60: 73 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a  st and updates .
5b70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a  ** expression (*
5b80: 70 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65  ppExpr) in place
5b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ba0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5bb0: 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  iteExprCb(Walker
5bc0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
5bd0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63  *pExpr){.  struc
5be0: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
5bf0: 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
5c00: 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73  pRewrite;.  Pars
5c10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
5c20: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  ker->pParse;..  
5c30: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
5c40: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
5c50: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
5c60: 61 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c  a scalar sub-sel
5c70: 65 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73  ect.  ** that us
5c80: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
5c90: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5ca0: 20 70 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79   processed, only
5cb0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b   process.  ** TK
5cc0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
5cd0: 6f 6e 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ons that refer t
5ce0: 6f 20 69 74 20 28 74 68 65 20 6f 75 74 65 72 20  o it (the outer 
5cf0: 53 45 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a  SELECT). Do.  **
5d00: 20 6e 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67   not process agg
5d10: 72 65 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f  regates or windo
5d20: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61  w functions at a
5d30: 6c 6c 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f  ll, as they belo
5d40: 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ng.  ** to the s
5d50: 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74  calar sub-select
5d60: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5d70: 53 75 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  SubSelect ){.   
5d80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
5d90: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
5da0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
5db0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
5dc0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72  e{.      int nSr
5dd0: 63 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  c = p->pSrc->nSr
5de0: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  c;.      int i;.
5df0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5e00: 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
5e10: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5e20: 69 54 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d  iTable==p->pSrc-
5e30: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
5e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5e50: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63       if( i==nSrc
5e60: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
5e70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5e80: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
5e90: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63  pr->op ){..    c
5ea0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5eb0: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
5ec0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5ed0: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
5ee0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5ef0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f00: 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57        Window *pW
5f10: 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  in;.        for(
5f20: 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57  pWin=p->pWin; pW
5f30: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
5f40: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
5f50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79      if( pExpr->y
5f60: 2e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20  .pWin==pWin ){. 
5f70: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5f80: 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d  t( pWin->pOwner=
5f90: 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  =pExpr );.      
5fa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
5fb0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
5fc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
5fe0: 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f  all through.  */
5ff0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
6000: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
6010: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
6020: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
6030: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
6040: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
6050: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
6060: 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74   p->pSub = sqlit
6070: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6080: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62  (pParse, p->pSub
6090: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
60a0: 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20  f( p->pSub ){.  
60b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
60c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
60d0: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d  xpr, EP_Static)=
60e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  =0 );.        Ex
60f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6100: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
6110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6120: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6130: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
6140: 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
6150: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6160: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
6170: 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72      memset(pExpr
6180: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6190: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ));..        pEx
61a0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
61b0: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  MN;.        pExp
61c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  r->iColumn = p->
61d0: 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  pSub->nExpr-1;. 
61e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
61f0: 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e  able = p->pWin->
6200: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d  iEphCsr;.      }
6210: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
6220: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
6230: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
6240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6250: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
6260: 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
6270: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
6280: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6290: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
62a0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
62b0: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  t){.  struct Win
62c0: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
62d0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
62e0: 69 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ite;.  Select *p
62f0: 53 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65  Save = p->pSubSe
6300: 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76  lect;.  if( pSav
6310: 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e==pSelect ){.  
6320: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6330: 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tinue;.  }else{.
6340: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
6350: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
6360: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
6370: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
6380: 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75  ect);.    p->pSu
6390: 62 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b  bSelect = pSave;
63a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
63b0: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
63c0: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
63d0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
63e0: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
63f0: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
6400: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
6410: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
6420: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
6430: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
6440: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
6450: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
6460: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
6470: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
6480: 68 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f  he .**     Windo
6490: 77 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  w list passed as
64a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
64b0: 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a  ment (pWin)..**.
64c0: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f  ** Append the no
64d0: 64 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70  de to output exp
64e0: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70  ression-list (*p
64f0: 70 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61  pSub). And repla
6500: 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20  ce it.** with a 
6510: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
6520: 65 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68  eads the (N-1)th
6530: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c   element of tabl
6540: 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68  e .** pWin->iEph
6550: 43 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  Csr, where N is 
6560: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
6570: 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75  ements in (*ppSu
6580: 62 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65  b) after.** appe
6590: 6e 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  nding the new on
65a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
65b0: 64 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  d selectWindowRe
65c0: 77 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61  writeEList(.  Pa
65d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
65e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20  Window *pWin,.  
65f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20  SrcList *pSrc,. 
6600: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6610: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
6620: 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72   /* Rewrite expr
6630: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
6640: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  list */.  ExprLi
6650: 73 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20  st **ppSub      
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
6670: 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20  OUT: Sub-select 
6680: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
6690: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73  */.){.  Walker s
66a0: 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77  Walker;.  Window
66b0: 52 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65  Rewrite sRewrite
66c0: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  ;..  memset(&sWa
66d0: 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
66e0: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Walker));.  mems
66f0: 65 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c  et(&sRewrite, 0,
6700: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65   sizeof(WindowRe
6710: 77 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77  write));..  sRew
6720: 72 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53  rite.pSub = *ppS
6730: 75 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70  ub;.  sRewrite.p
6740: 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52  Win = pWin;.  sR
6750: 65 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53  ewrite.pSrc = pS
6760: 72 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70  rc;..  sWalker.p
6770: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
6780: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
6790: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
67a0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
67b0: 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rCb;.  sWalker.x
67c0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
67d0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
67e0: 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20  riteSelectCb;.  
67f0: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69  sWalker.u.pRewri
6800: 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a  te = &sRewrite;.
6810: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
6820: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57  WalkExprList(&sW
6830: 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a  alker, pEList);.
6840: 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77  .  *ppSub = sRew
6850: 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a  rite.pSub;.}../*
6860: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70  .** Append a cop
6870: 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73  y of each expres
6880: 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69  sion in expressi
6890: 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20  on-list pAppend 
68a0: 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  to.** expression
68b0: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74   list pList. Ret
68c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
68d0: 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74   the result list
68e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
68f0: 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70  List *exprListAp
6900: 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73  pendList(.  Pars
6910: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6920: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6930: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
6940: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
6950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
6960: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
6970: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6980: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70  .  ExprList *pAp
6990: 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69  pend       /* Li
69a0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  st of values to 
69b0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
69c0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
69d0: 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20  ( pAppend ){.   
69e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
69f0: 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20  nInit = pList ? 
6a00: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
6a10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6a20: 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b  <pAppend->nExpr;
6a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
6a40: 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65  r *pDup = sqlite
6a50: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
6a60: 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b  >db, pAppend->a[
6a70: 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
6a80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6a90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6aa0: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
6ab0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
6ac0: 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d  ( pList ) pList-
6ad0: 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74  >a[nInit+i].sort
6ae0: 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d  Order = pAppend-
6af0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
6b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6b10: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
6b20: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
6b30: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
6b40: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6b50: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
6b60: 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79  ot invoke.** any
6b70: 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63   SQL window func
6b80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63  tions, this func
6b90: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6ba0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a   Otherwise, it .
6bb0: 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20  ** rewrites the 
6bc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6bd0: 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20   so that window 
6be0: 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66  function xStep f
6bf0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
6c00: 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63  invoked in the c
6c10: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20  orrect order as 
6c20: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20  described under 
6c30: 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e  "SELECT REWRITIN
6c40: 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70  G".** at the top
6c50: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
6c60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
6c70: 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65  dowRewrite(Parse
6c80: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6c90: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
6ca0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
6cb0: 28 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e  ( p->pWin && p->
6cc0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
6cd0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6ce0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  );.    sqlite3 *
6d00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6d10: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
6d20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
6d30: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
6d40: 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ry */.    SrcLis
6d50: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
6d60: 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68  c;.    Expr *pWh
6d70: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
6d80: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6d90: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
6da0: 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20  oupBy;.    Expr 
6db0: 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48  *pHaving = p->pH
6dc0: 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c  aving;.    ExprL
6dd0: 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a  ist *pSort = 0;.
6de0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6df0: 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Sublist = 0;    
6e00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6e10: 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75   list for sub-qu
6e20: 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ery */.    Windo
6e30: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
6e40: 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74  in;      /* Mast
6e50: 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  er window object
6e60: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
6e70: 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  pWin;           
6e80: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
6e90: 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
6ea0: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  */..    p->pSrc 
6eb0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  = 0;.    p->pWhe
6ec0: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  re = 0;.    p->p
6ed0: 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20  GroupBy = 0;.   
6ee0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b   p->pHaving = 0;
6ef0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6f00: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6f10: 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d  use for the sub-
6f20: 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
6f30: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
6f40: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
6f50: 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e  window PARTITION
6f60: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
6f70: 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20  auses. Then, if 
6f80: 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20  this makes it.  
6f90: 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20    ** redundant, 
6fa0: 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52  remove the ORDER
6fb0: 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72   BY from the par
6fc0: 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a  ent SELECT.  */.
6fd0: 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69      pSort = sqli
6fe0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6ff0: 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  b, pMWin->pParti
7000: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53  tion, 0);.    pS
7010: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
7020: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
7030: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
7040: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
7050: 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f  ( pSort && p->pO
7060: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
7070: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
7080: 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74  istCompare(pSort
7090: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d  , p->pOrderBy, -
70a0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
70b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
70c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
70d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
70e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
70f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7100: 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  .    /* Assign a
7110: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
7120: 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  or the ephemeral
7130: 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62   table used to b
7140: 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20  uffer rows..    
7150: 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d  ** The OpenEphem
7160: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
7170: 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c   is coded later,
7180: 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f   after it is kno
7190: 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61  wn how.    ** ma
71a0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74  ny columns the t
71b0: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20  able will have. 
71c0: 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69   */.    pMWin->i
71d0: 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d  EphCsr = pParse-
71e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61  >nTab++;.    pPa
71f0: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a  rse->nTab += 3;.
7200: 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f  .    selectWindo
7210: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50  wRewriteEList(pP
7220: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72  arse, pMWin, pSr
7230: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  c, p->pEList, &p
7240: 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65  Sublist);.    se
7250: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
7260: 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  eEList(pParse, p
7270: 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70  MWin, pSrc, p->p
7280: 4f 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69  OrderBy, &pSubli
7290: 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  st);.    pMWin->
72a0: 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53  nBufferCol = (pS
72b0: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
72c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  t->nExpr : 0);..
72d0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
72e0: 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61  e PARTITION BY a
72f0: 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  nd ORDER BY expr
7300: 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74  essions to the t
7310: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
7320: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
7330: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61  ion list. They a
7340: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  re required to f
7350: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
7360: 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69  .    ** boundari
7370: 65 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e  es for partition
7380: 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65  s and sets of pe
7390: 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f  er rows lie.  */
73a0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
73b0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
73c0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
73d0: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72  ist, pMWin->pPar
73e0: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75  tition);.    pSu
73f0: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
7400: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
7410: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
7420: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a  in->pOrderBy);..
7430: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
7440: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
7450: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
7460: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
7470: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
7480: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
7490: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
74a0: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
74b0: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
74c0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
74d0: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
74e0: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
74f0: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
7500: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
7510: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
7520: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
7530: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
7540: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
7550: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
7560: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
7570: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
7580: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
7590: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
75a0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75b0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
75c0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
75d0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
75e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  r ){.        Exp
75f0: 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  r *pFilter = sql
7600: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7610: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30  pWin->pFilter, 0
7620: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c  );.        pSubl
7630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
7640: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7650: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46  se, pSublist, pF
7660: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
7670: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
7680: 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ccum = ++pParse-
7690: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69  >nMem;.      pWi
76a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b  n->regResult = +
76b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
76e0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
76f0: 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ccum);.    }..  
7700: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7710: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
7720: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61  PARTITION BY cla
7730: 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e  use, and the win
7740: 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  dow.    ** funct
7750: 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f  ion accepts zero
7760: 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20   arguments, and 
7770: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
7780: 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  er columns.    *
7790: 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e  * selected (e.g.
77a0: 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d   "SELECT row_num
77b0: 62 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52  ber() OVER () FR
77c0: 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70  OM t1"), it is p
77d0: 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74  ossible.    ** t
77e0: 68 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20  hat pSublist is 
77f0: 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e  still NULL here.
7800: 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20   Add a constant 
7810: 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20  expression here 
7820: 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20  to .    ** keep 
7830: 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c  everything legal
7840: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a   in this case. .
7850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
7860: 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Sublist==0 ){.  
7870: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73      pSublist = s
7880: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7890: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
78a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
78b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
78c0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
78d0: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
78e0: 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
78f0: 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20    }..    pSub = 
7900: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
7910: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
7920: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63  , pSublist, pSrc
7930: 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
7940: 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f  By, pHaving, pSo
7950: 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  rt, 0, 0.    );.
7960: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71      p->pSrc = sq
7970: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
7980: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
7990: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
79a0: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  pSrc ){.      p-
79b0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
79c0: 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20  ect = pSub;.    
79d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
79e0: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
79f0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
7a00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7a10: 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28  3ExpandSubquery(
7a20: 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63  pParse, &p->pSrc
7a30: 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ->a[0]) ){.     
7a40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7a50: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
7a60: 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  e{.        pSub-
7a70: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
7a80: 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20  Expanded;.      
7a90: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
7aa0: 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
7ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7ac0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7ad0: 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20  , pSub, 0);.    
7ae0: 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
7af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7b00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7b10: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7b20: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
7b30: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7b40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7b50: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
7b60: 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57  ->iEphCsr+1, pMW
7b70: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7ba0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
7bb0: 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+2, pMWin->iE
7bc0: 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71  phCsr);.      sq
7bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7be0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7bf0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c  MWin->iEphCsr+3,
7c00: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7c30: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29  Delete(db, pSub)
7c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7c50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c60: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
7c70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
7c80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7c90: 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77   Free the Window
7ca0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
7cb0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7cc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7cd0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7ce0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7cf0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66  Window *p){.  if
7d00: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
7d10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7d20: 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20   p->pFilter);.  
7d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7d40: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
7d50: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
7d60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7d70: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
7d80: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
7d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7da0: 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  , p->pEnd);.    
7db0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7dc0: 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29  e(db, p->pStart)
7dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7de0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ree(db, p->zName
7df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
7e00: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73  Free(db, p->zBas
7e10: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
7e20: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
7e40: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
7e50: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
7e60: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
7e70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7e90: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
7ea0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7eb0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
7ec0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
7ed0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
7ee0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
7ef0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7f00: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
7f10: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
7f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
7f30: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
7f40: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
7f50: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
7f60: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
7f70: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
7f80: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
7f90: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
7fa0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
7fb0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
7fc0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
7fd0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
7fe0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
7ff0: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
8000: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
8010: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
8020: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
8030: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
8040: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
8050: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
8070: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
8080: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
8090: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
80a0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
80b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
80c0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
80d0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
80e0: 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74  E_OBJECT ) sqlit
80f0: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8100: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
8110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8120: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8130: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
8140: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8150: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
8160: 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
8170: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
8180: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
8190: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
81a0: 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64  eturn a new Wind
81b0: 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  ow object descri
81c0: 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65  bing a Window De
81d0: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e  finition..*/.Win
81e0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
81f0: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
8200: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8210: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8220: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20  */.  int eType, 
8230: 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
8240: 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 2c 20  type. TK_RANGE, 
8250: 54 4b 5f 52 4f 57 53 2c 20 54 4b 5f 47 52 4f 55  TK_ROWS, TK_GROU
8260: 50 53 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 69 6e  PS, or 0 */.  in
8270: 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20  t eStart,       
8280: 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43  /* Start type: C
8290: 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e  URRENT, PRECEDIN
82a0: 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e  G, FOLLOWING, UN
82b0: 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70  BOUNDED */.  Exp
82c0: 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  r *pStart,     /
82d0: 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73  * Start window s
82e0: 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44  ize if TK_PRECED
82f0: 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47  ING or FOLLOWING
8300: 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20   */.  int eEnd, 
8310: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74          /* End t
8320: 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f  ype: CURRENT, FO
8330: 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f  LLOWING, TK_UNBO
8340: 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47  UNDED, PRECEDING
8350: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64   */.  Expr *pEnd
8360: 2c 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77  ,       /* End w
8370: 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b  indow size if TK
8380: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52  _FOLLOWING or PR
8390: 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 75 38 20  ECEDING */.  u8 
83a0: 65 45 78 63 6c 75 64 65 20 20 20 20 20 20 20 2f  eExclude       /
83b0: 2a 20 45 58 43 4c 55 44 45 20 63 6c 61 75 73 65  * EXCLUDE clause
83c0: 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
83d0: 2a 70 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  *pWin = 0;.  int
83e0: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
83f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  = 0;..  /* Parse
8400: 72 20 61 73 73 75 72 65 73 20 74 68 65 20 66 6f  r assures the fo
8410: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73  llowing: */.  as
8420: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c  sert( eType==0 |
8430: 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  | eType==TK_RANG
8440: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  E || eType==TK_R
8450: 4f 57 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  OWS || eType==TK
8460: 5f 47 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73  _GROUPS );.  ass
8470: 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f  ert( eStart==TK_
8480: 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72  CURRENT || eStar
8490: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a  t==TK_PRECEDING.
84a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53             || eS
84b0: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
84c0: 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b  ED || eStart==TK
84d0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20  _FOLLOWING );.  
84e0: 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b  assert( eEnd==TK
84f0: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64  _CURRENT || eEnd
8500: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20  ==TK_FOLLOWING. 
8510: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e            || eEn
8520: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
8530: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
8540: 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72  EDING );.  asser
8550: 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50  t( (eStart==TK_P
8560: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61  RECEDING || eSta
8570: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
8580: 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29  )==(pStart!=0) )
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 45 6e  ;.  assert( (eEn
85a0: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
85b0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
85c0: 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30  EDING)==(pEnd!=0
85d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ) );..  if( eTyp
85e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70  e==0 ){.    bImp
85f0: 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a  licitFrame = 1;.
8600: 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52      eType = TK_R
8610: 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ANGE;.  }..  /* 
8620: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
8630: 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20  e.  ** starting 
8640: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61  boundary type ma
8650: 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c  y not occur earl
8660: 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ier in the follo
8670: 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20  wing list than. 
8680: 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62   ** the ending b
8690: 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20  oundary type:.  
86a0: 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e  **.  **   UNBOUN
86b0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20  DED PRECEDING.  
86c0: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43  **   <expr> PREC
86d0: 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52  EDING.  **   CUR
86e0: 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20  RENT ROW.  **   
86f0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
8700: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
8710: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
8720: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72  .  ** The parser
8730: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22 55   ensures that "U
8740: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8750: 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  NG" cannot be us
8760: 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a  ed as an ending.
8770: 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61    ** boundary, a
8780: 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44  nd than "UNBOUND
8790: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61  ED FOLLOWING" ca
87a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20  nnot be used as 
87b0: 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  a starting.  ** 
87c0: 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a  frame boundary..
87d0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61    */.  if( (eSta
87e0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
87f0: 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  & eEnd==TK_PRECE
8800: 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74  DING).   || (eSt
8810: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
8820: 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50  G && (eEnd==TK_P
8830: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64  RECEDING || eEnd
8840: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20  ==TK_CURRENT)). 
8850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8860: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8870: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61  "unsupported fra
8880: 6d 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  me specification
8890: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e  ");.    goto win
88a0: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d  dowAllocErr;.  }
88b0: 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64  ..  pWin = (Wind
88c0: 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  ow*)sqlite3DbMal
88d0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
88e0: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
88f0: 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d  w));.  if( pWin=
8900: 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77  =0 ) goto window
8910: 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e  AllocErr;.  pWin
8920: 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 65 54 79  ->eFrmType = eTy
8930: 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61  pe;.  pWin->eSta
8940: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70  rt = eStart;.  p
8950: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64  Win->eEnd = eEnd
8960: 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75 64 65  ;.  if( eExclude
8970: 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  ==0 && Optimizat
8980: 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
8990: 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 57  se->db, SQLITE_W
89a0: 69 6e 64 6f 77 46 75 6e 63 29 20 29 7b 0a 20 20  indowFunc) ){.  
89b0: 20 20 65 45 78 63 6c 75 64 65 20 3d 20 54 4b 5f    eExclude = TK_
89c0: 4e 4f 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e  NO;.  }.  pWin->
89d0: 65 45 78 63 6c 75 64 65 20 3d 20 65 45 78 63 6c  eExclude = eExcl
89e0: 75 64 65 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d  ude;.  pWin->bIm
89f0: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 62 49  plicitFrame = bI
8a00: 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20 20  mplicitFrame;.  
8a10: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
8a20: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
8a30: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 6e  Expr(pParse, pEn
8a40: 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61  d);.  pWin->pSta
8a50: 72 74 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  rt = sqlite3Wind
8a60: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
8a70: 72 73 65 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  rse, pStart);.  
8a80: 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69  return pWin;..wi
8a90: 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20  ndowAllocErr:.  
8aa0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8ab0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  e(pParse->db, pE
8ac0: 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  nd);.  sqlite3Ex
8ad0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
8ae0: 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  >db, pStart);.  
8af0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8b00: 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54 49 54  ** Attach PARTIT
8b10: 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
8b20: 20 63 6c 61 75 73 65 73 20 70 50 61 72 74 69 74   clauses pPartit
8b30: 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72 42 79  ion and pOrderBy
8b40: 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57   to window.** pW
8b50: 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61 72  in. Also, if par
8b60: 61 6d 65 74 65 72 20 70 42 61 73 65 20 69 73 20  ameter pBase is 
8b70: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57  not NULL, set pW
8b80: 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68 65  in->zBase to the
8b90: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  .** equivalent n
8ba0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
8bb0: 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ring..*/.Window 
8bc0: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73  *sqlite3WindowAs
8bd0: 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73 65 20  semble(.  Parse 
8be0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
8bf0: 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70  ow *pWin, .  Exp
8c00: 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74 69 6f  rList *pPartitio
8c10: 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  n, .  ExprList *
8c20: 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b  pOrderBy, .  Tok
8c30: 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69  en *pBase.){.  i
8c40: 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70  f( pWin ){.    p
8c50: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
8c60: 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  = pPartition;.  
8c70: 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79    pWin->pOrderBy
8c80: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
8c90: 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a 20 20   if( pBase ){.  
8ca0: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
8cb0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
8cc0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
8cd0: 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e  Base->z, pBase->
8ce0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
8cf0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
8d00: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
8d10: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 74  rse->db, pPartit
8d20: 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ion);.    sqlite
8d30: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8d40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
8d50: 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  erBy);.  }.  ret
8d60: 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn pWin;.}../*.
8d70: 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20  ** Window *pWin 
8d80: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
8d90: 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57 49 4e  eated from a WIN
8da0: 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e  DOW clause. Tokn
8db0: 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20 74 68  e pBase.** is th
8dc0: 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e 20 45  e base window. E
8dd0: 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73 20 66  arlier windows f
8de0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57 49 4e  rom the same WIN
8df0: 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65 0a 2a  DOW clause are.*
8e00: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
8e10: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
8e20: 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e  ting at pWin->pN
8e30: 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66 75 6e  extWin. This fun
8e40: 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20  ction.** either 
8e50: 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20 61 63  updates *pWin ac
8e60: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 62  cording to the b
8e70: 61 73 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  ase specificatio
8e80: 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65  n, or else.** le
8e90: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  aves an error in
8ea0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
8eb0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68   sqlite3WindowCh
8ec0: 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ain(Parse *pPars
8ed0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c  e, Window *pWin,
8ee0: 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b   Window *pList){
8ef0: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61  .  if( pWin->zBa
8f00: 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  se ){.    sqlite
8f10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8f20: 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  db;.    Window *
8f30: 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f 77 46  pExist = windowF
8f40: 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ind(pParse, pLis
8f50: 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b  t, pWin->zBase);
8f60: 0a 20 20 20 20 69 66 28 20 70 45 78 69 73 74 20  .    if( pExist 
8f70: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
8f80: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
8f90: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f       /* Check fo
8fa0: 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  r errors */.    
8fb0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61 72    if( pWin->pPar
8fc0: 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  tition ){.      
8fd0: 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54 49 54    zErr = "PARTIT
8fe0: 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20 20  ION clause";.   
8ff0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
9000: 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ist->pOrderBy &&
9010: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20   pWin->pOrderBy 
9020: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
9030: 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  = "ORDER BY clau
9040: 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se";.      }else
9050: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62 49 6d   if( pExist->bIm
9060: 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30 20 29  plicitFrame==0 )
9070: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
9080: 20 22 66 72 61 6d 65 20 73 70 65 63 69 66 69 63   "frame specific
9090: 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a  ation";.      }.
90a0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
90b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
90c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
90d0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
90e0: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
90f0: 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73  %s of window: %s
9100: 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a  ", zErr, pWin->z
9110: 42 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Base.        );.
9120: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9130: 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74       pWin->pPart
9140: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
9150: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
9160: 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74 69 6f  Exist->pPartitio
9170: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  n, 0);.        i
9180: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
9190: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
91a0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
91b0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
91c0: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f          pWin->pO
91d0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
91e0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
91f0: 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79  pExist->pOrderBy
9200: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
9210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
9220: 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e  bFree(db, pWin->
9230: 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  zBase);.        
9240: 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b  pWin->zBase = 0;
9250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9260: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61   }.}../*.** Atta
9270: 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  ch window object
9280: 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73   pWin to express
9290: 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ion p..*/.void s
92a0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61  qlite3WindowAtta
92b0: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
92c0: 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f  , Expr *p, Windo
92d0: 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20  w *pWin){.  if( 
92e0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
92f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
9300: 49 4f 4e 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ION );.    /* Th
9310: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
9320: 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ly called for th
9330: 65 20 70 61 72 73 65 72 2e 20 20 49 66 20 70 57  e parser.  If pW
9340: 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  in was not.    *
9350: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75 65 20  * allocated due 
9360: 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65 6e 20  to an OOM, then 
9370: 74 68 65 20 70 61 72 73 65 72 20 77 6f 75 6c 64  the parser would
9380: 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65 76 65   fail before eve
9390: 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 69 6e  r.    ** invokin
93a0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  g this routine *
93b0: 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  /.    if( ALWAYS
93c0: 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  (pWin) ){.      
93d0: 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e  p->y.pWin = pWin
93e0: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 50  ;.      ExprSetP
93f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
9400: 6e 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 70 57  nFunc);.      pW
9410: 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a  in->pOwner = p;.
9420: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
9430: 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
9440: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9450: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9460: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  se,.           "
9470: 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74 20  DISTINCT is not 
9480: 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77 69  supported for wi
9490: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22 29  ndow functions")
94a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
94b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
94c0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
94d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 69  (pParse->db, pWi
94e0: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
94f0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
9500: 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65   two window obje
9510: 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  cts are identica
9520: 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  l, or non-zero o
9530: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65  therwise..** Ide
9540: 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62  ntical window ob
9550: 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f  jects can be pro
9560: 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67  cessed in a sing
9570: 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20  le scan..*/.int 
9580: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
9590: 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
95a0: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20  se, Window *p1, 
95b0: 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69  Window *p2){.  i
95c0: 66 28 20 70 31 2d 3e 65 46 72 6d 54 79 70 65 21  f( p1->eFrmType!
95d0: 3d 70 32 2d 3e 65 46 72 6d 54 79 70 65 20 29 20  =p2->eFrmType ) 
95e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
95f0: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
9600: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
9610: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
9620: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
9630: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
9640: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 70 32 2d 3e  ->eExclude!=p2->
9650: 65 45 78 63 6c 75 64 65 20 29 20 72 65 74 75 72  eExclude ) retur
9660: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
9670: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
9680: 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74  arse, p1->pStart
9690: 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31  , p2->pStart, -1
96a0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
96b0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
96c0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
96d0: 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e  1->pEnd, p2->pEn
96e0: 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  d, -1) ) return 
96f0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9700: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
9710: 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p1->pPartition, 
9720: 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p2->pPartition, 
9730: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9740: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9750: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
9760: 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70  >pOrderBy, p2->p
9770: 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72  OrderBy, -1) ) r
9780: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
9790: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
97a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79  his is called by
97b0: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
97c0: 63 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c  c before it call
97d0: 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  s sqlite3WhereBe
97e0: 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69  gin().** to begi
97f0: 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
9800: 75 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72  ugh the sub-quer
9810: 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73  y results. It is
9820: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
9830: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
9840: 69 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ize registers an
9850: 64 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62  d cursors used b
9860: 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  y sqlite3WindowC
9870: 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  odeStep()..*/.vo
9880: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
9890: 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a  CodeInit(Parse *
98a0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
98b0: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
98c0: 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a   *pWin;.  Vdbe *
98d0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
98e0: 62 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  be(pParse);..  /
98f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
9900: 74 65 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ters to use for 
9910: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 76 61 6c  PARTITION BY val
9920: 75 65 73 2c 20 69 66 20 61 6e 79 2e 20 49 6e 69  ues, if any. Ini
9930: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 73 61 69  tialize.  ** sai
9940: 64 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 4e  d registers to N
9950: 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
9960: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
9970: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70   ){.    int nExp
9980: 72 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  r = pMWin->pPart
9990: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
99a0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74    pMWin->regPart
99b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
99c0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
99d0: 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 3b 0a 20 20  Mem += nExpr;.  
99e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
99f0: 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
9a00: 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  0, pMWin->regPar
9a10: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
9a20: 74 2b 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a  t+nExpr-1);.  }.
9a30: 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65  .  pMWin->regOne
9a40: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
9a50: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
9a60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9a70: 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e  eger, 1, pMWin->
9a80: 72 65 67 4f 6e 65 29 3b 0a 0a 20 20 69 66 28 20  regOne);..  if( 
9a90: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20  pMWin->eExclude 
9aa0: 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65  ){.    pMWin->re
9ab0: 67 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b  gStartRowid = ++
9ac0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9ad0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52    pMWin->regEndR
9ae0: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
9af0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e  >nMem;.    pMWin
9b00: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
9b10: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
9b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9b30: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9b40: 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
9b50: 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  rtRowid);.    sq
9b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9b70: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
9b80: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
9b90: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
9ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9bb0: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69  OP_OpenDup, pMWi
9bc0: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9bd0: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9be0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
9bf0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
9c00: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
9c10: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
9c20: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
9c30: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
9c40: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
9c50: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9c60: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
9c70: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
9c80: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ED ){.      /* T
9c90: 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f  he inline versio
9ca0: 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20  ns of min() and 
9cb0: 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20  max() require a 
9cc0: 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c  single ephemeral
9cd0: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
9ce0: 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e  and 3 registers.
9cf0: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
9d00: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
9d10: 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
9d20: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30     **   regApp+0
9d30: 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d  : slot to copy m
9d40: 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d  in()/max() argum
9d50: 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52  ent to for MakeR
9d60: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20  ecord.      **  
9d70: 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67   regApp+1: integ
9d80: 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f  er value used to
9d90: 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65   ensure keys are
9da0: 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a   unique.      **
9db0: 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74     regApp+2: out
9dc0: 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72  put of MakeRecor
9dd0: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  d.      */.     
9de0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9df0: 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d   = pWin->pOwner-
9e00: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
9e10: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
9e20: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9e30: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
9e40: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c  Parse, pList, 0,
9e50: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d   0);.      pWin-
9e60: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
9e70: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
9e80: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
9e90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9ea0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9eb0: 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66  m += 3;.      if
9ec0: 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57  ( pKeyInfo && pW
9ed0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9ee0: 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  [1]=='i' ){.    
9ef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
9f00: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9f10: 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
9f20: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
9f30: 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20  tOrder[0] = 1;. 
9f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9f50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9f60: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
9f70: 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  al, pWin->csrApp
9f80: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
9f90: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
9fa0: 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  v, pKeyInfo, P4_
9fb0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
9fc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9fd0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9fe0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
9ff0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  +1);.    }.    e
a000: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
a010: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20  ==nth_valueName 
a020: 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  || p->zName==fir
a030: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  st_valueName ){.
a040: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
a050: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
a060: 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e  at pWin->regApp.
a070: 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75   These will be u
a080: 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  sed to.      ** 
a090: 73 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20  store the start 
a0a0: 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66  and end index of
a0b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
a0c0: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 57  me.  */.      pW
a0d0: 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61  in->regApp = pPa
a0e0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a0f0: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
a100: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a110: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a120: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
a130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a140: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
a150: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a160: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
a170: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
a180: 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  if( p->zName==le
a190: 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61  adName || p->zNa
a1a0: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20  me==lagName ){. 
a1b0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
a1c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a1d0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
a1e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a1f0: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d  P_OpenDup, pWin-
a200: 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e  >csrApp, pMWin->
a210: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a  iEphCsr);.    }.
a220: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    }.}..#define W
a230: 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49  INDOW_STARTING_I
a240: 4e 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49  NT  0.#define WI
a250: 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20  NDOW_ENDING_INT 
a260: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e     1.#define WIN
a270: 44 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e  DOW_NTH_VALUE_IN
a280: 54 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  T 2.#define WIND
a290: 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20  OW_STARTING_NUM 
a2a0: 20 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   3.#define WINDO
a2b0: 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20  W_ENDING_NUM    
a2c0: 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  4../*.** A "PREC
a2d0: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  EDING <expr>" (e
a2e0: 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c  Cond==0) or "FOL
a2f0: 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  LOWING <expr>" (
a300: 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65  eCond==1) or the
a310: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
a320: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a330: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20   to nth_value() 
a340: 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a  (eCond==2) has j
a350: 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c  ust been.** eval
a360: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
a370: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
a380: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
a390: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
a3a0: 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f  es VM.** code to
a3b0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
a3c0: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
a3d0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
a3e0: 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a  and throws an.**
a3f0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
a400: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
a410: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
a420: 65 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a  eckValue(Parse *
a430: 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c  pParse, int reg,
a440: 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73   int eCond){.  s
a450: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a460: 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20   *azErr[] = {.  
a470: 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e    "frame startin
a480: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
a490: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
a4a0: 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66  integer",.    "f
a4b0: 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73  rame ending offs
a4c0: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
a4d0: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
a4e0: 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20  r",.    "second 
a4f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f  argument to nth_
a500: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20  value must be a 
a510: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
a520: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74  ",.    "frame st
a530: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  arting offset mu
a540: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
a550: 74 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20  tive number",.  
a560: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a570: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a580: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75   non-negative nu
a590: 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74  mber",.  };.  st
a5a0: 61 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d  atic int aOp[] =
a5b0: 20 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c   { OP_Ge, OP_Ge,
a5c0: 20 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f   OP_Gt, OP_Ge, O
a5d0: 50 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a  P_Ge };.  Vdbe *
a5e0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a5f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a600: 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69  t regZero = sqli
a610: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a620: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
a630: 20 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f   eCond>=0 && eCo
a640: 6e 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45  nd<ArraySize(azE
a650: 72 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  rr) );.  sqlite3
a660: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a670: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
a680: 5a 65 72 6f 29 3b 0a 20 20 69 66 28 20 65 43 6f  Zero);.  if( eCo
a690: 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53 54 41 52 54  nd>=WINDOW_START
a6a0: 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 69  ING_NUM ){.    i
a6b0: 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20 73  nt regString = s
a6c0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a6d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
a6e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a6f0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a700: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
a710: 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  "", P4_STATIC);.
a720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a730: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
a740: 72 65 67 53 74 72 69 6e 67 2c 20 73 71 6c 69 74  regString, sqlit
a750: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a760: 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20  r(v)+2, reg);.  
a770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a780: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
a790: 41 46 46 5f 4e 55 4d 45 52 49 43 7c 53 51 4c 49  AFF_NUMERIC|SQLI
a7a0: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
a7b0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a7c0: 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (v);.    assert(
a7d0: 20 65 43 6f 6e 64 3d 3d 33 20 7c 7c 20 65 43 6f   eCond==3 || eCo
a7e0: 6e 64 3d 3d 34 20 29 3b 0a 20 20 20 20 56 64 62  nd==4 );.    Vdb
a7f0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a800: 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20 20 20 56 64  Cond==3);.    Vd
a810: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a820: 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20 20 7d 65 6c  eCond==4);.  }el
a830: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
a840: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a850: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20  MustBeInt, reg, 
a860: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a870: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
a880: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
a890: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
a8a0: 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64  Cond==0 || eCond
a8b0: 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20  ==1 || eCond==2 
a8c0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
a8d0: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
a8e0: 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
a8f0: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
a900: 3d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  =1);.    VdbeCov
a910: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
a920: 3d 3d 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ==2);.  }.  sqli
a930: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a940: 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67   aOp[eCond], reg
a950: 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62  Zero, sqlite3Vdb
a960: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
a970: 32 2c 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43  2, reg);.  VdbeC
a980: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
a990: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b  If(v, eCond==0);
a9a0: 20 2f 2a 20 4e 55 4c 4c 20 63 61 73 65 20 63 61   /* NULL case ca
a9b0: 70 74 75 72 65 64 20 62 79 20 2a 2f 0a 20 20 56  ptured by */.  V
a9c0: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
a9d0: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
a9e0: 3d 31 29 3b 20 2f 2a 20 20 20 74 68 65 20 4f 50  =1); /*   the OP
a9f0: 5f 4d 75 73 74 42 65 49 6e 74 20 2a 2f 0a 20 20  _MustBeInt */.  
aa00: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
aa10: 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64  rNullIf(v, eCond
aa20: 3d 3d 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==2);.  VdbeCove
aa30: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28  rageNeverNullIf(
aa40: 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 20 2f 2a  v, eCond==3); /*
aa50: 20 4e 55 4c 4c 20 63 61 73 65 20 63 61 75 67 68   NULL case caugh
aa60: 74 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 6f  t by */.  VdbeCo
aa70: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
aa80: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 20  f(v, eCond==4); 
aa90: 2f 2a 20 20 20 74 68 65 20 4f 50 5f 47 65 20 2a  /*   the OP_Ge *
aaa0: 2f 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62  /.  sqlite3MayAb
aab0: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73  ort(pParse);.  s
aac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aad0: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
aae0: 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62  ITE_ERROR, OE_Ab
aaf0: 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ort);.  sqlite3V
ab00: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
ab10: 76 6f 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e  void*)azErr[eCon
ab20: 64 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  d], P4_STATIC);.
ab30: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
ab40: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
ab50: 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  regZero);.}../*.
ab60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
ab70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
ab80: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
ab90: 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20  window-function 
aba0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
abb0: 74 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  th the object pa
abc0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
abd0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
abe0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
abf0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
ac00: 41 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20  ArgCount(Window 
ac10: 2a 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69  *pWin){.  ExprLi
ac20: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e  st *pList = pWin
ac30: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
ac40: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69  t;.  return (pLi
ac50: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
ac60: 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r : 0);.}../*.**
ac70: 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64   Generate VM cod
ac80: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68  e to invoke eith
ac90: 65 72 20 78 53 74 65 70 28 29 20 28 69 66 20 62  er xStep() (if b
aca0: 49 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f 72  Inverse is 0) or
acb0: 20 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69   .** xInverse (i
acc0: 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f  f bInverse is no
acd0: 6e 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68  n-zero) for each
ace0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
acf0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
ad00: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
ad10: 20 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66   at pMWin. Or, f
ad20: 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  or built-in wind
ad30: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ow functions.** 
ad40: 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20  that do not use 
ad50: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e  the standard fun
ad60: 63 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72  ction API, gener
ad70: 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64  ate the required
ad80: 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f  .** inline VM co
ad90: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  de..**.** If arg
ada0: 75 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72 65  ument csr is gre
adb0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
adc0: 61 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72  al to 0, then ar
add0: 67 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a  gument reg is.**
ade0: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
adf0: 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ter in an array 
ae00: 6f 66 20 72 65 67 69 73 74 65 72 73 20 67 75 61  of registers gua
ae10: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61  ranteed to be la
ae20: 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f  rge.** enough to
ae30: 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20   hold the array 
ae40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  of arguments for
ae50: 20 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20   each function. 
ae60: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
ae70: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72  the arguments ar
ae80: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
ae90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
aea0: 20 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65   of csr into the
aeb0: 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
aec0: 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e  isters before in
aed0: 76 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65  voking OP_AggSte
aee0: 70 20 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72  p or OP_AggInver
aef0: 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  se.**.** Or, if 
af00: 63 73 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  csr is less than
af10: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
af20: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
af30: 72 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20  rs at reg is.** 
af40: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
af50: 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d  d with all colum
af60: 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ns from the curr
af70: 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73  ent row of the s
af80: 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
af90: 49 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50  If argument regP
afa0: 61 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a  artSize is non-z
afb0: 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
afc0: 61 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  a register conta
afd0: 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d  ining the.** num
afe0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
aff0: 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 74 69  he current parti
b000: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b010: 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74  void windowAggSt
b020: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
b030: 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  rse, .  Window *
b040: 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20  pMWin,          
b050: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65          /* Linke
b060: 64 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77  d list of window
b070: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
b080: 69 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20 20  int csr,        
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74  /* Read argument
b0b0: 73 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73  s from this curs
b0c0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76  or */.  int bInv
b0d0: 65 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  erse,           
b0e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
b0f0: 74 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72  to invoke xInver
b100: 73 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53  se instead of xS
b110: 74 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  tep */.  int reg
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b140: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a  y of registers *
b150: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
b160: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
b170: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
b180: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
b190: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
b1a0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
b1b0: 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44  tWin){.    FuncD
b1c0: 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
b1d0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 6e 74  ->pFunc;.    int
b1e0: 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74   regArg;.    int
b1f0: 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72   nArg = windowAr
b200: 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20  gCount(pWin);.  
b210: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 66 6f    int i;..    fo
b220: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
b230: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
b240: 21 3d 31 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  !=1 || pFunc->zN
b250: 61 6d 65 21 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame!=nth_valueNa
b260: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
b270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b280: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
b290: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
b2a0: 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20  +i, reg+i);.    
b2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b2d0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
b2e0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
b2f0: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69   pWin->iArgCol+i
b300: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20  , reg+i);.      
b310: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 41  }.    }.    regA
b320: 72 67 20 3d 20 72 65 67 3b 0a 0a 20 20 20 20 69  rg = reg;..    i
b330: 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
b340: 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20  rtRowid==0.     
b350: 26 26 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  && (pFunc->funcF
b360: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
b370: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
b380: 20 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61 72   && (pWin->eStar
b390: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29  t!=TK_UNBOUNDED)
b3a0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
b3b0: 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73  t addrIsNull = s
b3c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b3d0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
b3e0: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56 64  egArg);.      Vd
b3f0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b400: 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73       if( bInvers
b410: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
b420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b430: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
b440: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
b450: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
b460: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b470: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72   OP_SCopy, regAr
b480: 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29  g, pWin->regApp)
b490: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b4a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b4b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57  P_MakeRecord, pW
b4c0: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70  in->regApp, 2, p
b4d0: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
b4e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b4f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b500: 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d  IdxInsert, pWin-
b510: 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72  >csrApp, pWin->r
b520: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
b530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b550: 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45  Int(v, OP_SeekGE
b560: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
b570: 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20  0, regArg, 1);. 
b580: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
b590: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
b5a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b5b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b5c0: 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e  P_Delete, pWin->
b5d0: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20  csrApp);.       
b5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b5f0: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
b600: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b610: 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )-2);.      }.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b630: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
b640: 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  sNull);.    }els
b650: 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41  e if( pWin->regA
b660: 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pp ){.      asse
b670: 72 74 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  rt( pFunc->zName
b680: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
b690: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
b6a0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
b6b0: 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  t_valueName.    
b6c0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
b6d0: 74 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c  t( bInverse==0 |
b6e0: 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b  | bInverse==1 );
b6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b700: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
b710: 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  ddImm, pWin->reg
b720: 41 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20  App+1-bInverse, 
b730: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  1);.    }else if
b740: 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 21  ( pFunc->xSFunc!
b750: 3d 6e 6f 6f 70 53 74 65 70 46 75 6e 63 20 29 7b  =noopStepFunc ){
b760: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
b770: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  f = 0;.      if(
b780: 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29   pWin->pFilter )
b790: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b7a0: 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  gTmp;.        as
b7b0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c  sert( nArg==0 ||
b7c0: 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77   nArg==pWin->pOw
b7d0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  ner->x.pList->nE
b7e0: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61  xpr );.        a
b7f0: 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70  ssert( nArg || p
b800: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
b810: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
b820: 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69     regTmp = sqli
b830: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
b840: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
b850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b860: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
b870: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
b880: 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a  l+nArg,regTmp);.
b890: 20 20 20 20 20 20 20 20 61 64 64 72 49 66 20 3d          addrIf =
b8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b8b0: 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
b8c0: 72 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20  regTmp, 0, 1);. 
b8d0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
b8e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
b8f0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
b900: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
b910: 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gTmp);.      }. 
b920: 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e       if( pFunc->
b930: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
b940: 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
b950: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c   ){.        Coll
b960: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
b970: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
b980: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  >0 );.        pC
b990: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
b9a0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
b9b0: 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  e, pWin->pOwner-
b9c0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
b9d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
b9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b9f0: 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
ba00: 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68  0,0,0, (const ch
ba10: 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  ar*)pColl, P4_CO
ba20: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
ba30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ba40: 65 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65  eAddOp3(v, bInve
ba50: 72 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72  rse? OP_AggInver
ba60: 73 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c  se : OP_AggStep,
ba70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ba80: 20 20 20 20 20 20 20 20 20 20 62 49 6e 76 65 72            bInver
ba90: 73 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  se, regArg, pWin
baa0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
bab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
bac0: 70 65 6e 64 50 34 28 76 2c 20 70 46 75 6e 63 2c  pendP4(v, pFunc,
bad0: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
bae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
baf0: 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
bb00: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
bb10: 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33  addrIf ) sqlite3
bb20: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bb30: 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20  addrIf);.    }. 
bb40: 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74   }.}..typedef st
bb50: 72 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41  ruct WindowCodeA
bb60: 72 67 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  rg WindowCodeArg
bb70: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
bb80: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
bb90: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
bba0: 3b 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43  ;.struct WindowC
bbb0: 73 72 41 6e 64 52 65 67 20 7b 0a 20 20 69 6e 74  srAndReg {.  int
bbc0: 20 63 73 72 3b 0a 20 20 69 6e 74 20 72 65 67 3b   csr;.  int reg;
bbd0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 57 69 6e 64  .};..struct Wind
bbe0: 6f 77 43 6f 64 65 41 72 67 20 7b 0a 20 20 50 61  owCodeArg {.  Pa
bbf0: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 57  rse *pParse;.  W
bc00: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 3b 0a 20 20  indow *pMWin;.  
bc10: 56 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20 69  Vdbe *pVdbe;.  i
bc20: 6e 74 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 69  nt regGosub;.  i
bc30: 6e 74 20 61 64 64 72 47 6f 73 75 62 3b 0a 20 20  nt addrGosub;.  
bc40: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e  int regArg;.  in
bc50: 74 20 65 44 65 6c 65 74 65 3b 0a 0a 20 20 57 69  t eDelete;..  Wi
bc60: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 73 74  ndowCsrAndReg st
bc70: 61 72 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72  art;.  WindowCsr
bc80: 41 6e 64 52 65 67 20 63 75 72 72 65 6e 74 3b 0a  AndReg current;.
bc90: 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65    WindowCsrAndRe
bca0: 67 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  g end;.};../*.**
bcb0: 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79   Values that may
bcc0: 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68   be passed as th
bcd0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
bce0: 74 20 74 6f 20 77 69 6e 64 6f 77 43 6f 64 65 4f  t to windowCodeO
bcf0: 70 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  p()..*/.#define 
bd00: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
bd10: 57 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  W 1.#define WIND
bd20: 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32 0a  OW_AGGINVERSE 2.
bd30: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
bd40: 47 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a 0a  GGSTEP    3../*.
bd50: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63  ** Generate VM c
bd60: 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20  ode to read the 
bd70: 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 70 65  window frames pe
bd80: 65 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 63  er values from c
bd90: 75 72 73 6f 72 20 63 73 72 20 69 6e 74 6f 0a 2a  ursor csr into.*
bda0: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  * an array of re
bdb0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
bdc0: 20 61 74 20 72 65 67 2e 0a 2a 2f 0a 73 74 61 74   at reg..*/.stat
bdd0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
bde0: 61 64 50 65 65 72 56 61 6c 75 65 73 28 0a 20 20  adPeerValues(.  
bdf0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
be00: 2c 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20 69  ,.  int csr,.  i
be10: 6e 74 20 72 65 67 0a 29 7b 0a 20 20 57 69 6e 64  nt reg.){.  Wind
be20: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
be30: 4d 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  MWin;.  ExprList
be40: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
be50: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
be60: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
be70: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
be80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 2d 3e  lite3GetVdbe(p->
be90: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 45 78 70  pParse);.    Exp
bea0: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
beb0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
bec0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 4f 66  ;.    int iColOf
bed0: 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  f = pMWin->nBuff
bee0: 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f  erCol + (pPart ?
bef0: 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
bf00: 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  0);.    int i;. 
bf10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
bf20: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
bf30: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
bf40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bf50: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
bf60: 69 43 6f 6c 4f 66 66 2b 69 2c 20 72 65 67 2b 69  iColOff+i, reg+i
bf70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
bf80: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
bf90: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
bfa0: 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29   either xValue()
bfb0: 20 28 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78 46   (bFin==0) or xF
bfc0: 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46  inalize().** (bF
bfd0: 69 6e 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20  in==1) for each 
bfe0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
bff0: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
c000: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a  st starting at.*
c010: 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72  * pMWin. Or, for
c020: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
c030: 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20  -functions that 
c040: 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73  do not use the s
c050: 74 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20  tandard.** API, 
c060: 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 71 75  generate the equ
c070: 69 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e  ivalent VM code.
c080: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c090: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 57  windowAggFinal(W
c0a0: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c  indowCodeArg *p,
c0b0: 20 69 6e 74 20 62 46 69 6e 29 7b 0a 20 20 50 61   int bFin){.  Pa
c0c0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
c0d0: 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f  >pParse;.  Windo
c0e0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
c0f0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
c100: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c110: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
c120: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28  w *pWin;..  for(
c130: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
c140: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
c150: 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20  xtWin){.    if( 
c160: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
c170: 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20 26 26 20  owid==0.     && 
c180: 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75  (pWin->pFunc->fu
c190: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
c1a0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
c1b0: 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53      && (pWin->eS
c1c0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
c1d0: 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED).    ){.     
c1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c1f0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
c200: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
c210: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c220: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c230: 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73  P_Last, pWin->cs
c240: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rApp);.      Vdb
c250: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c270: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
c280: 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  mn, pWin->csrApp
c290: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
c2a0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
c2b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c2c0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
c2d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
c2e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c2f0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
c300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c310: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
c320: 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  id==0 );.    }el
c330: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41  se{.      int nA
c340: 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f  rg = windowArgCo
c350: 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 20  unt(pWin);.     
c360: 20 69 66 28 20 62 46 69 6e 20 29 7b 0a 20 20 20   if( bFin ){.   
c370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c380: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
c390: 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  Final, pWin->reg
c3a0: 41 63 63 75 6d 2c 20 6e 41 72 67 29 3b 0a 20 20  Accum, nArg);.  
c3b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c3c0: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69  eAppendP4(v, pWi
c3d0: 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  n->pFunc, P4_FUN
c3e0: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
c3f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c400: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69  (v, OP_Copy, pWi
c410: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69  n->regAccum, pWi
c420: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
c430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c440: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
c450: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
c460: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d  gAccum);.      }
c470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
c480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c490: 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c 70  v, OP_AggValue,p
c4a0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 6e 41  Win->regAccum,nA
c4b0: 72 67 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  rg,pWin->regResu
c4c0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
c4d0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
c4e0: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
c4f0: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
c500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c510: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c520: 65 20 63 6f 64 65 20 74 6f 20 63 61 6c 63 75 6c  e code to calcul
c530: 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
c540: 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 77 69  values of all wi
c550: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69  ndow functions i
c560: 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e 70 4d 57 69  n the.** p->pMWi
c570: 6e 20 6c 69 73 74 20 62 79 20 64 6f 69 6e 67 20  n list by doing 
c580: 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 74  a full scan of t
c590: 68 65 20 63 75 72 72 65 6e 74 20 77 69 6e 64 6f  he current windo
c5a0: 77 20 66 72 61 6d 65 2e 20 53 74 6f 72 65 20 74  w frame. Store t
c5b0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
c5c0: 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52   the Window.regR
c5d0: 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2c  esult registers,
c5e0: 20 72 65 61 64 79 20 74 6f 20 72 65 74 75 72 6e   ready to return
c5f0: 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 6c 61   the upper.** la
c600: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  yer..*/.static v
c610: 6f 69 64 20 77 69 6e 64 6f 77 46 75 6c 6c 53 63  oid windowFullSc
c620: 61 6e 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  an(WindowCodeArg
c630: 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a   *p){.  Window *
c640: 70 57 69 6e 3b 0a 20 20 50 61 72 73 65 20 2a 70  pWin;.  Parse *p
c650: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
c660: 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e;.  Window *pMW
c670: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
c680: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56   Vdbe *v = p->pV
c690: 64 62 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67 43  dbe;..  int regC
c6a0: 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
c6b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
c6c0: 6e 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a  nt rowid value *
c6d0: 2f 0a 20 20 69 6e 74 20 72 65 67 43 50 65 65 72  /.  int regCPeer
c6e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c6f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70      /* Current p
c700: 65 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  eer values */.  
c710: 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30  int regRowid = 0
c720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c730: 2f 2a 20 41 67 67 53 74 65 70 20 72 6f 77 69 64  /* AggStep rowid
c740: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
c750: 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20  regPeer = 0;    
c760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c770: 67 67 53 74 65 70 20 70 65 65 72 20 76 61 6c 75  ggStep peer valu
c780: 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 65  es */..  int nPe
c790: 65 72 3b 0a 20 20 69 6e 74 20 6c 62 6c 4e 65 78  er;.  int lblNex
c7a0: 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 42 72 6b 3b  t;.  int lblBrk;
c7b0: 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b  .  int addrNext;
c7c0: 0a 20 20 69 6e 74 20 63 73 72 20 3d 20 70 4d 57  .  int csr = pMW
c7d0: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 0a 20 20 6e  in->csrApp;..  n
c7e0: 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 70  Peer = (pMWin->p
c7f0: 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d  OrderBy ? pMWin-
c800: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
c810: 20 3a 20 30 29 3b 0a 0a 20 20 6c 62 6c 4e 65 78   : 0);..  lblNex
c820: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
c830: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
c840: 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d 20 73 71 6c  ;.  lblBrk = sql
c850: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c860: 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  l(pParse);..  re
c870: 67 43 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  gCRowid = sqlite
c880: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c890: 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  se);.  regRowid 
c8a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c8b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
c8c0: 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20  f( nPeer ){.    
c8d0: 72 65 67 43 50 65 65 72 20 3d 20 73 71 6c 69 74  regCPeer = sqlit
c8e0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
c8f0: 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20  Parse, nPeer);. 
c900: 20 20 20 72 65 67 50 65 65 72 20 3d 20 73 71 6c     regPeer = sql
c910: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
c920: 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b  (pParse, nPeer);
c930: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
c940: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c950: 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45  Rowid, pMWin->iE
c960: 70 68 43 73 72 2c 20 72 65 67 43 52 6f 77 69 64  phCsr, regCRowid
c970: 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50  );.  windowReadP
c980: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 70 4d 57  eerValues(p, pMW
c990: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67  in->iEphCsr, reg
c9a0: 43 50 65 65 72 29 3b 0a 0a 20 20 66 6f 72 28 70  CPeer);..  for(p
c9b0: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
c9c0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
c9d0: 74 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69 74  tWin){.    sqlit
c9e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c9f0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
ca00: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 7d  ->regAccum);.  }
ca10: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
ca20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
ca30: 47 45 2c 20 63 73 72 2c 20 6c 62 6c 42 72 6b 2c  GE, csr, lblBrk,
ca40: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
ca50: 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43 6f  Rowid);.  VdbeCo
ca60: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64  verage(v);.  add
ca70: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
ca80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ca90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
caa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
cab0: 69 64 2c 20 63 73 72 2c 20 72 65 67 52 6f 77 69  id, csr, regRowi
cac0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
cad0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74  eAddOp3(v, OP_Gt
cae0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
caf0: 6f 77 69 64 2c 20 6c 62 6c 42 72 6b 2c 20 72 65  owid, lblBrk, re
cb00: 67 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43  gRowid);.  VdbeC
cb10: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
cb20: 28 76 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69  (v);..  if( pMWi
cb30: 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
cb40: 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 73  CURRENT ){.    s
cb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cb60: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43 52  (v, OP_Eq, regCR
cb70: 6f 77 69 64 2c 20 6c 62 6c 4e 65 78 74 2c 20 72  owid, lblNext, r
cb80: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 56 64  egRowid);.    Vd
cb90: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
cba0: 75 6c 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20  ull(v);.  }else 
cbb0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c  if( pMWin->eExcl
cbc0: 75 64 65 21 3d 54 4b 5f 4e 4f 20 29 7b 0a 20 20  ude!=TK_NO ){.  
cbd0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
cbe0: 69 6e 74 20 61 64 64 72 45 71 20 3d 20 30 3b 0a  int addrEq = 0;.
cbf0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
cc00: 79 49 6e 66 6f 20 3d 20 30 3b 0a 0a 20 20 20 20  yInfo = 0;..    
cc10: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  if( pMWin->pOrde
cc20: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  rBy ){.      pKe
cc30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
cc40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
cc50: 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  st(pParse, pMWin
cc60: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30  ->pOrderBy, 0, 0
cc70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cc80: 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
cc90: 3d 3d 54 4b 5f 54 49 45 53 20 29 7b 0a 20 20 20  ==TK_TIES ){.   
cca0: 20 20 20 61 64 64 72 45 71 20 3d 20 73 71 6c 69     addrEq = sqli
ccb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ccc0: 20 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69   OP_Eq, regCRowi
ccd0: 64 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  d, 0, regRowid);
cce0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
ccf0: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b  ageNeverNull(v);
cd00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
cd10: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
cd20: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
cd30: 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65  alues(p, csr, re
cd40: 67 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  gPeer);.      sq
cd50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cd60: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
cd70: 65 67 50 65 65 72 2c 20 72 65 67 43 50 65 65 72  egPeer, regCPeer
cd80: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20  , nPeer);.      
cd90: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
cda0: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
cdb0: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
cdc0: 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  FO);.      addr 
cdd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
cde0: 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
cdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
ce10: 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e 65 78 74  p, addr, lblNext
ce20: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 56  , addr);.      V
ce30: 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28  dbeCoverageEqNe(
ce40: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
ce50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
ce70: 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a  o, 0, lblNext);.
ce80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 64      }.    if( ad
ce90: 64 72 45 71 20 29 20 73 71 6c 69 74 65 33 56 64  drEq ) sqlite3Vd
cea0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ceb0: 64 72 45 71 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  drEq);.  }..  wi
cec0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
ced0: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20  se, pMWin, csr, 
cee0: 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 0a  0, p->regArg);..
cef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cf00: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
cf10: 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Next);.  sqlite3
cf20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cf30: 5f 4e 65 78 74 2c 20 63 73 72 2c 20 61 64 64 72  _Next, csr, addr
cf40: 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43 6f 76  Next);.  VdbeCov
cf50: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
cf60: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
cf70: 76 2c 20 61 64 64 72 4e 65 78 74 2d 31 29 3b 0a  v, addrNext-1);.
cf80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
cf90: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78  pHere(v, addrNex
cfa0: 74 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  t+1);.  sqlite3R
cfb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
cfc0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
cfd0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
cfe0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
cff0: 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20 20 69   regCRowid);.  i
d000: 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20  f( nPeer ){.    
d010: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d020: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d030: 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b  regPeer, nPeer);
d040: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d050: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d060: 72 73 65 2c 20 72 65 67 43 50 65 65 72 2c 20 6e  rse, regCPeer, n
d070: 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  Peer);.  }..  wi
d080: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c 20  ndowAggFinal(p, 
d090: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  1);.}../*.** Inv
d0a0: 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74  oke the sub-rout
d0b0: 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75 62 20  ine at regGosub 
d0c0: 28 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f  (generated by co
d0d0: 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20  de in select.c) 
d0e0: 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  to.** return the
d0f0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
d100: 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20  Window.iEphCsr. 
d110: 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75  If all window fu
d120: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61  nctions are.** a
d130: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
d140: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
d150: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
d160: 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  API, a single.**
d170: 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75   OP_Gosub instru
d180: 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61  ction is all tha
d190: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  t this routine g
d1a0: 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72 61 20  enerates. Extra 
d1b0: 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70  VM code.** for p
d1c0: 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e  er-row processin
d1d0: 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61  g is only genera
d1e0: 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  ted for the foll
d1f0: 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77  owing built-in w
d200: 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f  indow.** functio
d210: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f  ns:.**.**   nth_
d220: 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72  value().**   fir
d230: 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20  st_value().**   
d240: 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28  lag().**   lead(
d250: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
d260: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
d270: 52 6f 77 28 57 69 6e 64 6f 77 43 6f 64 65 41 72  Row(WindowCodeAr
d280: 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  g *p){.  Window 
d290: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
d2a0: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  n;.  Vdbe *v = p
d2b0: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66 28 20  ->pVdbe;..  if( 
d2c0: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
d2d0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 77 69 6e 64  owid ){.    wind
d2e0: 6f 77 46 75 6c 6c 53 63 61 6e 28 70 29 3b 0a 20  owFullScan(p);. 
d2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 72 73   }else{.    Pars
d300: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
d310: 50 61 72 73 65 3b 0a 20 20 20 20 57 69 6e 64 6f  Parse;.    Windo
d320: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 20 20 66 6f  w *pWin;..    fo
d330: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
d340: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
d350: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
d360: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
d370: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
d380: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
d390: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
d3a0: 61 6d 65 0a 20 20 20 20 20 20 20 7c 7c 20 70 46  ame.       || pF
d3b0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
d3c0: 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  t_valueName.    
d3d0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
d3e0: 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72   csr = pWin->csr
d3f0: 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  App;.        int
d400: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
d410: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
d420: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  se);.        int
d430: 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65   tmpReg = sqlite
d440: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
d450: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
d460: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d470: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
d480: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
d490: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
d4a0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
d4b0: 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20  _valueName ){.  
d4c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d4d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d4e0: 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e 2d 3e 69 45  Column,pMWin->iE
d4f0: 70 68 43 73 72 2c 70 57 69 6e 2d 3e 69 41 72 67  phCsr,pWin->iArg
d500: 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20  Col+1,tmpReg);. 
d510: 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43           windowC
d520: 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65  heckValue(pParse
d530: 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b 0a 20 20  , tmpReg, 2);.  
d540: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d550: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d560: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d570: 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65  nteger, 1, tmpRe
d580: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
d590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
d5b0: 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d  d, tmpReg, pWin-
d5c0: 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29  >regApp, tmpReg)
d5d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d5e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d5f0: 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41  P_Gt, pWin->regA
d600: 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65  pp+1, lbl, tmpRe
d610: 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
d620: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
d630: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
d640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d650: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
d660: 20 63 73 72 2c 20 30 2c 20 74 6d 70 52 65 67 29   csr, 0, tmpReg)
d670: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
d680: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
d690: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
d6a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d6b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
d6c0: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c  , pWin->iArgCol,
d6d0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
d6e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d6f0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d700: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
d710: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
d720: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
d730: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
d740: 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
d750: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
d760: 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  leadName || pFun
d770: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
d780: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
d790: 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f   nArg = pWin->pO
d7a0: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
d7b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
d7c0: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
d7d0: 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  rApp;.        in
d7e0: 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56  t lbl = sqlite3V
d7f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
d800: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
d810: 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74  t tmpReg = sqlit
d820: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
d830: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
d840: 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e  t iEph = pMWin->
d850: 69 45 70 68 43 73 72 3b 0a 20 20 0a 20 20 20 20  iEphCsr;.  .    
d860: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29      if( nArg<3 )
d870: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d880: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d890: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
d8a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
d8b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d8c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d8d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d8e0: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 70 57 69  Column, iEph,pWi
d8f0: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 70 57 69  n->iArgCol+2,pWi
d900: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
d910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d930: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
d940: 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20  iEph, tmpReg);. 
d950: 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
d960: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  2 ){.          i
d970: 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d  nt val = (pFunc-
d980: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
d990: 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20   ? 1 : -1);.    
d9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d9b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
d9c0: 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61  dImm, tmpReg, va
d9d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  l);.        }els
d9e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
d9f0: 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e   op = (pFunc->zN
da00: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20  ame==leadName ? 
da10: 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62 74  OP_Add : OP_Subt
da20: 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ract);.         
da30: 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d 20 73   int tmpReg2 = s
da40: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
da50: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
da60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
da80: 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e  mn, iEph, pWin->
da90: 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65  iArgCol+1, tmpRe
daa0: 67 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  g2);.          s
dab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
dac0: 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c  (v, op, tmpReg2,
dad0: 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29   tmpReg, tmpReg)
dae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
daf0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
db00: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
db10: 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
db20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
db40: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c  _SeekRowid, csr,
db50: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
db60: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
db70: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
db80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db90: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
dba0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
dbb0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
dbc0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ult);.        sq
dbd0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
dbe0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
dbf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
dc00: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
dc10: 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  rse, tmpReg);.  
dc20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dc30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc40: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
dc50: 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20 70 2d   p->regGosub, p-
dc60: 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a  >addrGosub);.}..
dc70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
dc80: 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65 20 61  ode to set the a
dc90: 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
dca0: 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ter for each win
dcb0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  dow function.** 
dcc0: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
dcd0: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
dce0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
dcf0: 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65   to NULL. And pe
dd00: 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75  rform.** any equ
dd10: 69 76 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69  ivalent initiali
dd20: 7a 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  zation required 
dd30: 62 79 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20  by any built-in 
dd40: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
dd50: 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  .** in the list.
dd60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
dd70: 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50  indowInitAccum(P
dd80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
dd90: 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20  ndow *pMWin){.  
dda0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ddb0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ddc0: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ;.  int regArg;.
ddd0: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
dde0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
ddf0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
de00: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
de10: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
de20: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
de30: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
de40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
de50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
de60: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  , 0, pWin->regAc
de70: 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d  cum);.    nArg =
de80: 20 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f   MAX(nArg, windo
de90: 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29  wArgCount(pWin))
dea0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
deb0: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d  >regStartRowid==
dec0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
ded0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
dee0: 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 46  _valueName || pF
def0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
df00: 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20  t_valueName ){. 
df10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
df20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
df30: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
df40: 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20  >regApp);.      
df50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
df70: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
df80: 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  pp+1);.      }..
df90: 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
dfa0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
dfb0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
dfc0: 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70  ) && pWin->csrAp
dfd0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  p ){.        ass
dfe0: 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72  ert( pWin->eStar
dff0: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
e000: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e010: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e020: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
e030: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
e040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e060: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
e070: 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20  >regApp+1);.    
e080: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e090: 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d  regArg = pParse-
e0a0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
e0b0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b  e->nMem += nArg;
e0c0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72 67  .  return regArg
e0d0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  ;.}../* .** Retu
e0e0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
e0f0: 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73 68 6f  urrent frame sho
e100: 75 6c 64 20 62 65 20 63 61 63 68 65 64 20 69 6e  uld be cached in
e110: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
e120: 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20 69 66  able,.** even if
e130: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 78 49   there are no xI
e140: 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73 20 72  nverse() calls r
e150: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
e160: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 61 63  ic int windowCac
e170: 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77 20 2a  heFrame(Window *
e180: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
e190: 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28 20 70 4d   *pWin;.  if( pM
e1a0: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
e1b0: 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  id ) return 1;. 
e1c0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
e1d0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
e1e0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
e1f0: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
e200: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
e210: 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 7a     if( (pFunc->z
e220: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
e230: 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46  ame).     || (pF
e240: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
e250: 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20  t_valueName).   
e260: 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61    || (pFunc->zNa
e270: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20 20  me==leadName).  
e280: 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
e290: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20  ame==lagName).  
e2a0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
e2b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
e2c0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e2d0: 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20 72  .** regOld and r
e2e0: 65 67 4e 65 77 20 61 72 65 20 65 61 63 68 20 74  egNew are each t
e2f0: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
e300: 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
e310: 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65 72 42   size.** pOrderB
e320: 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73 20 66  y->nExpr. This f
e330: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
e340: 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 61 72  s code to compar
e350: 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61 72 72  e the two.** arr
e360: 61 79 73 20 6f 66 20 72 65 67 69 73 74 65 72 73  ays of registers
e370: 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
e380: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61  tion sequences a
e390: 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61 72 69  nd other compari
e3a0: 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  son.** parameter
e3b0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  s specified by p
e3c0: 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a 2a 20  OrderBy. .**.** 
e3d0: 49 66 20 74 68 65 20 74 77 6f 20 61 72 72 61 79  If the two array
e3e0: 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2c  s are not equal,
e3f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
e400: 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70 69 65   regNew is copie
e410: 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c 64 20  d to .** regOld 
e420: 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c  and control fall
e430: 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68 65 72  s through. Other
e440: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  wise, if the con
e450: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72  tents of the arr
e460: 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75 61 6c  ays.** are equal
e470: 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69 73 20  , an OP_Goto is 
e480: 65 78 65 63 75 74 65 64 2e 20 54 68 65 20 61 64  executed. The ad
e490: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
e4a0: 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Goto is returned
e4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e4c0: 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72   windowIfNewPeer
e4d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e4e0: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
e4f0: 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 72  OrderBy,.  int r
e500: 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20  egNew,          
e510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e520: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
e530: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
e540: 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20 20 20  int regOld,     
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
e570: 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65 73 20  y of old values 
e580: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 20 20 20  */.  int addr   
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
e5b0: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
e5c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e5d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
e5e0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
e5f0: 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f 72    int nVal = pOr
e600: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
e610: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
e620: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
e630: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
e640: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
e650: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  y, 0, 0);.    sq
e660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
e670: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
e680: 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20 6e  egOld, regNew, n
e690: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
e6a0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
e6b0: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
e6c0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
e6d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e6e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
e6f0: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56   .      sqlite3V
e700: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e710: 29 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c 69 74  )+1, addr, sqlit
e720: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e730: 72 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a 20 20  r(v)+1.    );.  
e740: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71    VdbeCoverageEq
e750: 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ne(v);.    sqlit
e760: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e770: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 2c  OP_Copy, regNew,
e780: 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d 31 29   regOld, nVal-1)
e790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e7b0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
e7c0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
e7d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
e7e0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
e7f0: 61 72 74 20 6f 66 20 67 65 6e 65 72 61 74 69 6e  art of generatin
e800: 67 20 56 4d 20 70 72 6f 67 72 61 6d 73 20 66 6f  g VM programs fo
e810: 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66 66 73 65  r RANGE.** offse
e820: 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c  t PRECEDING/FOLL
e830: 4f 57 49 4e 47 20 66 72 61 6d 65 20 62 6f 75 6e  OWING frame boun
e840: 64 61 72 69 65 73 2e 20 41 73 73 75 6d 69 6e 67  daries. Assuming
e850: 20 22 41 53 43 22 20 6f 72 64 65 72 20 66 6f 72   "ASC" order for
e860: 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59  .** the ORDER BY
e870: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 77 69 6e   term in the win
e880: 64 6f 77 2c 20 69 74 20 67 65 6e 65 72 61 74 65  dow, it generate
e890: 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e  s code equivalen
e8a0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  t to:.**.**   if
e8b0: 28 20 63 73 72 31 2e 70 65 65 72 56 61 6c 20 2b  ( csr1.peerVal +
e8c0: 20 72 65 67 56 61 6c 20 3e 3d 20 63 73 72 32 2e   regVal >= csr2.
e8d0: 70 65 65 72 56 61 6c 20 29 20 67 6f 74 6f 20 6c  peerVal ) goto l
e8e0: 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70 65 63  bl;.**.** A spec
e8f0: 69 61 6c 20 74 79 70 65 20 6f 66 20 61 72 69 74  ial type of arit
e900: 68 6d 65 74 69 63 20 69 73 20 75 73 65 64 20 73  hmetic is used s
e910: 75 63 68 20 74 68 61 74 20 69 66 20 63 73 72 2e  uch that if csr.
e920: 70 65 65 72 56 61 6c 20 69 73 20 6e 6f 74 0a 2a  peerVal is not.*
e930: 2a 20 61 20 6e 75 6d 65 72 69 63 20 74 79 70 65  * a numeric type
e940: 20 28 72 65 61 6c 20 6f 72 20 69 6e 74 65 67 65   (real or intege
e950: 72 29 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  r), then the res
e960: 75 6c 74 20 6f 66 20 74 68 65 20 61 64 64 69 74  ult of the addit
e970: 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 63 6f 70 79  ion is.** a copy
e980: 20 6f 66 20 63 73 72 31 2e 70 65 65 72 56 61 6c   of csr1.peerVal
e990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e9a0: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
e9b0: 54 65 73 74 28 0a 20 20 57 69 6e 64 6f 77 43 6f  Test(.  WindowCo
e9c0: 64 65 41 72 67 20 2a 70 2c 20 0a 20 20 69 6e 74  deArg *p, .  int
e9d0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47 74 20   OP_Ge or OP_Gt 
ea00: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c 20 0a  */.  int csr1, .
ea10: 20 20 69 6e 74 20 72 65 67 56 61 6c 2c 20 0a 20    int regVal, . 
ea20: 20 69 6e 74 20 63 73 72 32 2c 0a 20 20 69 6e 74   int csr2,.  int
ea30: 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73 65 20   lbl.){.  Parse 
ea40: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
ea50: 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
ea60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ea70: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
ea80: 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg1 = sqlite3Get
ea90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
eaa0: 0a 20 20 69 6e 74 20 72 65 67 32 20 3d 20 73 71  .  int reg2 = sq
eab0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
eac0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61  pParse);.  int a
ead0: 72 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b 0a 20  rith = OP_Add;. 
eae0: 20 69 6e 74 20 61 64 64 72 47 65 3b 0a 0a 20 20   int addrGe;..  
eaf0: 69 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20  int regString = 
eb00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
eb10: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f  .  assert( op==O
eb20: 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  P_Ge || op==OP_G
eb30: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  t || op==OP_Le )
eb40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
eb50: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26  MWin->pOrderBy &
eb60: 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64  & p->pMWin->pOrd
eb70: 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
eb80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d 57 69 6e  ;.  if( p->pMWin
eb90: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  ->pOrderBy->a[0]
eba0: 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  .sortOrder ){.  
ebb0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
ebc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65        case OP_Ge
ebd0: 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 62 72  : op = OP_Le; br
ebe0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ebf0: 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c  OP_Gt: op = OP_L
ec00: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  t; break;.      
ec10: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
ec20: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70   op==OP_Le ); op
ec30: 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65 61 6b 3b   = OP_Ge; break;
ec40: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 69 74 68  .    }.    arith
ec50: 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 0a   = OP_Subtract;.
ec60: 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 52 65 61    }..  windowRea
ec70: 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63  dPeerValues(p, c
ec80: 73 72 31 2c 20 72 65 67 31 29 3b 0a 20 20 77 69  sr1, reg1);.  wi
ec90: 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75  ndowReadPeerValu
eca0: 65 73 28 70 2c 20 63 73 72 32 2c 20 72 65 67 32  es(p, csr2, reg2
ecb0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
ecc0: 66 20 74 68 65 20 70 65 65 72 20 76 61 6c 75 65  f the peer value
ecd0: 20 66 6f 72 20 63 73 72 31 20 76 61 6c 75 65 20   for csr1 value 
ece0: 69 73 20 61 20 74 65 78 74 20 6f 72 20 62 6c 6f  is a text or blo
ecf0: 62 20 62 79 20 63 6f 6d 70 61 72 69 6e 67 0a 20  b by comparing. 
ed00: 20 2a 2a 20 69 74 20 74 6f 20 74 68 65 20 73 6d   ** it to the sm
ed10: 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
ed20: 73 74 72 69 6e 67 20 2d 20 27 27 2e 20 49 66 20  string - ''. If 
ed30: 69 74 20 69 73 2c 20 6a 75 6d 70 20 6f 76 65 72  it is, jump over
ed40: 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 41 64 64   the.  ** OP_Add
ed50: 20 6f 72 20 4f 50 5f 53 75 62 74 72 61 63 74 20   or OP_Subtract 
ed60: 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 70 72  operation and pr
ed70: 6f 63 65 65 64 20 64 69 72 65 63 74 6c 79 20 74  oceed directly t
ed80: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
ed90: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  . */.  sqlite3Vd
eda0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
edb0: 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 53 74  tring8, 0, regSt
edc0: 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20 50 34 5f  ring, 0, "", P4_
edd0: 53 54 41 54 49 43 29 3b 0a 20 20 61 64 64 72 47  STATIC);.  addrG
ede0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
edf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
ee00: 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20 72 65  regString, 0, re
ee10: 67 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  g1);.  VdbeCover
ee20: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
ee30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
ee40: 72 69 74 68 2c 20 72 65 67 56 61 6c 2c 20 72 65  rith, regVal, re
ee50: 67 31 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c  g1, reg1);.  sql
ee60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ee70: 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20 20 73  (v, addrGe);.  s
ee80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ee90: 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c 20 6c 62  (v, op, reg2, lb
eea0: 6c 2c 20 72 65 67 31 29 3b 20 56 64 62 65 43 6f  l, reg1); VdbeCo
eeb0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
eec0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
eed0: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
eee0: 51 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  Q);.  assert( op
eef0: 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f  ==OP_Ge || op==O
ef00: 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  P_Gt || op==OP_L
ef10: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  t || op==OP_Le )
ef20: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d  ;.  testcase(op=
ef30: 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
ef40: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
ef50: 50 5f 47 65 29 3b 0a 20 20 74 65 73 74 63 61 73  P_Ge);.  testcas
ef60: 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
ef70: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
ef80: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 74 65  op==OP_Lt);.  te
ef90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
efa0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
efb0: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  f(v, op==OP_Le);
efc0: 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  .  testcase(op==
efd0: 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
efe0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
eff0: 5f 47 74 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  _Gt);..  sqlite3
f000: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f010: 50 61 72 73 65 2c 20 72 65 67 31 29 3b 0a 20 20  Parse, reg1);.  
f020: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f030: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
f040: 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  g2);.}../*.** He
f050: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
f060: 72 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  r sqlite3WindowC
f070: 6f 64 65 53 74 65 70 28 29 2e 20 45 61 63 68 20  odeStep(). Each 
f080: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
f090: 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e 65 72 61 74  ction.** generat
f0a0: 65 73 20 56 4d 20 63 6f 64 65 20 66 6f 72 20 61  es VM code for a
f0b0: 20 73 69 6e 67 6c 65 20 52 45 54 55 52 4e 5f 52   single RETURN_R
f0c0: 4f 57 2c 20 41 47 47 53 54 45 50 20 6f 72 20 41  OW, AGGSTEP or A
f0d0: 47 47 49 4e 56 45 52 53 45 20 0a 2a 2a 20 6f 70  GGINVERSE .** op
f0e0: 65 72 61 74 69 6f 6e 2e 20 52 65 66 65 72 20 74  eration. Refer t
f0f0: 6f 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  o the header com
f100: 6d 65 6e 74 20 66 6f 72 20 73 71 6c 69 74 65 33  ment for sqlite3
f110: 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29  WindowCodeStep()
f120: 20 66 6f 72 0a 2a 2a 20 64 65 74 61 69 6c 73 2e   for.** details.
f130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f140: 69 6e 64 6f 77 43 6f 64 65 4f 70 28 0a 20 57 69  indowCodeOp(. Wi
f150: 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20  ndowCodeArg *p, 
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f170: 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
f180: 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c 20 20 20 20   */. int op,    
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 20 20 2f 2a 20 57 49 4e 44 4f 57 5f        /* WINDOW_
f1b0: 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53  RETURN_ROW, AGGS
f1c0: 54 45 50 20 6f 72 20 41 47 47 49 4e 56 45 52 53  TEP or AGGINVERS
f1d0: 45 20 2a 2f 0a 20 69 6e 74 20 72 65 67 43 6f 75  E */. int regCou
f1e0: 6e 74 64 6f 77 6e 2c 20 20 20 20 20 20 20 20 20  ntdown,         
f1f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f200: 65 72 20 66 6f 72 20 4f 50 5f 49 66 50 6f 73 20  er for OP_IfPos 
f210: 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f 0a 20 69 6e  countdown */. in
f220: 74 20 6a 75 6d 70 4f 6e 45 6f 66 20 20 20 20 20  t jumpOnEof     
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f240: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 73  * Jump here if s
f250: 74 65 70 70 65 64 20 63 75 72 73 6f 72 20 72 65  tepped cursor re
f260: 61 63 68 65 73 20 45 4f 46 20 2a 2f 0a 29 7b 0a  aches EOF */.){.
f270: 20 20 69 6e 74 20 63 73 72 2c 20 72 65 67 3b 0a    int csr, reg;.
f280: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
f290: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  = p->pParse;.  W
f2a0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
f2b0: 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e 74 20 72  ->pMWin;.  int r
f2c0: 65 74 20 3d 20 30 3b 0a 20 20 56 64 62 65 20 2a  et = 0;.  Vdbe *
f2d0: 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 20 20  v = p->pVdbe;.  
f2e0: 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b 20  int addrIf = 0; 
f2f0: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
f300: 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  nue = 0;.  int a
f310: 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 69  ddrGoto = 0;.  i
f320: 6e 74 20 62 50 65 65 72 20 3d 20 28 70 4d 57 69  nt bPeer = (pMWi
f330: 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f  n->eFrmType!=TK_
f340: 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74 20 6c 62  ROWS);..  int lb
f350: 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  lDone = sqlite3V
f360: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
f370: 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  rse);.  int addr
f380: 4e 65 78 74 52 61 6e 67 65 20 3d 20 30 3b 0a 0a  NextRange = 0;..
f390: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
f3a0: 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  e - WINDOW_AGGIN
f3b0: 56 45 52 53 45 20 69 73 20 61 6c 77 61 79 73 20  VERSE is always 
f3c0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 66  a no-op if the f
f3d0: 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61 72 74 73  rame.  ** starts
f3e0: 20 77 69 74 68 20 55 4e 42 4f 55 4e 44 45 44 20   with UNBOUNDED 
f3f0: 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f 0a 20 20  PRECEDING. */.  
f400: 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41  if( op==WINDOW_A
f410: 47 47 49 4e 56 45 52 53 45 20 26 26 20 70 4d 57  GGINVERSE && pMW
f420: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
f430: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
f440: 61 73 73 65 72 74 28 20 72 65 67 43 6f 75 6e 74  assert( regCount
f450: 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75 6d 70 4f  down==0 && jumpO
f460: 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72  nEof==0 );.    r
f470: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f480: 69 66 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  if( regCountdown
f490: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  >0 ){.    if( pM
f4a0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54  Win->eFrmType==T
f4b0: 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
f4c0: 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d   addrNextRange =
f4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f4e0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
f4f0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49    assert( op==WI
f500: 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20  NDOW_AGGINVERSE 
f510: 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  || op==WINDOW_AG
f520: 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20 20 69  GSTEP );.      i
f530: 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  f( op==WINDOW_AG
f540: 47 49 4e 56 45 52 53 45 20 29 7b 0a 20 20 20 20  GINVERSE ){.    
f550: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
f560: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
f570: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
f580: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
f590: 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Test(.          
f5a0: 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d      p, OP_Le, p-
f5b0: 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  >current.csr, re
f5c0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73  gCountdown, p->s
f5d0: 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  tart.csr, lblDon
f5e0: 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
f5f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f600: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
f610: 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20  deRangeTest(.   
f620: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50             p, OP
f630: 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73  _Ge, p->start.cs
f640: 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c  r, regCountdown,
f650: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c   p->current.csr,
f660: 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20   lblDone.       
f670: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
f680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f690: 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
f6a0: 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20  angeTest(.      
f6b0: 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c 20        p, OP_Gt, 
f6c0: 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67 43  p->end.csr, regC
f6d0: 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72  ountdown, p->cur
f6e0: 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  rent.csr, lblDon
f6f0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
f700: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f710: 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73        addrIf = s
f720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f730: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
f740: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31  gCountdown, 0, 1
f750: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
f760: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
f770: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 57    }..  if( op==W
f780: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
f790: 20 26 26 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74   && pMWin->regSt
f7a0: 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20  artRowid==0 ){. 
f7b0: 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61     windowAggFina
f7c0: 6c 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61  l(p, 0);.  }.  a
f7d0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
f7e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f7f0: 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69 74 63  Addr(v);.  switc
f800: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
f810: 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  e WINDOW_RETURN_
f820: 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72 20 3d  ROW:.      csr =
f830: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 3b   p->current.csr;
f840: 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e  .      reg = p->
f850: 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20 20 20  current.reg;.   
f860: 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f     windowReturnO
f870: 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20 20 20 20  neRow(p);.      
f880: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
f890: 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
f8a0: 53 45 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20  SE:.      csr = 
f8b0: 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a 20 20  p->start.csr;.  
f8c0: 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 73 74 61      reg = p->sta
f8d0: 72 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 69 66  rt.reg;.      if
f8e0: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
f8f0: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  tRowid ){.      
f900: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
f910: 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29 3b 0a  >regEndRowid );.
f920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f930: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f940: 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72  AddImm, pMWin->r
f950: 65 67 53 74 61 72 74 52 6f 77 69 64 2c 20 31 29  egStartRowid, 1)
f960: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f970: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67         windowAgg
f980: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
f990: 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e 72  in, csr, 1, p->r
f9a0: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  egArg);.      }.
f9b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
f9c0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
f9d0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e   assert( op==WIN
f9e0: 44 4f 57 5f 41 47 47 53 54 45 50 20 29 3b 0a 20  DOW_AGGSTEP );. 
f9f0: 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 65 6e       csr = p->en
fa00: 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67  d.csr;.      reg
fa10: 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20   = p->end.reg;. 
fa20: 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
fa30: 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29 7b  regStartRowid ){
fa40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fa50: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
fa60: 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73  wid );.        s
fa70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fa80: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
fa90: 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69  MWin->regEndRowi
faa0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  d, 1);.      }el
fab0: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  se{.        wind
fac0: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
fad0: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30 2c  , pMWin, csr, 0,
fae0: 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 20 20 20   p->regArg);.   
faf0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fb00: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d  ;.  }..  if( op=
fb10: 3d 70 2d 3e 65 44 65 6c 65 74 65 20 29 7b 0a 20  =p->eDelete ){. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb30: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
fb40: 65 2c 20 63 73 72 29 3b 0a 20 20 20 20 73 71 6c  e, csr);.    sql
fb50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
fb60: 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  (v, OPFLAG_SAVEP
fb70: 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 7d 0a 0a 20  OSITION);.  }.. 
fb80: 20 69 66 28 20 6a 75 6d 70 4f 6e 45 6f 66 20 29   if( jumpOnEof )
fb90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fba0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
fbb0: 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33  xt, csr, sqlite3
fbc0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
fbd0: 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+2);.    VdbeC
fbe0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fbf0: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ret = sqlite3Vdb
fc00: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
fc10: 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  to);.  }else{.  
fc20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc30: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
fc40: 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  csr, sqlite3Vdbe
fc50: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
fc60: 2b 62 50 65 65 72 29 3b 0a 20 20 20 20 56 64 62  +bPeer);.    Vdb
fc70: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fc80: 20 20 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20    if( bPeer ){. 
fc90: 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20       addrGoto = 
fca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fcb0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
fcc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
fcd0: 62 50 65 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  bPeer ){.    int
fce0: 20 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e 2d 3e   nReg = (pMWin->
fcf0: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
fd00: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
fd10: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
fd20: 72 65 67 54 6d 70 20 3d 20 28 6e 52 65 67 20 3f  regTmp = (nReg ?
fd30: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
fd40: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65  ange(pParse, nRe
fd50: 67 29 20 3a 20 30 29 3b 0a 20 20 20 20 77 69 6e  g) : 0);.    win
fd60: 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65  dowReadPeerValue
fd70: 73 28 70 2c 20 63 73 72 2c 20 72 65 67 54 6d 70  s(p, csr, regTmp
fd80: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e  );.    windowIfN
fd90: 65 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70  ewPeer(pParse, p
fda0: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20  MWin->pOrderBy, 
fdb0: 72 65 67 54 6d 70 2c 20 72 65 67 2c 20 61 64 64  regTmp, reg, add
fdc0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
fdd0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
fde0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
fdf0: 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b 0a 20  regTmp, nReg);. 
fe00: 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72 4e 65   }..  if( addrNe
fe10: 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 73  xtRange ){.    s
fe20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fe30: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
fe40: 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29 3b 0a  addrNextRange);.
fe50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
fe60: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
fe70: 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69 66 28   lblDone);.  if(
fe80: 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69   addrGoto ) sqli
fe90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fea0: 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20  v, addrGoto);.  
feb0: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
fec0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fed0: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 72  (v, addrIf);.  r
fee0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 0a 2f  eturn ret;.}.../
fef0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
ff00: 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c 69  d return a dupli
ff10: 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e 64  cate of the Wind
ff20: 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61  ow object indica
ff30: 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74 68  ted by the.** th
ff40: 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 65  ird argument. Se
ff50: 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f 77  t the Window.pOw
ff60: 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ner field of the
ff70: 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a 2a   new object to.*
ff80: 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e  * pOwner..*/.Win
ff90: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
ffa0: 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  owDup(sqlite3 *d
ffb0: 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72 2c  b, Expr *pOwner,
ffc0: 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57   Window *p){.  W
ffd0: 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b  indow *pNew = 0;
ffe0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
fff0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   ){.    pNew = s
10000 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10010 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 69  ro(db, sizeof(Wi
10020 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20  ndow));.    if( 
10030 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
10040 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ew->zName = sqli
10050 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
10060 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  p->zName);.     
10070 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d   pNew->pFilter =
10080 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10090 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20  db, p->pFilter, 
100a0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
100b0 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e 63  pFunc = p->pFunc
100c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  ;.      pNew->pP
100d0 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74  artition = sqlit
100e0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
100f0 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  , p->pPartition,
10100 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
10110 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
10120 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
10130 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
10140 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10150 65 46 72 6d 54 79 70 65 20 3d 20 70 2d 3e 65 46  eFrmType = p->eF
10160 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e  rmType;.      pN
10170 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45  ew->eEnd = p->eE
10180 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nd;.      pNew->
10190 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61  eStart = p->eSta
101a0 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rt;.      pNew->
101b0 65 45 78 63 6c 75 64 65 20 3d 20 70 2d 3e 65 45  eExclude = p->eE
101c0 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 70 4e  xclude;.      pN
101d0 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  ew->pStart = sql
101e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
101f0 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20  p->pStart, 0);. 
10200 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20       pNew->pEnd 
10210 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
10220 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29  (db, p->pEnd, 0)
10230 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
10240 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20  wner = pOwner;. 
10250 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10260 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
10270 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f   Return a copy o
10280 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
10290 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65  t of Window obje
102a0 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74 68  cts passed as th
102b0 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75  e.** second argu
102c0 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ment..*/.Window 
102d0 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69  *sqlite3WindowLi
102e0 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
102f0 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
10300 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
10310 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20   Window *pRet = 
10320 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70  0;.  Window **pp
10330 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72   = &pRet;..  for
10340 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70  (pWin=p; pWin; p
10350 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
10360 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73  in){.    *pp = s
10370 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28  qlite3WindowDup(
10380 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20  db, 0, pWin);.  
10390 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62    if( *pp==0 ) b
103a0 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26  reak;.    pp = &
103b0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e  ((*pp)->pNextWin
103c0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
103d0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
103e0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
103f0 74 20 63 61 6e 20 62 65 20 64 65 74 65 72 6d 69  t can be determi
10400 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  ned at compile t
10410 69 6d 65 20 74 68 61 74 20 65 78 70 72 65 73 73  ime that express
10420 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20 65 76  ion .** pExpr ev
10430 61 6c 75 61 74 65 73 20 74 6f 20 61 20 76 61 6c  aluates to a val
10440 75 65 20 74 68 61 74 2c 20 77 68 65 6e 20 63 61  ue that, when ca
10450 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
10460 2c 20 69 73 20 67 72 65 61 74 65 72 20 0a 2a 2a  , is greater .**
10470 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61 6c 73   than zero. Fals
10480 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
10490 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
104a0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
104b0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
104c0 65 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c 6c 6f  e Parse.db.mallo
104d0 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c 61 67  cFailed .** flag
104e0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 7a 65 72   and returns zer
104f0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
10500 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72   windowExprGtZer
10510 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10520 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
10530 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20   int ret = 0;.  
10540 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10550 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69  arse->db;.  sqli
10560 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
10570 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  = 0;.  sqlite3Va
10580 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20  lueFromExpr(db, 
10590 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63 2c 20  pExpr, db->enc, 
105a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
105b0 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20 69 66  IC, &pVal);.  if
105c0 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
105d0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
105e0 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 20 3d  )>0 ){.    ret =
105f0 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
10600 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
10610 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
10620 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
10630 57 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73  WhereBegin() has
10640 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
10650 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c  lled for the SEL
10660 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
10670 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
10680 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
10690 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
106a0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49  on is invoked. I
106b0 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63  t generates.** c
106c0 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ode to populate 
106d0 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  the Window.regRe
106e0 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f  sult register fo
106f0 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
10700 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69  nction .** and i
10710 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
10720 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63  utine at instruc
10730 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f  tion addrGosub o
10740 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77  nce for each row
10750 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  ..** sqlite3Wher
10760 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73  eEnd() is always
10770 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
10780 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a  eturning. .**.**
10790 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   This function h
107a0 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64  andles several d
107b0 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
107c0 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c  f window frames,
107d0 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72   which.** requir
107e0 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  e slightly diffe
107f0 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  rent processing.
10800 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
10810 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a  seudo code is.**
10820 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
10830 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73  nt window frames
10840 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
10850 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
10860 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45  EN <expr1> PRECE
10870 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  DING AND <expr2>
10880 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
10890 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72   Other window fr
108a0 61 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61  ame types use va
108b0 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  riants of the fo
108c0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
108d0 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
108e0 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
108f0 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
10900 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
10910 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
10920 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
10930 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
10940 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
10950 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
10960 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
10970 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69  .**       if( fi
10980 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
10990 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
109a0 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72     // Rewind thr
109b0 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20  ee cursors, all 
109c0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20  open on the eph 
109d0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
109e0 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
109f0 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  ;.**         Rew
10a00 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a  ind(csrStart);.*
10a10 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
10a20 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a  (csrCurrent);.**
10a30 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20         .**      
10a40 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
10a50 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20  r2>          // 
10a60 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
10a70 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  sion.**         
10a80 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
10a90 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45  1>        // PRE
10aa0 43 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f  CEDING expressio
10ab0 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  n.**       }else
10ac0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20  {.**         // 
10ad0 46 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  First time this 
10ae0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c  branch is taken,
10af0 20 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63   the eph table c
10b00 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20  ontains two .** 
10b10 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e          // rows.
10b20 20 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   The first row i
10b30 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c  n the partition,
10b40 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65   which all three
10b50 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20   cursors.**     
10b60 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79      // currently
10b70 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74   point to, and t
10b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77  he following row
10b90 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  ..**         AGG
10ba0 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
10bb0 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
10bc0 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
10bd0 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10be0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
10bf0 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10c00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10c10 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20  AGGINVERSE.**   
10c20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
10c30 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10c40 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
10c50 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
10c60 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
10c70 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
10c80 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
10c90 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20   ROW.**         
10ca0 69 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69  if( csrCurrent i
10cb0 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a  s EOF ) break;.*
10cc0 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72  *         if( (r
10cd0 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10ce0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67  .**           Ag
10cf0 67 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72  gInverse(csrStar
10d00 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
10d10 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
10d20 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
10d30 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
10d40 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f   pseudo-code abo
10d50 76 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c  ve uses the foll
10d60 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a  owing shorthand:
10d70 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50  .**.**   AGGSTEP
10d80 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20  :    invoke the 
10d90 61 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28  aggregate xStep(
10da0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  ) function for e
10db0 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
10dc0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ion.**          
10dd0 20 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65       with argume
10de0 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  nts read from th
10df0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
10e00 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20   cursor csrEnd, 
10e10 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
10e20 20 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f        step curso
10e30 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64  r csrEnd forward
10e40 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73   one row (i.e. s
10e50 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
10e60 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55  ))..**.**   RETU
10e70 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61  RN_ROW: return a
10e80 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c   row to the call
10e90 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
10ea0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
10eb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10ec0 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66    current row of
10ed0 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20   csrCurrent and 
10ee0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
10ef0 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20  e of all .**    
10f00 20 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65             aggre
10f10 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70  gates. Then step
10f20 20 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65   cursor csrCurre
10f30 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72  nt forward one r
10f40 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49  ow..**.**   AGGI
10f50 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74  NVERSE: invoke t
10f60 68 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e  he aggregate xIn
10f70 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
10f80 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
10f90 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
10fa0 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74     functions wit
10fb0 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64  h arguments read
10fc0 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
10fd0 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a  t row of cursor.
10fe0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10ff0 20 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20   csrStart. Then 
11000 73 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f  step csrStart fo
11010 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a  rward one row..*
11020 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
11030 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69  wo other ROWS wi
11040 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74  ndow frames that
11050 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67   are handled sig
11060 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69  nificantly.** di
11070 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
11080 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57  he above - "BETW
11090 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45  EEN <expr> PRECE
110a0 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20  DING AND <expr> 
110b0 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e  PRECEDING".** an
110c0 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72  d "BETWEEN <expr
110d0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
110e0 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
110f0 22 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65  ". These are spe
11100 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62  cial .** cases b
11110 65 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e  ecause they chan
11120 67 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  ge the order in 
11130 77 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20  which the three 
11140 63 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72  cursors (csrStar
11150 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74  t,.** csrCurrent
11160 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65   and csrEnd) ite
11170 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
11180 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
11190 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20  . Cases that.** 
111a0 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72  use UNBOUNDED or
111b0 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65   CURRENT ROW are
111c0 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61   much simpler va
111d0 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20  riations on one 
111e0 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65  of these.** thre
111f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  e..**.**   ROWS 
11200 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
11210 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
11220 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
11230 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
11240 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
11250 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11260 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
11270 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
11280 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
11290 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
112a0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
112b0 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
112c0 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
112d0 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
112e0 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
112f0 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
11300 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11310 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11320 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11330 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11340 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
11350 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
11360 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
11370 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
11380 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
11390 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
113a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
113b0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
113c0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
113d0 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
113e0 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
113f0 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
11400 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
11410 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
11420 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
11430 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68    }.**     flush
11440 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  :.**       if( (
11450 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
11460 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
11470 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  EP.**       }.**
11480 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
11490 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  W.**.**.**   ROW
114a0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
114b0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
114c0 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
114d0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
114e0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
114f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11500 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  n() ....**     i
11510 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
11520 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73   ){.**       Gos
11530 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
11540 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  }.**     Insert 
11550 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
11560 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69   table..**     i
11570 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
11580 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
11590 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
115a0 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
115b0 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
115c0 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
115d0 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
115e0 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
115f0 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e  regStart = regEn
11600 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20  d - <expr1>.**  
11610 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
11620 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
11630 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
11640 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11650 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11660 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
11670 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
11680 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
11690 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
116a0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
116b0 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20    }.**   }.**   
116c0 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47  flush:.**     AG
116d0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69  GSTEP.**     whi
116e0 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
116f0 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
11700 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
11710 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
11720 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
11730 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
11740 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28    }.**       if(
11750 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
11760 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
11770 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
11780 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
11790 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  reak.**       }.
117a0 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
117b0 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43  while( !eof csrC
117c0 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20  urrent ){.**    
117d0 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
117e0 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72       }.**.** For
117f0 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20   the most part, 
11800 74 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f  the patterns abo
11810 76 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74  ve are adapted t
11820 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e  o support UNBOUN
11830 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69  DED by.** assumi
11840 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71  ng that it is eq
11850 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66  uivalent to "inf
11860 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f  inity PRECEDING/
11870 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a  FOLLOWING" and.*
11880 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79  * CURRENT ROW by
11890 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
118a0 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20  t is equivilent 
118b0 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f  to "0 PRECEDING/
118c0 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54  FOLLOWING"..** T
118d0 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  his is optimized
118e0 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61   of course - bra
118f0 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20  nches that will 
11900 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61  never be taken a
11910 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  nd.** conditions
11920 20 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73   that are always
11930 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65   true are omitte
11940 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f  d from the VM co
11950 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20  de. The only.** 
11960 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65  exceptional case
11970 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   is:.**.**   ROW
11980 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
11990 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
119a0 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
119b0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
119c0 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
119d0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
119e0 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
119f0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11a00 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11a10 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11a20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
11a30 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11a40 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
11a50 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11a60 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11a70 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
11a80 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
11a90 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
11aa0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
11ab0 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
11ac0 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
11ad0 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
11ae0 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
11af0 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
11b00 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
11b10 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
11b20 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
11b30 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
11b40 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
11b50 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
11b60 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
11b70 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20   ) break.**     
11b80 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54    }.**       RET
11b90 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
11ba0 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21  .**     while( !
11bb0 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29  eof csrCurrent )
11bc0 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52  {.**       RETUR
11bd0 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a  N_ROW.**     }.*
11be0 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72  *.** Also requir
11bf0 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ing special hand
11c00 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73  ling are the cas
11c10 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  es:.**.**   ROWS
11c20 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
11c30 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
11c40 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
11c50 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
11c60 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  EN <expr1> FOLLO
11c70 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  WING AND <expr2>
11c80 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
11c90 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65   when (expr1 < e
11ca0 78 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64  xpr2). This is d
11cb0 65 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69  etected at runti
11cc0 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20  me, not by this 
11cd0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20  function..** To 
11ce0 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65  handle this case
11cf0 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64  , the pseudo-cod
11d00 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63  e programs depic
11d10 74 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f  ted above are mo
11d20 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74  dified.** slight
11d30 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  ly to be:.**.** 
11d40 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
11d50 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
11d60 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
11d70 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70  **     if( new p
11d80 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
11d90 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
11da0 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
11db0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11dc0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
11dd0 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74  **     if( first
11de0 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
11df0 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65  n ){.**       Re
11e00 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
11e10 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
11e20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
11e30 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65  ent).**       re
11e40 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
11e50 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
11e60 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
11e70 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c      if( regEnd <
11e80 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20   regStart ){.** 
11e90 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
11ea0 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  OW.**         de
11eb0 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63  lete eph table c
11ec0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
11ed0 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20     continue.**  
11ee0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e       }.**     ..
11ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
11f00 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65  "continue" state
11f10 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76  ment in the abov
11f20 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e  e jumps to the n
11f30 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a  ext iteration.**
11f40 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
11f50 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61  op - the one sta
11f60 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
11f70 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a  hereBegin()..**.
11f80 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47  ** The various G
11f90 52 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20  ROUPS cases are 
11fa0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
11fb0 67 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65  g the same patte
11fc0 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20  rns as.** ROWS. 
11fd0 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d  The VM code is m
11fe0 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79  odified slightly
11ff0 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20   so that:.**.** 
12000 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72    1. The else br
12010 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e  anch in the main
12020 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61   loop is only ta
12030 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a  ken if the row j
12040 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65  ust.**      adde
12050 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  d to the ephemer
12060 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  al table is the 
12070 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67  start of a new g
12080 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20  roup. In.**     
12090 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
120a0 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20   becomes:.**.** 
120b0 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70          ... loop
120c0 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
120d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
120e0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ....**         i
120f0 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
12100 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12110 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12120 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
12130 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
12140 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
12150 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  le..**         i
12160 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
12170 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
12180 20 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64            Rewind
12190 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
121a0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
121b0 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
121c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
121d0 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
121e0 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53  *           regS
121f0 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
12200 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  *         }else 
12210 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b  if( new group ){
12220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e  .**           ..
12230 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  . .**         }.
12240 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
12250 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66     2. Instead of
12260 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69   processing a si
12270 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52  ngle row, each R
12280 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54  ETURN_ROW, AGGST
12290 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41  EP or .**      A
122a0 47 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70  GGINVERSE step p
122b0 72 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72  rocesses the cur
122c0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
122d0 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20  relevant cursor 
122e0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20  and.**      all 
122f0 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20  subsequent rows 
12300 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
12310 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a   same group..**.
12320 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20  ** RANGE window 
12330 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74  frames are a lit
12340 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67  tle different ag
12350 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55  ain. As for GROU
12360 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  PS, the .** main
12370 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
12380 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20  per group only. 
12390 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20  And RETURN_ROW, 
123a0 41 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49  AGGSTEP and AGGI
123b0 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69  NVERSE.** deal i
123c0 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64  n groups instead
123d0 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72   of rows. As for
123e0 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53   ROWS and GROUPS
123f0 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
12400 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73  e.** basic cases
12410 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20  :.**.**   RANGE 
12420 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
12430 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
12440 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  xpr2> FOLLOWING.
12450 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
12460 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
12470 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
12480 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
12490 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
124a0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
124b0 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
124c0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
124d0 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
124e0 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
124f0 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
12500 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
12510 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
12520 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
12530 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
12540 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
12550 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
12560 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
12570 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
12580 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
12590 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
125a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
125b0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  TEP.**         w
125c0 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
125d0 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20  t.key + regEnd) 
125e0 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a  < csrEnd.key ){.
125f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54  **           RET
12600 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
12610 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53       while( csrS
12620 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74  tart.key + regSt
12630 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e  art) < csrCurren
12640 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
12650 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
12660 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  SE.**           
12670 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  }.**         }.*
12680 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12690 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
126a0 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45  .**       AGGSTE
126b0 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  P.**       while
126c0 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
126d0 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20    RETURN ROW.** 
126e0 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43          if( csrC
126f0 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20  urrent is EOF ) 
12700 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
12710 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
12720 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
12730 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
12740 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
12750 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
12760 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
12770 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
12780 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49         }.**.** I
12790 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61  n the above nota
127a0 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20  tion, "csr.key" 
127b0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e  means the curren
127c0 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f  t value of the O
127d0 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72  RDER BY .** expr
127e0 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73  ession (there is
127f0 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72   only ever 1 for
12800 20 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73   a RANGE that us
12810 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c  es an <expr> FOL
12820 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78  LOWING.** or <ex
12830 70 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65  pr PRECEDING) re
12840 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63  ad from cursor c
12850 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  sr..**.**   RANG
12860 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
12870 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
12880 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
12890 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
128a0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
128b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
128c0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
128d0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
128e0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
128f0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12900 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12910 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12920 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12930 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12940 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12950 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12960 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12970 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12980 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
12990 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
129a0 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
129b0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
129c0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
129d0 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
129e0 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e{.**         if
129f0 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20  ( (csrEnd.key + 
12a00 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43 75  regEnd) <= csrCu
12a10 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20  rrent.key ){.** 
12a20 20 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45            AGGSTE
12a30 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  P.**         }.*
12a40 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  *         while(
12a50 20 28 63 73 72 53 74 61 72 74 2e 6b 65 79 20 2b   (csrStart.key +
12a60 20 72 65 67 53 74 61 72 74 29 20 3c 20 63 73 72   regStart) < csr
12a70 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
12a80 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49  *           AGGI
12a90 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20  NVERSE.**       
12aa0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52    }.**         R
12ab0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12ac0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
12ad0 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20       flush:.**  
12ae0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
12af0 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  End.key + regEnd
12b00 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e 74 2e  ) <= csrCurrent.
12b10 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
12b20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
12b30 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68     }.**       wh
12b40 69 6c 65 28 20 28 63 73 72 53 74 61 72 74 2e 6b  ile( (csrStart.k
12b50 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20 3c  ey + regStart) <
12b60 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20   csrCurrent.key 
12b70 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  ){.**         AG
12b80 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
12b90 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54    }.**       RET
12ba0 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20  URN_ROW.**.**   
12bb0 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65  RANGE BETWEEN <e
12bc0 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  xpr1> FOLLOWING 
12bd0 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c  AND <expr2> FOLL
12be0 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
12bf0 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
12c00 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
12c10 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
12c20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72       if( new par
12c30 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
12c40 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
12c50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12c60 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
12c70 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
12c80 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  le..**       if(
12c90 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61   first row of pa
12ca0 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
12cb0 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
12cc0 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
12cd0 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
12ce0 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
12cf0 20 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d          regEnd =
12d00 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
12d10 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
12d20 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20  expr1>.**       
12d30 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20  }else{.**       
12d40 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
12d50 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
12d60 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65  Current.key + re
12d70 67 45 6e 64 29 20 3c 20 63 73 72 45 6e 64 2e 6b  gEnd) < csrEnd.k
12d80 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ey ){.**        
12d90 20 20 20 77 68 69 6c 65 28 20 28 63 73 72 43 75     while( (csrCu
12da0 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 53  rrent.key + regS
12db0 74 61 72 74 29 20 3e 20 63 73 72 53 74 61 72 74  tart) > csrStart
12dc0 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
12dd0 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
12de0 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
12df0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45  .**           RE
12e00 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
12e10 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
12e20 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
12e30 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20   flush:.**      
12e40 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
12e50 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
12e60 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12e70 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
12e80 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20 63 73  + regStart) > cs
12e90 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a  rStart.key ){.**
12ea0 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
12eb0 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
12ec0 20 20 20 69 66 28 20 65 6f 66 20 29 20 62 72 65     if( eof ) bre
12ed0 61 6b 20 22 77 68 69 6c 65 28 20 31 20 29 22 20  ak "while( 1 )" 
12ee0 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20 20 20 20 20  loop..**        
12ef0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
12f00 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
12f10 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69    }.**       whi
12f20 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75 72 72  le( !eof csrCurr
12f30 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ent ){.**       
12f40 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
12f50 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68        }.**.** Th
12f60 65 20 74 65 78 74 20 61 62 6f 76 65 20 6c 65 61  e text above lea
12f70 76 65 73 20 6f 75 74 20 6d 61 6e 79 20 64 65 74  ves out many det
12f80 61 69 6c 73 2e 20 52 65 66 65 72 20 74 6f 20 74  ails. Refer to t
12f90 68 65 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  he code and comm
12fa0 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f 77 20 66 6f  ents.** below fo
12fb0 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 74  r a more complet
12fc0 65 20 70 69 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  e picture..*/.vo
12fd0 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
12fe0 43 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72 73  CodeStep(.  Pars
12ff0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
13010 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
13020 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 20 20 2f 2a 20 52 65 77 72 69 74 74 65 6e 20 53    /* Rewritten S
13050 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13060 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
13070 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  pWInfo,         
13080 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
13090 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
130a0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
130b0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  */.  int regGosu
130c0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
130d0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
130e0 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20 2a 2f   for OP_Gosub */
130f0 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75 62 20 68     /* OP_Gosub h
13120 65 72 65 20 74 6f 20 72 65 74 75 72 6e 20 65 61  ere to return ea
13130 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57  ch row */.){.  W
13140 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
13150 2d 3e 70 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69  ->pWin;.  ExprLi
13160 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
13170 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  MWin->pOrderBy;.
13180 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13190 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
131a0 65 29 3b 0a 20 20 69 6e 74 20 63 73 72 57 72 69  e);.  int csrWri
131b0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
131c0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
131d0 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
131e0 20 65 70 68 2e 20 74 61 62 6c 65 20 2a 2f 0a 20   eph. table */. 
131f0 20 69 6e 74 20 63 73 72 49 6e 70 75 74 20 3d 20   int csrInput = 
13200 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
13210 75 72 73 6f 72 3b 20 20 20 20 20 2f 2a 20 43 75  ursor;     /* Cu
13220 72 73 6f 72 20 6f 66 20 73 75 62 2d 73 65 6c 65  rsor of sub-sele
13230 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  ct */.  int nInp
13240 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ut = p->pSrc->a[
13250 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 20  0].pTab->nCol;  
13260 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
13270 6f 6c 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ols returned by 
13280 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  sub */.  int iIn
13290 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
132c0 20 74 68 72 6f 75 67 68 20 73 75 62 20 63 6f 6c   through sub col
132d0 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  s */.  int addrN
132e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
132f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13300 73 20 6f 66 20 4f 50 5f 4e 65 20 2a 2f 0a 20 20  s of OP_Ne */.  
13310 69 6e 74 20 61 64 64 72 47 6f 73 75 62 46 6c 75  int addrGosubFlu
13320 73 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sh = 0;         
13330 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
13340 5f 47 6f 73 75 62 20 74 6f 20 66 6c 75 73 68 3a  _Gosub to flush:
13350 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
13360 74 65 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  teger = 0;      
13370 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13380 20 6f 66 20 4f 50 5f 49 6e 74 65 67 65 72 20 2a   of OP_Integer *
13390 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6d 70 74  /.  int addrEmpt
133a0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
133b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
133c0 66 20 4f 50 5f 52 65 77 69 6e 64 20 69 6e 20 66  f OP_Rewind in f
133d0 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 72  lush: */.  int r
133e0 65 67 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20  egStart = 0;    
133f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
13400 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 50 52  lue of <expr> PR
13410 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  ECEDING */.  int
13420 20 72 65 67 45 6e 64 20 3d 20 30 3b 20 20 20 20   regEnd = 0;    
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13440 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20  Value of <expr> 
13450 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69  FOLLOWING */.  i
13460 6e 74 20 72 65 67 4e 65 77 3b 20 20 20 20 20 20  nt regNew;      
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13480 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73  * Array of regis
13490 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 6e 65 77  ters holding new
134a0 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20   input row */.  
134b0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 2f 2a 20 72 65 67 4e 65 77 20 61 72 72 61 79 20  /* regNew array 
134e0 69 6e 20 72 65 63 6f 72 64 20 66 6f 72 6d 20 2a  in record form *
134f0 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  /.  int regRowid
13500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13510 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
13520 20 72 65 67 52 65 63 6f 72 64 20 69 6e 20 65 70   regRecord in ep
13530 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  h table */.  int
13540 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 30 3b   regNewPeer = 0;
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13560 50 65 65 72 20 76 61 6c 75 65 73 20 66 6f 72 20  Peer values for 
13570 6e 65 77 20 72 6f 77 20 28 70 61 72 74 20 6f 66  new row (part of
13580 20 72 65 67 4e 65 77 29 20 2a 2f 0a 20 20 69 6e   regNew) */.  in
13590 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20  t regPeer = 0;  
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135b0 20 50 65 65 72 20 76 61 6c 75 65 73 20 66 6f 72   Peer values for
135c0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   current row */.
135d0 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61    int regFlushPa
135e0 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rt = 0;         
135f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
13600 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70  r "Gosub flush_p
13610 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 57  artition" */.  W
13620 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 73 3b 20  indowCodeArg s; 
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13640 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
13650 20 66 6f 72 20 73 75 62 2d 72 6f 75 74 69 6e 65   for sub-routine
13660 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 57 68  s */.  int lblWh
13670 65 72 65 45 6e 64 3b 20 20 20 20 20 20 20 20 20  ereEnd;         
13680 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
13690 6a 75 73 74 20 62 65 66 6f 72 65 20 73 71 6c 69  just before sqli
136a0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 63 6f  te3WhereEnd() co
136b0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
136c0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
136d0 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20  TK_PRECEDING || 
136e0 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
136f0 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20  K_CURRENT .     
13700 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
13710 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
13720 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
13730 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
13740 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
13750 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
13760 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57  FOLLOWING || pMW
13770 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
13780 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  RENT .       || 
13790 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
137a0 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 70 4d 57  UNBOUNDED || pMW
137b0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
137c0 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 20 20 61  CEDING .  );.  a
137d0 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
137e0 78 63 6c 75 64 65 3d 3d 30 20 7c 7c 20 70 4d 57  xclude==0 || pMW
137f0 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b  in->eExclude==TK
13800 5f 43 55 52 52 45 4e 54 0a 20 20 20 20 20 20 20  _CURRENT.       
13810 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13820 64 65 3d 3d 54 4b 5f 47 52 4f 55 50 20 7c 7c 20  de==TK_GROUP || 
13830 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d  pMWin->eExclude=
13840 3d 54 4b 5f 54 49 45 53 0a 20 20 20 20 20 20 20  =TK_TIES.       
13850 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13860 64 65 3d 3d 54 4b 5f 4e 4f 0a 20 20 29 3b 0a 0a  de==TK_NO.  );..
13870 20 20 6c 62 6c 57 68 65 72 65 45 6e 64 20 3d 20    lblWhereEnd = 
13880 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
13890 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
138a0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
138b0 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a  context object *
138c0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  /.  memset(&s, 0
138d0 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 43  , sizeof(WindowC
138e0 6f 64 65 41 72 67 29 29 3b 0a 20 20 73 2e 70 50  odeArg));.  s.pP
138f0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
13900 20 73 2e 70 4d 57 69 6e 20 3d 20 70 4d 57 69 6e   s.pMWin = pMWin
13910 3b 0a 20 20 73 2e 70 56 64 62 65 20 3d 20 76 3b  ;.  s.pVdbe = v;
13920 0a 20 20 73 2e 72 65 67 47 6f 73 75 62 20 3d 20  .  s.regGosub = 
13930 72 65 67 47 6f 73 75 62 3b 0a 20 20 73 2e 61 64  regGosub;.  s.ad
13940 64 72 47 6f 73 75 62 20 3d 20 61 64 64 72 47 6f  drGosub = addrGo
13950 73 75 62 3b 0a 20 20 73 2e 63 75 72 72 65 6e 74  sub;.  s.current
13960 2e 63 73 72 20 3d 20 70 4d 57 69 6e 2d 3e 69 45  .csr = pMWin->iE
13970 70 68 43 73 72 3b 0a 20 20 63 73 72 57 72 69 74  phCsr;.  csrWrit
13980 65 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  e = s.current.cs
13990 72 2b 31 3b 0a 20 20 73 2e 73 74 61 72 74 2e 63  r+1;.  s.start.c
139a0 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63  sr = s.current.c
139b0 73 72 2b 32 3b 0a 20 20 73 2e 65 6e 64 2e 63 73  sr+2;.  s.end.cs
139c0 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  r = s.current.cs
139d0 72 2b 33 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  r+3;..  /* Figur
139e0 65 20 6f 75 74 20 77 68 65 6e 20 72 6f 77 73 20  e out when rows 
139f0 6d 61 79 20 62 65 20 64 65 6c 65 74 65 64 20 66  may be deleted f
13a00 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65 72 61  rom the ephemera
13a10 6c 20 74 61 62 6c 65 2e 20 54 68 65 72 65 0a 20  l table. There. 
13a20 20 2a 2a 20 61 72 65 20 66 6f 75 72 20 6f 70 74   ** are four opt
13a30 69 6f 6e 73 20 2d 20 74 68 65 79 20 6d 61 79 20  ions - they may 
13a40 6e 65 76 65 72 20 62 65 20 64 65 6c 65 74 65 64  never be deleted
13a50 20 28 65 44 65 6c 65 74 65 3d 3d 30 29 2c 20 74   (eDelete==0), t
13a60 68 65 79 20 6d 61 79 20 0a 20 20 2a 2a 20 62 65  hey may .  ** be
13a70 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e   deleted as soon
13a80 20 61 73 20 74 68 65 79 20 61 72 65 20 6e 6f 20   as they are no 
13a90 6c 6f 6e 67 65 72 20 70 61 72 74 20 6f 66 20 74  longer part of t
13aa0 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 0a  he window frame.
13ab0 20 20 2a 2a 20 28 65 44 65 6c 65 74 65 3d 3d 57    ** (eDelete==W
13ac0 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
13ad0 29 2c 20 74 68 65 79 20 6d 61 79 20 62 65 20 64  ), they may be d
13ae0 65 6c 65 74 65 64 20 61 73 20 61 66 74 65 72 20  eleted as after 
13af0 74 68 65 20 72 6f 77 20 0a 20 20 2a 2a 20 68 61  the row .  ** ha
13b00 73 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  s been returned 
13b10 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 57  to the caller (W
13b20 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
13b30 29 2c 20 6f 72 20 74 68 65 79 20 6d 61 79 0a 20  ), or they may. 
13b40 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
13b50 66 74 65 72 20 74 68 65 79 20 65 6e 74 65 72 20  fter they enter 
13b60 74 68 65 20 66 72 61 6d 65 20 28 57 49 4e 44 4f  the frame (WINDO
13b70 57 5f 41 47 47 53 54 45 50 29 2e 20 2a 2f 0a 20  W_AGGSTEP). */. 
13b80 20 73 77 69 74 63 68 28 20 70 4d 57 69 6e 2d 3e   switch( pMWin->
13b90 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 63 61  eStart ){.    ca
13ba0 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 3a  se TK_FOLLOWING:
13bb0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
13bc0 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52  ->eFrmType!=TK_R
13bd0 41 4e 47 45 0a 20 20 20 20 20 20 20 26 26 20 77  ANGE.       && w
13be0 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72 6f 28  indowExprGtZero(
13bf0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70  pParse, pMWin->p
13c00 53 74 61 72 74 29 0a 20 20 20 20 20 20 29 7b 0a  Start).      ){.
13c10 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74          s.eDelet
13c20 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  e = WINDOW_RETUR
13c30 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20  N_ROW;.      }. 
13c40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13c50 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  case TK_UNBOUNDE
13c60 44 3a 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e  D:.      if( win
13c70 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28 70 4d  dowCacheFrame(pM
13c80 57 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Win)==0 ){.     
13c90 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45     if( pMWin->eE
13ca0 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
13cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
13cc0 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70  ( pMWin->eFrmTyp
13cd0 65 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20 20 20  e!=TK_RANGE.    
13ce0 20 20 20 20 20 20 20 26 26 20 77 69 6e 64 6f 77         && window
13cf0 45 78 70 72 47 74 5a 65 72 6f 28 70 50 61 72 73  ExprGtZero(pPars
13d00 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 29 0a  e, pMWin->pEnd).
13d10 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
13d20 20 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65           s.eDele
13d30 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47 47 53  te = WINDOW_AGGS
13d40 54 45 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  TEP;.          }
13d50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13d60 20 20 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c            s.eDel
13d70 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54  ete = WINDOW_RET
13d80 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20  URN_ROW;.       
13d90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
13db0 75 6c 74 3a 0a 20 20 20 20 20 20 73 2e 65 44 65  ult:.      s.eDe
13dc0 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47  lete = WINDOW_AG
13dd0 47 49 4e 56 45 52 53 45 3b 0a 20 20 20 20 20 20  GINVERSE;.      
13de0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
13df0 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
13e00 65 72 73 20 66 6f 72 20 74 68 65 20 61 72 72 61  ers for the arra
13e10 79 20 6f 66 20 76 61 6c 75 65 73 20 66 72 6f 6d  y of values from
13e20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c 20   the sub-query, 
13e30 74 68 65 0a 20 20 2a 2a 20 73 61 6d 76 65 20 76  the.  ** samve v
13e40 61 6c 75 65 73 20 69 6e 20 72 65 63 6f 72 64 20  alues in record 
13e50 66 6f 72 6d 2c 20 61 6e 64 20 74 68 65 20 72 6f  form, and the ro
13e60 77 69 64 20 75 73 65 64 20 74 6f 20 69 6e 73 65  wid used to inse
13e70 72 74 20 73 61 69 64 20 72 65 63 6f 72 64 0a 20  rt said record. 
13e80 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 65 70 68   ** into the eph
13e90 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
13ea0 2f 0a 20 20 72 65 67 4e 65 77 20 3d 20 70 50 61  /.  regNew = pPa
13eb0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70  rse->nMem+1;.  p
13ec0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
13ed0 49 6e 70 75 74 3b 0a 20 20 72 65 67 52 65 63 6f  Input;.  regReco
13ee0 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
13ef0 4d 65 6d 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  Mem;.  regRowid 
13f00 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13f10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 77  ;..  /* If the w
13f20 69 6e 64 6f 77 20 66 72 61 6d 65 20 63 6f 6e 74  indow frame cont
13f30 61 69 6e 73 20 61 6e 20 22 3c 65 78 70 72 3e 20  ains an "<expr> 
13f40 50 52 45 43 45 44 49 4e 47 22 20 6f 72 20 22 3c  PRECEDING" or "<
13f50 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  expr> FOLLOWING"
13f60 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 61 6c  .  ** clause, al
13f70 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 73  locate registers
13f80 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
13f90 73 75 6c 74 73 20 6f 66 20 65 76 61 6c 75 61 74  sults of evaluat
13fa0 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 3c 65  ing each.  ** <e
13fb0 78 70 72 3e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  xpr>.  */.  if( 
13fc0 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
13fd0 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70  K_PRECEDING || p
13fe0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
13ff0 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
14000 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70    regStart = ++p
14010 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
14020 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
14030 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
14040 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
14050 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
14060 0a 20 20 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b  .    regEnd = ++
14070 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14080 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
14090 69 73 20 6e 6f 74 20 61 20 22 52 4f 57 53 20 42  is not a "ROWS B
140a0 45 54 57 45 45 4e 20 2e 2e 2e 22 20 66 72 61 6d  ETWEEN ..." fram
140b0 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  e, then allocate
140c0 20 61 72 72 61 79 73 20 6f 66 0a 20 20 2a 2a 20   arrays of.  ** 
140d0 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 6f  registers to sto
140e0 72 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  re copies of the
140f0 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
14100 73 69 6f 6e 73 20 28 70 65 65 72 20 76 61 6c 75  sions (peer valu
14110 65 73 29 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  es) .  ** for th
14120 65 20 6d 61 69 6e 20 6c 6f 6f 70 2c 20 61 6e 64  e main loop, and
14130 20 66 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   for each cursor
14140 20 28 73 74 61 72 74 2c 20 63 75 72 72 65 6e 74   (start, current
14150 20 61 6e 64 20 65 6e 64 29 2e 20 2a 2f 0a 20 20   and end). */.  
14160 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54  if( pMWin->eFrmT
14170 79 70 65 21 3d 54 4b 5f 52 4f 57 53 20 29 7b 0a  ype!=TK_ROWS ){.
14180 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20      int nPeer = 
14190 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64  (pOrderBy ? pOrd
141a0 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29  erBy->nExpr : 0)
141b0 3b 0a 20 20 20 20 72 65 67 4e 65 77 50 65 65 72  ;.    regNewPeer
141c0 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d 57 69   = regNew + pMWi
141d0 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20  n->nBufferCol;. 
141e0 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50     if( pMWin->pP
141f0 61 72 74 69 74 69 6f 6e 20 29 20 72 65 67 4e 65  artition ) regNe
14200 77 50 65 65 72 20 2b 3d 20 70 4d 57 69 6e 2d 3e  wPeer += pMWin->
14210 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70  pPartition->nExp
14220 72 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20 3d  r;.    regPeer =
14230 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
14240 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
14250 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20  Mem += nPeer;.  
14260 20 20 73 2e 73 74 61 72 74 2e 72 65 67 20 3d 20    s.start.reg = 
14270 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20  pParse->nMem+1; 
14280 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
14290 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e 63  = nPeer;.    s.c
142a0 75 72 72 65 6e 74 2e 72 65 67 20 3d 20 70 50 61  urrent.reg = pPa
142b0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 70 50 61  rse->nMem+1; pPa
142c0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
142d0 65 72 3b 0a 20 20 20 20 73 2e 65 6e 64 2e 72 65  er;.    s.end.re
142e0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
142f0 2b 31 3b 20 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;     pParse->
14300 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20  nMem += nPeer;. 
14310 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   }..  /* Load th
14320 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
14330 66 6f 72 20 74 68 65 20 72 6f 77 20 72 65 74 75  for the row retu
14340 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  rned by the sub-
14350 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69 6e 74 6f  select.  ** into
14360 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
14370 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
14380 61 74 20 72 65 67 4e 65 77 2e 20 41 73 73 65 6d  at regNew. Assem
14390 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a 20 20  ble them into.  
143a0 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 6e 20 72  ** a record in r
143b0 65 67 69 73 74 65 72 20 72 65 67 52 65 63 6f 72  egister regRecor
143c0 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 49 6e 70  d. */.  for(iInp
143d0 75 74 3d 30 3b 20 69 49 6e 70 75 74 3c 6e 49 6e  ut=0; iInput<nIn
143e0 70 75 74 3b 20 69 49 6e 70 75 74 2b 2b 29 7b 0a  put; iInput++){.
143f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14400 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
14410 6d 6e 2c 20 63 73 72 49 6e 70 75 74 2c 20 69 49  mn, csrInput, iI
14420 6e 70 75 74 2c 20 72 65 67 4e 65 77 2b 69 49 6e  nput, regNew+iIn
14430 70 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  put);.  }.  sqli
14440 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14450 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
14460 72 65 67 4e 65 77 2c 20 6e 49 6e 70 75 74 2c 20  regNew, nInput, 
14470 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f  regRecord);..  /
14480 2a 20 41 6e 20 69 6e 70 75 74 20 72 6f 77 20 68  * An input row h
14490 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 65 61  as just been rea
144a0 64 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  d into an array 
144b0 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61  of registers sta
144c0 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 72 65  rting.  ** at re
144d0 67 4e 65 77 2e 20 49 66 20 74 68 65 20 77 69 6e  gNew. If the win
144e0 64 6f 77 20 68 61 73 20 61 20 50 41 52 54 49 54  dow has a PARTIT
144f0 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74 68 69 73  ION clause, this
14500 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74 65 73   block generates
14510 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64 65 20 74   .  ** VM code t
14520 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 69  o check if the i
14530 6e 70 75 74 20 72 6f 77 20 69 73 20 74 68 65 20  nput row is the 
14540 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70  start of a new p
14550 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  artition..  ** I
14560 66 20 73 6f 2c 20 69 74 20 64 6f 65 73 20 61 6e  f so, it does an
14570 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 61 6e 20   OP_Gosub to an 
14580 61 64 64 72 65 73 73 20 74 6f 20 62 65 20 66 69  address to be fi
14590 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72 2e 20 54  lled in later. T
145a0 68 65 0a 20 20 2a 2a 20 61 64 64 72 65 73 73 20  he.  ** address 
145b0 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73 75 62 20  of the OP_Gosub 
145c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6c 6f 63  is stored in loc
145d0 61 6c 20 76 61 72 69 61 62 6c 65 20 61 64 64 72  al variable addr
145e0 47 6f 73 75 62 46 6c 75 73 68 2e 20 2a 2f 0a 20  GosubFlush. */. 
145f0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72   if( pMWin->pPar
14600 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  tition ){.    in
14610 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70 72  t addr;.    Expr
14620 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
14630 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
14640 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d  .    int nPart =
14650 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b 0a 20   pPart->nExpr;. 
14660 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72     int regNewPar
14670 74 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d 57  t = regNew + pMW
14680 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a  in->nBufferCol;.
14690 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
146a0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
146b0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
146c0 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  st(pParse, pPart
146d0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 72 65  , 0, 0);..    re
146e0 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70  gFlushPart = ++p
146f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
14700 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14710 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14720 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
14730 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
14740 61 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20 20 20  art, nPart);.   
14750 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
14760 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
14770 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
14780 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
14790 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
147a0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
147b0 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b  addr+4, addr+2);
147c0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
147d0 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 61 64  eEqNe(v);.    ad
147e0 64 72 47 6f 73 75 62 46 6c 75 73 68 20 3d 20 73  drGosubFlush = s
147f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14800 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
14810 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20  gFlushPart);.   
14820 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
14830 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72   "call flush_par
14840 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20 20 73  tition"));.    s
14850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14860 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
14870 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
14880 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31  regPart, nPart-1
14890 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  );.  }..  /* Ins
148a0 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
148b0 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  into the ephemer
148c0 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  al table */.  sq
148d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
148e0 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
148f0 63 73 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77  csrWrite, regRow
14900 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
14910 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
14920 6e 73 65 72 74 2c 20 63 73 72 57 72 69 74 65 2c  nsert, csrWrite,
14930 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52   regRecord, regR
14940 6f 77 69 64 29 3b 0a 20 20 61 64 64 72 4e 65 20  owid);.  addrNe 
14950 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14960 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 70 4d  Op3(v, OP_Ne, pM
14970 57 69 6e 2d 3e 72 65 67 4f 6e 65 2c 20 30 2c 20  Win->regOne, 0, 
14980 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56 64 62  regRowid);.  Vdb
14990 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
149a0 6c 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ll(v);..  /* Thi
149b0 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66  s block is run f
149c0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  or the first row
149d0 20 6f 66 20 65 61 63 68 20 70 61 72 74 69 74 69   of each partiti
149e0 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67  on */.  s.regArg
149f0 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63   = windowInitAcc
14a00 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  um(pParse, pMWin
14a10 29 3b 0a 0a 20 20 69 66 28 20 72 65 67 53 74 61  );..  if( regSta
14a20 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
14a30 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
14a40 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c  , pMWin->pStart,
14a50 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20   regStart);.    
14a60 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65  windowCheckValue
14a70 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61 72  (pParse, regStar
14a80 74 2c 20 30 20 2b 20 28 70 4d 57 69 6e 2d 3e 65  t, 0 + (pMWin->e
14a90 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  FrmType==TK_RANG
14aa0 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d  E ? 3 : 0));.  }
14ab0 0a 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b  .  if( regEnd ){
14ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
14ad0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57  Code(pParse, pMW
14ae0 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64  in->pEnd, regEnd
14af0 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
14b00 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  ckValue(pParse, 
14b10 72 65 67 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57  regEnd, 1 + (pMW
14b20 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b  in->eFrmType==TK
14b30 5f 52 41 4e 47 45 20 3f 20 33 20 3a 20 30 29 29  _RANGE ? 3 : 0))
14b40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
14b50 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 70 4d 57 69  in->eStart==pMWi
14b60 6e 2d 3e 65 45 6e 64 20 26 26 20 72 65 67 53 74  n->eEnd && regSt
14b70 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  art ){.    int o
14b80 70 20 3d 20 28 28 70 4d 57 69 6e 2d 3e 65 53 74  p = ((pMWin->eSt
14b90 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
14ba0 47 29 20 3f 20 4f 50 5f 47 65 20 3a 20 4f 50 5f  G) ? OP_Ge : OP_
14bb0 4c 65 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Le);.    int add
14bc0 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rGe = sqlite3Vdb
14bd0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
14be0 65 67 53 74 61 72 74 2c 20 30 2c 20 72 65 67 45  egStart, 0, regE
14bf0 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nd);.    VdbeCov
14c00 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
14c10 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  (v, op==OP_Ge); 
14c20 2f 2a 20 4e 65 76 65 72 4e 75 6c 6c 20 62 65 63  /* NeverNull bec
14c30 61 75 73 65 20 62 6f 75 6e 64 20 3c 65 78 70 72  ause bound <expr
14c40 3e 20 2a 2f 0a 20 20 20 20 56 64 62 65 43 6f 76  > */.    VdbeCov
14c50 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
14c60 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  (v, op==OP_Le); 
14c70 2f 2a 20 20 20 76 61 6c 75 65 73 20 70 72 65 76  /*   values prev
14c80 69 6f 75 73 6c 79 20 63 68 65 63 6b 65 64 20 2a  iously checked *
14c90 2f 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46  /.    windowAggF
14ca0 69 6e 61 6c 28 26 73 2c 20 30 29 3b 0a 20 20 20  inal(&s, 0);.   
14cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14cc0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
14cd0 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20   s.current.csr, 
14ce0 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
14cf0 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
14d00 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74  );.    windowRet
14d10 75 72 6e 4f 6e 65 52 6f 77 28 26 73 29 3b 0a 20  urnOneRow(&s);. 
14d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d30 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
14d40 53 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e  Sorter, s.curren
14d50 74 2e 63 73 72 29 3b 0a 20 20 20 20 73 71 6c 69  t.csr);.    sqli
14d60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14d70 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c   OP_Goto, 0, lbl
14d80 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 20 20 73  WhereEnd);.    s
14d90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14da0 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20  re(v, addrGe);. 
14db0 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
14dc0 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
14dd0 57 49 4e 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65  WING && pMWin->e
14de0 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47  FrmType!=TK_RANG
14df0 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b 0a 20  E && regEnd ){. 
14e00 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
14e10 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
14e20 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69  WING );.    sqli
14e30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14e40 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65   OP_Subtract, re
14e50 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20  gStart, regEnd, 
14e60 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a  regStart);.  }..
14e70 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
14e80 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
14e90 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
14ea0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14eb0 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61 72 74  _Rewind, s.start
14ec0 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20 20 56 64  .csr, 1);.    Vd
14ed0 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
14ee0 61 6b 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 73  aken(v);.  }.  s
14ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14f00 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73  (v, OP_Rewind, s
14f10 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 31 29  .current.csr, 1)
14f20 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
14f30 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20  NeverTaken(v);. 
14f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f50 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
14f60 20 73 2e 65 6e 64 2e 63 73 72 2c 20 31 29 3b 0a   s.end.csr, 1);.
14f70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
14f80 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 69  verTaken(v);.  i
14f90 66 28 20 72 65 67 50 65 65 72 20 26 26 20 70 4f  f( regPeer && pO
14fa0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
14fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14fc0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
14fd0 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
14fe0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
14ff0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
15000 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15010 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20  _Copy, regPeer, 
15020 73 2e 73 74 61 72 74 2e 72 65 67 2c 20 70 4f 72  s.start.reg, pOr
15030 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
15040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15050 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
15060 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 63 75  y, regPeer, s.cu
15070 72 72 65 6e 74 2e 72 65 67 2c 20 70 4f 72 64 65  rrent.reg, pOrde
15080 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  rBy->nExpr-1);. 
15090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
150a0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
150b0 20 72 65 67 50 65 65 72 2c 20 73 2e 65 6e 64 2e   regPeer, s.end.
150c0 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  reg, pOrderBy->n
150d0 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Expr-1);.  }..  
150e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
150f0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15100 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 0a   lblWhereEnd);..
15110 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15120 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65 29  pHere(v, addrNe)
15130 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e  ;..  /* Beginnin
15140 67 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 65  g of the block e
15150 78 65 63 75 74 65 64 20 66 6f 72 20 74 68 65 20  xecuted for the 
15160 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
15170 71 75 65 6e 74 20 72 6f 77 73 2e 20 2a 2f 0a 20  quent rows. */. 
15180 20 69 66 28 20 72 65 67 50 65 65 72 20 29 7b 0a   if( regPeer ){.
15190 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65 77 50      windowIfNewP
151a0 65 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  eer(pParse, pOrd
151b0 65 72 42 79 2c 20 72 65 67 4e 65 77 50 65 65 72  erBy, regNewPeer
151c0 2c 20 72 65 67 50 65 65 72 2c 20 6c 62 6c 57 68  , regPeer, lblWh
151d0 65 72 65 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 69  ereEnd);.  }.  i
151e0 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
151f0 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
15200 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  {.    windowCode
15210 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15220 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20  GSTEP, 0, 0);.  
15230 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
15240 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d!=TK_UNBOUNDED 
15250 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  ){.      if( pMW
15260 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b  in->eFrmType==TK
15270 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
15280 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
15290 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
152b0 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
152c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
152d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
152e0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61      windowCodeRa
152f0 6e 67 65 54 65 73 74 28 26 73 2c 20 4f 50 5f 47  ngeTest(&s, OP_G
15300 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  e, s.current.csr
15310 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e  , regEnd, s.end.
15320 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  csr, lbl);.     
15330 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15340 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15350 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
15360 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e   0);.        win
15370 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15380 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
15390 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
153a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
153b0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
153c0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
153d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
153e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
153f0 62 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  bl);.      }else
15400 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  {.        window
15410 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15420 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65  W_RETURN_ROW, re
15430 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  gEnd, 0);.      
15440 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15450 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
15460 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
15470 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
15480 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  }.  }else.  if( 
15490 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
154a0 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
154b0 20 69 6e 74 20 62 52 50 53 20 3d 20 28 70 4d 57   int bRPS = (pMW
154c0 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
154d0 52 45 43 45 44 49 4e 47 20 26 26 20 70 4d 57 69  RECEDING && pMWi
154e0 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f  n->eFrmType==TK_
154f0 52 41 4e 47 45 29 3b 0a 20 20 20 20 77 69 6e 64  RANGE);.    wind
15500 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15510 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72 65 67  DOW_AGGSTEP, reg
15520 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  End, 0);.    if(
15530 20 62 52 50 53 20 29 20 77 69 6e 64 6f 77 43 6f   bRPS ) windowCo
15540 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15550 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
15560 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 77 69  tart, 0);.    wi
15570 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15580 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15590 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
155a0 20 21 62 52 50 53 20 29 20 77 69 6e 64 6f 77 43   !bRPS ) windowC
155b0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
155c0 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
155d0 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  Start, 0);.  }el
155e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  se{.    int addr
155f0 20 3d 20 30 3b 0a 20 20 20 20 77 69 6e 64 6f 77   = 0;.    window
15600 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15610 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29  W_AGGSTEP, 0, 0)
15620 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
15630 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd!=TK_UNBOUN
15640 44 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DED ){.      if(
15650 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
15660 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
15670 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
15680 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  0;.        addr 
15690 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
156a0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
156b0 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
156c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 62 6c  ){.          lbl
156d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
156e0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
156f0 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f  .          windo
15700 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 26  wCodeRangeTest(&
15710 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72  s, OP_Ge, s.curr
15720 65 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c  ent.csr, regEnd,
15730 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29   s.end.csr, lbl)
15740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15750 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
15760 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15770 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20  RN_ROW, 0, 0);. 
15780 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
15790 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
157a0 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
157b0 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  art, 0);.       
157c0 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
157d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
157e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
157f0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
15800 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15810 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15820 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
15830 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15840 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e{.        if( r
15850 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  egEnd ){.       
15860 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
15870 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15880 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
15890 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
158a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
158b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
158c0 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
158d0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
158e0 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a  URN_ROW, 0, 0);.
158f0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
15900 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15910 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
15920 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
15930 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 20 73    if( regEnd ) s
15940 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15950 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
15960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15970 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
15980 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f 70 20  main input loop 
15990 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
159a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
159b0 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20  lblWhereEnd);.  
159c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
159d0 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 46  pWInfo);..  /* F
159e0 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
159f0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72   if( pMWin->pPar
15a00 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 61 64  tition ){.    ad
15a10 64 72 49 6e 74 65 67 65 72 20 3d 20 73 71 6c 69  drInteger = sqli
15a20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15a30 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
15a40 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
15a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15a60 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
15a70 73 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a  subFlush);.  }..
15a80 20 20 61 64 64 72 45 6d 70 74 79 20 3d 20 73 71    addrEmpty = sq
15a90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15aa0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73  v, OP_Rewind, cs
15ab0 72 57 72 69 74 65 29 3b 0a 20 20 56 64 62 65 43  rWrite);.  VdbeC
15ac0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
15ad0 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
15ae0 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20  K_PRECEDING ){. 
15af0 20 20 20 69 6e 74 20 62 52 50 53 20 3d 20 28 70     int bRPS = (p
15b00 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
15b10 5f 50 52 45 43 45 44 49 4e 47 20 26 26 20 70 4d  _PRECEDING && pM
15b20 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54  Win->eFrmType==T
15b30 4b 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 77 69  K_RANGE);.    wi
15b40 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15b50 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72  INDOW_AGGSTEP, r
15b60 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 69  egEnd, 0);.    i
15b70 66 28 20 62 52 50 53 20 29 20 77 69 6e 64 6f 77  f( bRPS ) window
15b80 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15b90 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
15ba0 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
15bb0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
15bc0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
15bd0 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c  OW, 0, 0);.  }el
15be0 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  se if( pMWin->eS
15bf0 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
15c00 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  NG ){.    int ad
15c10 64 72 53 74 61 72 74 3b 0a 20 20 20 20 69 6e 74  drStart;.    int
15c20 20 61 64 64 72 42 72 65 61 6b 31 3b 0a 20 20 20   addrBreak1;.   
15c30 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 32 3b   int addrBreak2;
15c40 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65  .    int addrBre
15c50 61 6b 33 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43  ak3;.    windowC
15c60 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15c70 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b  _AGGSTEP, 0, 0);
15c80 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
15c90 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  eFrmType==TK_RAN
15ca0 47 45 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  GE ){.      addr
15cb0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15cc0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15cd0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
15ce0 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak2 = windowCode
15cf0 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15d00 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
15d10 72 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64  rt, 1);.      ad
15d20 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f  drBreak1 = windo
15d30 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15d40 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
15d50 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  , 1);.    }else.
15d60 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
15d70 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
15d80 44 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53  D ){.      addrS
15d90 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
15da0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15db0 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
15dc0 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k1 = windowCodeO
15dd0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
15de0 55 52 4e 5f 52 4f 57 2c 20 72 65 67 53 74 61 72  URN_ROW, regStar
15df0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64  t, 1);.      add
15e00 72 42 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77  rBreak2 = window
15e10 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15e20 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 30 2c  W_AGGINVERSE, 0,
15e30 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
15e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
15e50 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
15e60 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 20  LLOWING );.     
15e70 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c   addrStart = sql
15e80 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15e90 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64  ddr(v);.      ad
15ea0 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f  drBreak1 = windo
15eb0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15ec0 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72  OW_RETURN_ROW, r
15ed0 65 67 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20  egEnd, 1);.     
15ee0 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69   addrBreak2 = wi
15ef0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15f00 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
15f10 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a  , regStart, 1);.
15f20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15f30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15f40 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
15f50 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
15f60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15f70 2c 20 61 64 64 72 42 72 65 61 6b 32 29 3b 0a 20  , addrBreak2);. 
15f80 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
15f90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15fa0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 61 64  tAddr(v);.    ad
15fb0 64 72 42 72 65 61 6b 33 20 3d 20 77 69 6e 64 6f  drBreak3 = windo
15fc0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15fd0 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
15fe0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
15ff0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16000 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
16010 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
16020 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
16030 2c 20 61 64 64 72 42 72 65 61 6b 31 29 3b 0a 20  , addrBreak1);. 
16040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16050 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
16060 65 61 6b 33 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eak3);.  }else{.
16070 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61      int addrBrea
16080 6b 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  k;.    int addrS
16090 74 61 72 74 3b 0a 20 20 20 20 77 69 6e 64 6f 77  tart;.    window
160a0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
160b0 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29  W_AGGSTEP, 0, 0)
160c0 3b 0a 20 20 20 20 61 64 64 72 53 74 61 72 74 20  ;.    addrStart 
160d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
160e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
160f0 20 61 64 64 72 42 72 65 61 6b 20 3d 20 77 69 6e   addrBreak = win
16100 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
16110 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
16120 20 30 2c 20 31 29 3b 0a 20 20 20 20 77 69 6e 64   0, 1);.    wind
16130 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
16140 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
16150 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
16160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16170 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
16180 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
16190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
161a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
161b0 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  eak);.  }.  sqli
161c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
161d0 76 2c 20 61 64 64 72 45 6d 70 74 79 29 3b 0a 0a  v, addrEmpty);..
161e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
161f0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
16200 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74  orter, s.current
16210 2e 63 73 72 29 3b 0a 20 20 69 66 28 20 70 4d 57  .csr);.  if( pMW
16220 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
16230 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  {.    if( pMWin-
16240 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29  >regStartRowid )
16250 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
16260 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16270 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69  Integer, 1, pMWi
16280 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
16290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
162a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
162b0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57  _Integer, 0, pMW
162c0 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 29  in->regEndRowid)
162d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
162e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
162f0 76 2c 20 61 64 64 72 49 6e 74 65 67 65 72 2c 20  v, addrInteger, 
16300 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16310 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
16320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16330 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
16340 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
16350 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
16360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
16370 4f 57 46 55 4e 43 20 2a 2f 0a                    OWFUNC */.