/ Hex Artifact Content
Login

Artifact b5bed964a04c23fa335d6b1d2d8011ed518b36b692c1a999ae1777a023a45e1d:


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 54 61 62  ist *pSub;.  Tab
5aa0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 65 6c 65  le *pTab;.  Sele
5ab0: 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b 20  ct *pSubSelect; 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5ad0: 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65 63  urrent sub-selec
5ae0: 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a  t, if any */.};.
5af0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20  ./*.** Callback 
5b00: 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79  function used by
5b10: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5b20: 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20  riteEList(). If 
5b30: 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68  necessary,.** th
5b40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
5b50: 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  nds to the outpu
5b60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  t expression-lis
5b70: 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a  t and updates .*
5b80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70  * expression (*p
5b90: 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e  pExpr) in place.
5ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5bb0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
5bc0: 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  teExprCb(Walker 
5bd0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
5be0: 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74  pExpr){.  struct
5bf0: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
5c00: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
5c10: 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65  Rewrite;.  Parse
5c20: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
5c30: 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73  er->pParse;.  as
5c40: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
5c50: 61 73 73 65 72 74 28 20 70 2d 3e 70 57 69 6e 21  assert( p->pWin!
5c60: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
5c70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5c80: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
5c90: 6d 20 77 69 74 68 69 6e 20 61 20 73 63 61 6c 61  m within a scala
5ca0: 72 20 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a  r sub-select.  *
5cb0: 2a 20 74 68 61 74 20 75 73 65 64 20 62 79 20 74  * that used by t
5cc0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5cd0: 65 6e 74 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ent being proces
5ce0: 73 65 64 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73  sed, only proces
5cf0: 73 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  s.  ** TK_COLUMN
5d00: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
5d10: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 28 74  t refer to it (t
5d20: 68 65 20 6f 75 74 65 72 20 53 45 4c 45 43 54 29  he outer SELECT)
5d30: 2e 20 44 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72  . Do.  ** not pr
5d40: 6f 63 65 73 73 20 61 67 67 72 65 67 61 74 65 73  ocess aggregates
5d50: 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   or window funct
5d60: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 61 73 20  ions at all, as 
5d70: 74 68 65 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a  they belong.  **
5d80: 20 74 6f 20 74 68 65 20 73 63 61 6c 61 72 20 73   to the scalar s
5d90: 75 62 2d 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20  ub-select.  */. 
5da0: 20 69 66 28 20 70 2d 3e 70 53 75 62 53 65 6c 65   if( p->pSubSele
5db0: 63 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ct ){.    if( pE
5dc0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
5dd0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  MN ){.      retu
5de0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
5df0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e00: 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e    int nSrc = p->
5e10: 70 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20  pSrc->nSrc;.    
5e20: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
5e30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20  or(i=0; i<nSrc; 
5e40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5e50: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
5e60: 3d 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  =p->pSrc->a[i].i
5e70: 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
5e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5e90: 28 20 69 3d 3d 6e 53 72 63 20 29 20 72 65 74 75  ( i==nSrc ) retu
5ea0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
5eb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
5ec0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
5ed0: 29 7b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ){..    case TK_
5ee0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
5ef0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
5f00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57  erty(pExpr, EP_W
5f10: 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  inFunc) ){.     
5f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 57  }else{.        W
5f40: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20  indow *pWin;.   
5f50: 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d       for(pWin=p-
5f60: 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  >pWin; pWin; pWi
5f70: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
5f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5f90: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 3d 3d   pExpr->y.pWin==
5fa0: 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  pWin ){.        
5fb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
5fc0: 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20  ->pOwner==pExpr 
5fd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
5fe0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
5ff0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6010: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
6020: 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63  ough.  */..    c
6030: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
6040: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
6050: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
6060: 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
6070: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
6080: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
6090: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 75  0);.      p->pSu
60a0: 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  b = sqlite3ExprL
60b0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
60c0: 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75 70 29  , p->pSub, pDup)
60d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
60e0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Sub ){.        a
60f0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
6100: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6110: 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20  _Static)==0 );. 
6120: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
6130: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6140: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
6150: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6160: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
6170: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6180: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
6190: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
61a0: 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ic);.        mem
61b0: 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20 73 69  set(pExpr, 0, si
61c0: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
61d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
61e0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
61f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6200: 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e  umn = p->pSub->n
6210: 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20 20 20  Expr-1;.        
6220: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
6230: 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73 72  p->pWin->iEphCsr
6240: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
6250: 3e 79 2e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61  >y.pTab = p->pTa
6260: 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  b;.      }..    
6270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6280: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
6290: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
62a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
62b0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
62c0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
62d0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
62e0: 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b 65  teSelectCb(Walke
62f0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
6300: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6310: 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77  struct WindowRew
6320: 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65  rite *p = pWalke
6330: 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20  r->u.pRewrite;. 
6340: 20 53 65 6c 65 63 74 20 2a 70 53 61 76 65 20 3d   Select *pSave =
6350: 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 3b 0a   p->pSubSelect;.
6360: 20 20 69 66 28 20 70 53 61 76 65 3d 3d 70 53 65    if( pSave==pSe
6370: 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75  lect ){.    retu
6380: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
6390: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
63a0: 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70 53  >pSubSelect = pS
63b0: 65 6c 65 63 74 3b 0a 20 20 20 20 73 71 6c 69 74  elect;.    sqlit
63c0: 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
63d0: 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
63e0: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
63f0: 74 20 3d 20 70 53 61 76 65 3b 0a 20 20 7d 0a 20  t = pSave;.  }. 
6400: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
6410: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  e;.}.../*.** Ite
6420: 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61 63  rate through eac
6430: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
6440: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
6450: 70 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63 68  pEList. For each
6460: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43  :.**.**   * TK_C
6470: 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67  OLUMN,.**   * ag
6480: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
6490: 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e 64  , or.**   * wind
64a0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
64b0: 20 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74   a Window object
64c0: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 6d   that is not a m
64d0: 65 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a 2a  ember of the .**
64e0: 20 20 20 20 20 57 69 6e 64 6f 77 20 6c 69 73 74       Window list
64f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
6500: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
6510: 70 57 69 6e 29 2e 0a 2a 2a 0a 2a 2a 20 41 70 70  pWin)..**.** App
6520: 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20  end the node to 
6530: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
6540: 6e 2d 6c 69 73 74 20 28 2a 70 70 53 75 62 29 2e  n-list (*ppSub).
6550: 20 41 6e 64 20 72 65 70 6c 61 63 65 20 69 74 0a   And replace it.
6560: 2a 2a 20 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c  ** with a TK_COL
6570: 55 4d 4e 20 74 68 61 74 20 72 65 61 64 73 20 74  UMN that reads t
6580: 68 65 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65  he (N-1)th eleme
6590: 6e 74 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20  nt of table .** 
65a0: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77  pWin->iEphCsr, w
65b0: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
65c0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
65d0: 20 69 6e 20 28 2a 70 70 53 75 62 29 20 61 66 74   in (*ppSub) aft
65e0: 65 72 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20  er.** appending 
65f0: 74 68 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a  the new one..*/.
6600: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
6610: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
6620: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
6630: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
6640: 20 2a 70 57 69 6e 2c 0a 20 20 53 72 63 4c 69 73   *pWin,.  SrcLis
6650: 74 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  t *pSrc,.  ExprL
6660: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
6670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6680: 77 72 69 74 65 20 65 78 70 72 65 73 73 69 6f 6e  write expression
6690: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 20 2a  s in this list *
66a0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
66b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
66c0: 53 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Sub             
66d0: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75     /* IN/OUT: Su
66e0: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
66f0: 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  ion-list */.){. 
6700: 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
6710: 0a 20 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  .  WindowRewrite
6720: 20 73 52 65 77 72 69 74 65 3b 0a 0a 20 20 61 73   sRewrite;..  as
6730: 73 65 72 74 28 20 70 57 69 6e 21 3d 30 20 29 3b  sert( pWin!=0 );
6740: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
6750: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
6760: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
6770: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
6780: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
6790: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
67a0: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
67b0: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
67c0: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65 77  n = pWin;.  sRew
67d0: 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72 63  rite.pSrc = pSrc
67e0: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 54 61  ;.  sRewrite.pTa
67f0: 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 73 57 61  b = pTab;..  sWa
6800: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
6810: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
6820: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
6830: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
6840: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
6850: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
6860: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
6870: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
6880: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
6890: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
68a0: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
68b0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
68c0: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
68d0: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
68e0: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
68f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
6900: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
6910: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
6920: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
6930: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
6940: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
6950: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
6960: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
6970: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
6980: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
6990: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
69a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
69b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
69c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
69d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
69e0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
69f0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
6a00: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
6a10: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
6a20: 74 20 2a 70 41 70 70 65 6e 64 2c 20 20 20 20 20  t *pAppend,     
6a30: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
6a40: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
6a50: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6a60: 20 69 6e 74 20 62 49 6e 74 54 6f 4e 75 6c 6c 0a   int bIntToNull.
6a70: 29 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64  ){.  if( pAppend
6a80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6a90: 20 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70     int nInit = p
6aa0: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
6ab0: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  xpr : 0;.    for
6ac0: 28 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d  (i=0; i<pAppend-
6ad0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6ae0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d      Expr *pDup =
6af0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6b00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70  pParse->db, pApp
6b10: 65 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  end->a[i].pExpr,
6b20: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62   0);.      if( b
6b30: 49 6e 74 54 6f 4e 75 6c 6c 20 26 26 20 70 44 75  IntToNull && pDu
6b40: 70 20 26 26 20 70 44 75 70 2d 3e 6f 70 3d 3d 54  p && pDup->op==T
6b50: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
6b60: 20 20 20 20 20 70 44 75 70 2d 3e 6f 70 20 3d 20       pDup->op = 
6b70: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TK_NULL;.       
6b80: 20 70 44 75 70 2d 3e 66 6c 61 67 73 20 26 3d 20   pDup->flags &= 
6b90: 7e 28 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  ~(EP_IntValue|EP
6ba0: 5f 49 73 54 72 75 65 7c 45 50 5f 49 73 46 61 6c  _IsTrue|EP_IsFal
6bb0: 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
6bc0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
6bd0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6be0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
6bf0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
6c00: 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e   pList ) pList->
6c10: 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 46  a[nInit+i].sortF
6c20: 6c 61 67 73 20 3d 20 70 41 70 70 65 6e 64 2d 3e  lags = pAppend->
6c30: 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73 3b 0a  a[i].sortFlags;.
6c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6c50: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
6c60: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
6c70: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
6c80: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
6c90: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
6ca0: 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  t invoke.** any 
6cb0: 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  SQL window funct
6cc0: 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ions, this funct
6cd0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
6ce0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a  Otherwise, it .*
6cf0: 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53  * rewrites the S
6d00: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6d10: 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66  so that window f
6d20: 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75  unction xStep fu
6d30: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69  nctions.** are i
6d40: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f  nvoked in the co
6d50: 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64  rrect order as d
6d60: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22  escribed under "
6d70: 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47  SELECT REWRITING
6d80: 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20  ".** at the top 
6d90: 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f  of this file..*/
6da0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
6db0: 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
6dc0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
6dd0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
6de0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
6df0: 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e 70   p->pWin && p->p
6e00: 50 72 69 6f 72 3d 3d 30 20 26 26 20 28 70 2d 3e  Prior==0 && (p->
6e10: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 57 69  selFlags & SF_Wi
6e20: 6e 52 65 77 72 69 74 65 29 3d 3d 30 20 29 7b 0a  nRewrite)==0 ){.
6e30: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
6e40: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
6e50: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
6e60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6e70: 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  db;.    Select *
6e80: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
6e90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
6ea0: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72 63  query */.    Src
6eb0: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
6ec0: 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20 2a  pSrc;.    Expr *
6ed0: 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
6ee0: 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  re;.    ExprList
6ef0: 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e   *pGroupBy = p->
6f00: 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45 78  pGroupBy;.    Ex
6f10: 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d  pr *pHaving = p-
6f20: 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45 78  >pHaving;.    Ex
6f30: 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d 20  prList *pSort = 
6f40: 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73 74  0;..    ExprList
6f50: 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b 20   *pSublist = 0; 
6f60: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6f70: 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75 62  ion list for sub
6f80: 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57 69  -query */.    Wi
6f90: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
6fa0: 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d  >pWin;      /* M
6fb0: 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a  aster window obj
6fc0: 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ect */.    Windo
6fd0: 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20 20 20  w *pWin;        
6fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64           /* Wind
6ff0: 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74  ow object iterat
7000: 6f 72 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  or */.    Table 
7010: 2a 70 54 61 62 3b 0a 0a 20 20 20 20 70 54 61 62  *pTab;..    pTab
7020: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7030: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
7040: 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
7050: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7060: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7070: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a  E_NOMEM;.    }..
7080: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
7090: 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
70a0: 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   0;.    p->pGrou
70b0: 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  pBy = 0;.    p->
70c0: 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 20  pHaving = 0;.   
70d0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
70e0: 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20  ~SF_Aggregate;. 
70f0: 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
7100: 3d 20 53 46 5f 57 69 6e 52 65 77 72 69 74 65 3b  = SF_WinRewrite;
7110: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
7120: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7130: 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d  use for the sub-
7140: 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
7150: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
7160: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
7170: 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e  window PARTITION
7180: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
7190: 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20  auses. Then, if 
71a0: 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20  this makes it.  
71b0: 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20    ** redundant, 
71c0: 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52  remove the ORDER
71d0: 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72   BY from the par
71e0: 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a  ent SELECT.  */.
71f0: 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69      pSort = sqli
7200: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7210: 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  b, pMWin->pParti
7220: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53  tion, 0);.    pS
7230: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
7240: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
7250: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
7260: 4f 72 64 65 72 42 79 2c 20 31 29 3b 0a 20 20 20  OrderBy, 1);.   
7270: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 2d   if( pSort && p-
7280: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 2d 3e  >pOrderBy && p->
7290: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3c  pOrderBy->nExpr<
72a0: 3d 70 53 6f 72 74 2d 3e 6e 45 78 70 72 20 29 7b  =pSort->nExpr ){
72b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 61 76 65  .      int nSave
72c0: 20 3d 20 70 53 6f 72 74 2d 3e 6e 45 78 70 72 3b   = pSort->nExpr;
72d0: 0a 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 6e 45  .      pSort->nE
72e0: 78 70 72 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  xpr = p->pOrderB
72f0: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
7300: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
7310: 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74  istCompare(pSort
7320: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d  , p->pOrderBy, -
7330: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
7340: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7350: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
7360: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
7370: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
7380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7390: 70 53 6f 72 74 2d 3e 6e 45 78 70 72 20 3d 20 6e  pSort->nExpr = n
73a0: 53 61 76 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Save;.    }..   
73b0: 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63 75 72   /* Assign a cur
73c0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
73d0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
73e0: 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66 66 65  le used to buffe
73f0: 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 20 54  r rows..    ** T
7400: 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
7410: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
7420: 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61 66 74  coded later, aft
7430: 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 68  er it is known h
7440: 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 63  ow.    ** many c
7450: 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62 6c 65  olumns the table
7460: 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a 2f 0a   will have.  */.
7470: 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43      pMWin->iEphC
7480: 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
7490: 62 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  b++;.    pParse-
74a0: 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20 20 20  >nTab += 3;..   
74b0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
74c0: 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
74d0: 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70  , pMWin, pSrc, p
74e0: 2d 3e 70 45 4c 69 73 74 2c 20 70 54 61 62 2c 20  ->pEList, pTab, 
74f0: 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20  &pSublist);.    
7500: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
7510: 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c  iteEList(pParse,
7520: 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d   pMWin, pSrc, p-
7530: 3e 70 4f 72 64 65 72 42 79 2c 20 70 54 61 62 2c  >pOrderBy, pTab,
7540: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
7550: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
7560: 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f  ol = (pSublist ?
7570: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
7580: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 41   : 0);..    /* A
7590: 70 70 65 6e 64 20 74 68 65 20 50 41 52 54 49 54  ppend the PARTIT
75a0: 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52 44 45 52  ION BY and ORDER
75b0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20   BY expressions 
75c0: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 0a 20  to the to the . 
75d0: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
75e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
75f0: 2e 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69  . They are requi
7600: 72 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75  red to figure ou
7610: 74 20 77 68 65 72 65 20 0a 20 20 20 20 2a 2a 20  t where .    ** 
7620: 62 6f 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70  boundaries for p
7630: 61 72 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65  artitions and se
7640: 74 73 20 6f 66 20 70 65 65 72 20 72 6f 77 73 20  ts of peer rows 
7650: 6c 69 65 2e 20 20 2a 2f 0a 20 20 20 20 70 53 75  lie.  */.    pSu
7660: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
7670: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
7680: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
7690: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  in->pPartition, 
76a0: 30 29 3b 0a 20 20 20 20 70 53 75 62 6c 69 73 74  0);.    pSublist
76b0: 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
76c0: 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
76d0: 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70  ublist, pMWin->p
76e0: 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
76f0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
7700: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
7710: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
7720: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
7730: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
7740: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
7750: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
7760: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
7770: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
7780: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
7790: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
77a0: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
77b0: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
77c0: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
77d0: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
77e0: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
77f0: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
7800: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
7810: 20 2a 70 41 72 67 73 20 3d 20 70 57 69 6e 2d 3e   *pArgs = pWin->
7820: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b  pOwner->x.pList;
7830: 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d  .      if( pWin-
7840: 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
7850: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
7860: 53 55 42 54 59 50 45 20 29 7b 0a 20 20 20 20 20  SUBTYPE ){.     
7870: 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52     selectWindowR
7880: 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72  ewriteEList(pPar
7890: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c  se, pMWin, pSrc,
78a0: 20 70 41 72 67 73 2c 20 70 54 61 62 2c 20 26 70   pArgs, pTab, &p
78b0: 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Sublist);.      
78c0: 20 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20    pWin->iArgCol 
78d0: 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
78e0: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
78f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 57 69 6e  0);.        pWin
7900: 2d 3e 62 45 78 70 72 41 72 67 73 20 3d 20 31 3b  ->bExprArgs = 1;
7910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7920: 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41 72 67        pWin->iArg
7930: 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20  Col = (pSublist 
7940: 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  ? pSublist->nExp
7950: 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r : 0);.        
7960: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
7970: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
7980: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
7990: 70 41 72 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  pArgs, 0);.     
79a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 69   }.      if( pWi
79b0: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
79c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 46 69 6c        Expr *pFil
79d0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ter = sqlite3Exp
79e0: 72 44 75 70 28 64 62 2c 20 70 57 69 6e 2d 3e 70  rDup(db, pWin->p
79f0: 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Filter, 0);.    
7a00: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73      pSublist = s
7a10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7a20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75  pend(pParse, pSu
7a30: 62 6c 69 73 74 2c 20 70 46 69 6c 74 65 72 29 3b  blist, pFilter);
7a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
7a50: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 20 3d 20  Win->regAccum = 
7a60: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7a70: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52        pWin->regR
7a80: 65 73 75 6c 74 20 3d 20 2b 2b 70 50 61 72 73 65  esult = ++pParse
7a90: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
7aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ab0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
7ac0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a  Win->regAccum);.
7ad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
7ae0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
7af0: 45 52 20 42 59 20 6f 72 20 50 41 52 54 49 54 49  ER BY or PARTITI
7b00: 4f 4e 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e  ON BY clause, an
7b10: 64 20 74 68 65 20 77 69 6e 64 6f 77 0a 20 20 20  d the window.   
7b20: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 63 63   ** function acc
7b30: 65 70 74 73 20 7a 65 72 6f 20 61 72 67 75 6d 65  epts zero argume
7b40: 6e 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 61  nts, and there a
7b50: 72 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 75  re no other colu
7b60: 6d 6e 73 0a 20 20 20 20 2a 2a 20 73 65 6c 65 63  mns.    ** selec
7b70: 74 65 64 20 28 65 2e 67 2e 20 22 53 45 4c 45 43  ted (e.g. "SELEC
7b80: 54 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f  T row_number() O
7b90: 56 45 52 20 28 29 20 46 52 4f 4d 20 74 31 22 29  VER () FROM t1")
7ba0: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
7bb0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 53 75  .    ** that pSu
7bc0: 62 6c 69 73 74 20 69 73 20 73 74 69 6c 6c 20 4e  blist is still N
7bd0: 55 4c 4c 20 68 65 72 65 2e 20 41 64 64 20 61 20  ULL here. Add a 
7be0: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
7bf0: 69 6f 6e 20 68 65 72 65 20 74 6f 20 0a 20 20 20  ion here to .   
7c00: 20 2a 2a 20 6b 65 65 70 20 65 76 65 72 79 74 68   ** keep everyth
7c10: 69 6e 67 20 6c 65 67 61 6c 20 69 6e 20 74 68 69  ing legal in thi
7c20: 73 20 63 61 73 65 2e 20 0a 20 20 20 20 2a 2f 0a  s case. .    */.
7c30: 20 20 20 20 69 66 28 20 70 53 75 62 6c 69 73 74      if( pSublist
7c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 75  ==0 ){.      pSu
7c50: 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  blist = sqlite3E
7c60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
7c70: 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  arse, 0, .      
7c80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62    sqlite3Expr(db
7c90: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 30  , TK_INTEGER, "0
7ca0: 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ").      );.    
7cb0: 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71  }..    pSub = sq
7cc0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
7cd0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
7ce0: 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20  pSublist, pSrc, 
7cf0: 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
7d00: 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74  , pHaving, pSort
7d10: 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
7d20: 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
7d30: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
7d40: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
7d50: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  );.    if( p->pS
7d60: 72 63 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  rc ){.      Tabl
7d70: 65 20 2a 70 54 61 62 32 3b 0a 20 20 20 20 20 20  e *pTab2;.      
7d80: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
7d90: 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20  elect = pSub;.  
7da0: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
7db0: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
7dc0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29  pParse, p->pSrc)
7dd0: 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65  ;.      pSub->se
7de0: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
7df0: 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 70 54 61  anded;.      pTa
7e00: 62 32 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  b2 = sqlite3Resu
7e10: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
7e20: 61 72 73 65 2c 20 70 53 75 62 2c 20 53 51 4c 49  arse, pSub, SQLI
7e30: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
7e40: 20 20 20 20 69 66 28 20 70 54 61 62 32 3d 3d 30      if( pTab2==0
7e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
7e60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7e70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7e80: 20 20 20 20 6d 65 6d 63 70 79 28 70 54 61 62 2c      memcpy(pTab,
7e90: 20 70 54 61 62 32 2c 20 73 69 7a 65 6f 66 28 54   pTab2, sizeof(T
7ea0: 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
7eb0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
7ec0: 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
7ed0: 20 20 20 20 20 20 20 20 70 2d 3e 70 53 72 63 2d          p->pSrc-
7ee0: 3e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 54 61  >a[0].pTab = pTa
7ef0: 62 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  b;.        pTab 
7f00: 3d 20 70 54 61 62 32 3b 0a 20 20 20 20 20 20 7d  = pTab2;.      }
7f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7f20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
7f30: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d  penEphemeral, pM
7f40: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 53  Win->iEphCsr, pS
7f50: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  ublist->nExpr);.
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7f80: 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45  enDup, pMWin->iE
7f90: 70 68 43 73 72 2b 31 2c 20 70 4d 57 69 6e 2d 3e  phCsr+1, pMWin->
7fa0: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20  iEphCsr);.      
7fb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7fc0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
7fd0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b   pMWin->iEphCsr+
7fe0: 32 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  2, pMWin->iEphCs
7ff0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
8000: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8010: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
8020: 2d 3e 69 45 70 68 43 73 72 2b 33 2c 20 70 4d 57  ->iEphCsr+3, pMW
8030: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
8040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8050: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
8060: 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  te(db, pSub);.  
8070: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
8080: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
8090: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
80a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
80b0: 72 65 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ree(db, pTab);. 
80c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
80d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
80e0: 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65   the Window obje
80f0: 63 74 20 66 72 6f 6d 20 74 68 65 20 53 65 6c 65  ct from the Sele
8100: 63 74 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ct to which it i
8110: 73 20 61 74 74 61 63 68 65 64 2c 0a 2a 2a 20 69  s attached,.** i
8120: 66 20 69 74 20 69 73 20 61 74 74 61 63 68 65 64  f it is attached
8130: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8140: 33 57 69 6e 64 6f 77 55 6e 6c 69 6e 6b 46 72 6f  3WindowUnlinkFro
8150: 6d 53 65 6c 65 63 74 28 57 69 6e 64 6f 77 20 2a  mSelect(Window *
8160: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 70 54  p){.  if( p->ppT
8170: 68 69 73 20 29 7b 0a 20 20 20 20 2a 70 2d 3e 70  his ){.    *p->p
8180: 70 54 68 69 73 20 3d 20 70 2d 3e 70 4e 65 78 74  pThis = p->pNext
8190: 57 69 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  Win;.    if( p->
81a0: 70 4e 65 78 74 57 69 6e 20 29 20 70 2d 3e 70 4e  pNextWin ) p->pN
81b0: 65 78 74 57 69 6e 2d 3e 70 70 54 68 69 73 20 3d  extWin->ppThis =
81c0: 20 70 2d 3e 70 70 54 68 69 73 3b 0a 20 20 20 20   p->ppThis;.    
81d0: 70 2d 3e 70 70 54 68 69 73 20 3d 20 30 3b 0a 20  p->ppThis = 0;. 
81e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
81f0: 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65   the Window obje
8200: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
8210: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8220: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8230: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 73 71  3WindowDelete(sq
8240: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
8250: 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  w *p){.  if( p )
8260: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  {.    sqlite3Win
8270: 64 6f 77 55 6e 6c 69 6e 6b 46 72 6f 6d 53 65 6c  dowUnlinkFromSel
8280: 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ect(p);.    sqli
8290: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
82a0: 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20  , p->pFilter);. 
82b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
82c0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
82d0: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
82e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
82f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
8300: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
8310: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8320: 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  b, p->pEnd);.   
8330: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8340: 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74  te(db, p->pStart
8350: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
8360: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  Free(db, p->zNam
8370: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
8380: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61  bFree(db, p->zBa
8390: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
83a0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
83b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
83c0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
83d0: 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63   of Window objec
83e0: 74 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74  ts starting at t
83f0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8400: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
8410: 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c  te3WindowListDel
8420: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
8430: 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77   Window *p){.  w
8440: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57  hile( p ){.    W
8450: 69 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70  indow *pNext = p
8460: 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20  ->pNextWin;.    
8470: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c  sqlite3WindowDel
8480: 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
8490: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d  p = pNext;.  }.}
84a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
84b0: 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  ment expression 
84c0: 69 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20  is an PRECEDING 
84d0: 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66  or FOLLOWING off
84e0: 73 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c  set.  The.** val
84f0: 75 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e  ue should be a n
8500: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
8510: 67 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c  ger.  If the val
8520: 75 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63  ue is not a.** c
8530: 6f 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20  onstant, change 
8540: 69 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65  it to NULL.  The
8550: 20 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73   fact that it is
8560: 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61   then a non-nega
8570: 74 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20  tive.** integer 
8580: 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c  will be caught l
8590: 61 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73  ater.  But it is
85a0: 20 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74   important not t
85b0: 6f 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61  o leave.** varia
85c0: 62 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68  ble values in th
85d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
85e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  e..*/.static Exp
85f0: 72 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  r *sqlite3Window
8600: 4f 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65  OffsetExpr(Parse
8610: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8620: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d  pExpr){.  if( 0=
8630: 3d 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  =sqlite3ExprIsCo
8640: 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
8650: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
8660: 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69  ME_OBJECT ) sqli
8670: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
8680: 61 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ap(pParse, pExpr
8690: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
86a0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
86b0: 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  >db, pExpr);.   
86c0: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
86d0: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
86e0: 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  ->db, TK_NULL, 0
86f0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
8700: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
8710: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
8720: 72 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e  return a new Win
8730: 64 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72  dow object descr
8740: 69 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44  ibing a Window D
8750: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69  efinition..*/.Wi
8760: 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
8770: 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73  dowAlloc(.  Pars
8780: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8790: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
87a0: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c   */.  int eType,
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
87c0: 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 2c   type. TK_RANGE,
87d0: 20 54 4b 5f 52 4f 57 53 2c 20 54 4b 5f 47 52 4f   TK_ROWS, TK_GRO
87e0: 55 50 53 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 69  UPS, or 0 */.  i
87f0: 6e 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20  nt eStart,      
8800: 20 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20   /* Start type: 
8810: 43 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49  CURRENT, PRECEDI
8820: 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55  NG, FOLLOWING, U
8830: 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78  NBOUNDED */.  Ex
8840: 70 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  pr *pStart,     
8850: 2f 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20  /* Start window 
8860: 73 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45  size if TK_PRECE
8870: 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e  DING or FOLLOWIN
8880: 47 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c  G */.  int eEnd,
8890: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
88a0: 74 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46  type: CURRENT, F
88b0: 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42  OLLOWING, TK_UNB
88c0: 4f 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e  OUNDED, PRECEDIN
88d0: 47 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e  G */.  Expr *pEn
88e0: 64 2c 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  d,       /* End 
88f0: 77 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54  window size if T
8900: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50  K_FOLLOWING or P
8910: 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 75 38  RECEDING */.  u8
8920: 20 65 45 78 63 6c 75 64 65 20 20 20 20 20 20 20   eExclude       
8930: 2f 2a 20 45 58 43 4c 55 44 45 20 63 6c 61 75 73  /* EXCLUDE claus
8940: 65 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  e */.){.  Window
8950: 20 2a 70 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e   *pWin = 0;.  in
8960: 74 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65  t bImplicitFrame
8970: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73   = 0;..  /* Pars
8980: 65 72 20 61 73 73 75 72 65 73 20 74 68 65 20 66  er assures the f
8990: 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61  ollowing: */.  a
89a0: 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 30 20  ssert( eType==0 
89b0: 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  || eType==TK_RAN
89c0: 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f  GE || eType==TK_
89d0: 52 4f 57 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54  ROWS || eType==T
89e0: 4b 5f 47 52 4f 55 50 53 20 29 3b 0a 20 20 61 73  K_GROUPS );.  as
89f0: 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54 4b  sert( eStart==TK
8a00: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74 61  _CURRENT || eSta
8a10: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
8a20: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
8a30: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
8a40: 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54  DED || eStart==T
8a50: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20  K_FOLLOWING );. 
8a60: 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d 54   assert( eEnd==T
8a70: 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e  K_CURRENT || eEn
8a80: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a  d==TK_FOLLOWING.
8a90: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 45             || eE
8aa0: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
8ab0: 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45   || eEnd==TK_PRE
8ac0: 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73 65  CEDING );.  asse
8ad0: 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f  rt( (eStart==TK_
8ae0: 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53 74  PRECEDING || eSt
8af0: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
8b00: 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29 20  G)==(pStart!=0) 
8b10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 45  );.  assert( (eE
8b20: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
8b30: 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45   || eEnd==TK_PRE
8b40: 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d  CEDING)==(pEnd!=
8b50: 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  0) );..  if( eTy
8b60: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d  pe==0 ){.    bIm
8b70: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31 3b  plicitFrame = 1;
8b80: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b 5f  .    eType = TK_
8b90: 52 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  RANGE;.  }..  /*
8ba0: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
8bb0: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  he.  ** starting
8bc0: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d   boundary type m
8bd0: 61 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72  ay not occur ear
8be0: 6c 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c  lier in the foll
8bf0: 6f 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a  owing list than.
8c00: 20 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20    ** the ending 
8c10: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20  boundary type:. 
8c20: 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55   **.  **   UNBOU
8c30: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20  NDED PRECEDING. 
8c40: 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45   **   <expr> PRE
8c50: 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55  CEDING.  **   CU
8c60: 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20  RRENT ROW.  **  
8c70: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
8c80: 47 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44  G.  **   UNBOUND
8c90: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
8ca0: 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65  *.  ** The parse
8cb0: 72 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22  r ensures that "
8cc0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
8cd0: 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75  ING" cannot be u
8ce0: 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67  sed as an ending
8cf0: 0a 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20  .  ** boundary, 
8d00: 61 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e  and than "UNBOUN
8d10: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63  DED FOLLOWING" c
8d20: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73  annot be used as
8d30: 20 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a   a starting.  **
8d40: 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e   frame boundary.
8d50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74  .  */.  if( (eSt
8d60: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
8d70: 26 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  && eEnd==TK_PREC
8d80: 45 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53  EDING).   || (eS
8d90: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
8da0: 4e 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f  NG && (eEnd==TK_
8db0: 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e  PRECEDING || eEn
8dc0: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a  d==TK_CURRENT)).
8dd0: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
8de0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8df0: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72   "unsupported fr
8e00: 61 6d 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  ame specificatio
8e10: 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69  n");.    goto wi
8e20: 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20  ndowAllocErr;.  
8e30: 7d 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69 6e  }..  pWin = (Win
8e40: 64 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  dow*)sqlite3DbMa
8e50: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
8e60: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  >db, sizeof(Wind
8e70: 6f 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69 6e  ow));.  if( pWin
8e80: 3d 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f  ==0 ) goto windo
8e90: 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69  wAllocErr;.  pWi
8ea0: 6e 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 65 54  n->eFrmType = eT
8eb0: 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74  ype;.  pWin->eSt
8ec0: 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20  art = eStart;.  
8ed0: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e  pWin->eEnd = eEn
8ee0: 64 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75 64  d;.  if( eExclud
8ef0: 65 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a 61  e==0 && Optimiza
8f00: 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61  tionDisabled(pPa
8f10: 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
8f20: 57 69 6e 64 6f 77 46 75 6e 63 29 20 29 7b 0a 20  WindowFunc) ){. 
8f30: 20 20 20 65 45 78 63 6c 75 64 65 20 3d 20 54 4b     eExclude = TK
8f40: 5f 4e 4f 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 2d  _NO;.  }.  pWin-
8f50: 3e 65 45 78 63 6c 75 64 65 20 3d 20 65 45 78 63  >eExclude = eExc
8f60: 6c 75 64 65 3b 0a 20 20 70 57 69 6e 2d 3e 62 49  lude;.  pWin->bI
8f70: 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 62  mplicitFrame = b
8f80: 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20  ImplicitFrame;. 
8f90: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71   pWin->pEnd = sq
8fa0: 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65  lite3WindowOffse
8fb0: 74 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45  tExpr(pParse, pE
8fc0: 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74  nd);.  pWin->pSt
8fd0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  art = sqlite3Win
8fe0: 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50  dowOffsetExpr(pP
8ff0: 61 72 73 65 2c 20 70 53 74 61 72 74 29 3b 0a 20  arse, pStart);. 
9000: 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77   return pWin;..w
9010: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20  indowAllocErr:. 
9020: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9030: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
9040: 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  End);.  sqlite3E
9050: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
9060: 2d 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20  ->db, pStart);. 
9070: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9080: 0a 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54 49  .** Attach PARTI
9090: 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42  TION and ORDER B
90a0: 59 20 63 6c 61 75 73 65 73 20 70 50 61 72 74 69  Y clauses pParti
90b0: 74 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72 42  tion and pOrderB
90c0: 79 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70  y to window.** p
90d0: 57 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61  Win. Also, if pa
90e0: 72 61 6d 65 74 65 72 20 70 42 61 73 65 20 69 73  rameter pBase is
90f0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70   not NULL, set p
9100: 57 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68  Win->zBase to th
9110: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
9120: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
9130: 74 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77  tring..*/.Window
9140: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41   *sqlite3WindowA
9150: 73 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73 65  ssemble(.  Parse
9160: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
9170: 64 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78  dow *pWin, .  Ex
9180: 70 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74 69  prList *pPartiti
9190: 6f 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20  on, .  ExprList 
91a0: 2a 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54 6f  *pOrderBy, .  To
91b0: 6b 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20  ken *pBase.){.  
91c0: 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20  if( pWin ){.    
91d0: 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  pWin->pPartition
91e0: 20 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20   = pPartition;. 
91f0: 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42     pWin->pOrderB
9200: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
9210: 20 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a 20    if( pBase ){. 
9220: 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65       pWin->zBase
9230: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
9240: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
9250: 70 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d  pBase->z, pBase-
9260: 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  >n);.    }.  }el
9270: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
9280: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
9290: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
92a0: 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  tion);.    sqlit
92b0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
92c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
92d0: 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65  derBy);.  }.  re
92e0: 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a  turn pWin;.}../*
92f0: 0a 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  .** Window *pWin
9300: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
9310: 72 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57 49  reated from a WI
9320: 4e 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b  NDOW clause. Tok
9330: 6e 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20 74  ne pBase.** is t
9340: 68 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e 20  he base window. 
9350: 45 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73 20  Earlier windows 
9360: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57 49  from the same WI
9370: 4e 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65 0a  NDOW clause are.
9380: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
9390: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
93a0: 72 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70  rting at pWin->p
93b0: 4e 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66 75  NextWin. This fu
93c0: 6e 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72  nction.** either
93d0: 20 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20 61   updates *pWin a
93e0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
93f0: 62 61 73 65 20 73 70 65 63 69 66 69 63 61 74 69  base specificati
9400: 6f 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c  on, or else.** l
9410: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 69  eaves an error i
9420: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
9430: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
9440: 68 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  hain(Parse *pPar
9450: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  se, Window *pWin
9460: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29  , Window *pList)
9470: 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42  {.  if( pWin->zB
9480: 61 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ase ){.    sqlit
9490: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
94a0: 3e 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20  >db;.    Window 
94b0: 2a 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f 77  *pExist = window
94c0: 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  Find(pParse, pLi
94d0: 73 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29  st, pWin->zBase)
94e0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 69 73 74  ;.    if( pExist
94f0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
9500: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
9510: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66        /* Check f
9520: 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  or errors */.   
9530: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61     if( pWin->pPa
9540: 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rtition ){.     
9550: 20 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54 49     zErr = "PARTI
9560: 54 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20  TION clause";.  
9570: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
9580: 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 26  xist->pOrderBy &
9590: 26 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  & pWin->pOrderBy
95a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
95b0: 20 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c 61   = "ORDER BY cla
95c0: 75 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  use";.      }els
95d0: 65 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62 49  e if( pExist->bI
95e0: 6d 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30 20  mplicitFrame==0 
95f0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
9600: 3d 20 22 66 72 61 6d 65 20 73 70 65 63 69 66 69  = "frame specifi
9610: 63 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d  cation";.      }
9620: 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20  .      if( zErr 
9630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9640: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9650: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
9660: 22 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65  "cannot override
9670: 20 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25   %s of window: %
9680: 73 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e  s", zErr, pWin->
9690: 7a 42 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b  zBase.        );
96a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
96b0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72        pWin->pPar
96c0: 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  tition = sqlite3
96d0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
96e0: 70 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74 69  pExist->pPartiti
96f0: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  on, 0);.        
9700: 69 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64  if( pExist->pOrd
9710: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
9720: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e    assert( pWin->
9730: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
9740: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70           pWin->p
9750: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
9760: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
9770: 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42   pExist->pOrderB
9780: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  y, 0);.        }
9790: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
97a0: 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e 2d  DbFree(db, pWin-
97b0: 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  >zBase);.       
97c0: 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30   pWin->zBase = 0
97d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
97e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
97f0: 61 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  ach window objec
9800: 74 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73  t pWin to expres
9810: 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20  sion p..*/.void 
9820: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74  sqlite3WindowAtt
9830: 61 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ach(Parse *pPars
9840: 65 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64  e, Expr *p, Wind
9850: 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28  ow *pWin){.  if(
9860: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
9870: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
9880: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  TION );.    asse
9890: 72 74 28 20 70 57 69 6e 20 29 3b 0a 20 20 20 20  rt( pWin );.    
98a0: 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e  p->y.pWin = pWin
98b0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
98c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46  perty(p, EP_WinF
98d0: 75 6e 63 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  unc);.    pWin->
98e0: 70 4f 77 6e 65 72 20 3d 20 70 3b 0a 20 20 20 20  pOwner = p;.    
98f0: 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
9900: 45 50 5f 44 69 73 74 69 6e 63 74 29 20 26 26 20  EP_Distinct) && 
9910: 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d  pWin->eFrmType!=
9920: 54 4b 5f 46 49 4c 54 45 52 20 29 7b 0a 20 20 20  TK_FILTER ){.   
9930: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9940: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
9950: 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 20 69       "DISTINCT i
9960: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
9970: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
9980: 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b 0a 20  ions".      );. 
9990: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
99a0: 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44    sqlite3WindowD
99b0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
99c0: 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pWin);.  }.}..
99d0: 2f 2a 0a 2a 2a 20 50 6f 73 73 69 62 6c 79 20 6c  /*.** Possibly l
99e0: 69 6e 6b 20 77 69 6e 64 6f 77 20 70 57 69 6e 20  ink window pWin 
99f0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 61 74  into the list at
9a00: 20 70 53 65 6c 2d 3e 70 57 69 6e 20 28 77 69 6e   pSel->pWin (win
9a10: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  dow functions.**
9a20: 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
9a30: 20 61 73 20 70 61 72 74 20 6f 66 20 53 45 4c 45   as part of SELE
9a40: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65  CT statement pSe
9a50: 6c 29 2e 20 54 68 65 20 77 69 6e 64 6f 77 20 69  l). The window i
9a60: 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 69 6e 20 69  s linked.** in i
9a70: 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68 65  f either (a) the
9a80: 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20  re are no other 
9a90: 77 69 6e 64 6f 77 73 20 61 6c 72 65 61 64 79 20  windows already 
9aa0: 6c 69 6e 6b 65 64 20 74 6f 20 74 68 69 73 0a 2a  linked to this.*
9ab0: 2a 20 53 45 4c 45 43 54 2c 20 6f 72 20 28 62 29  * SELECT, or (b)
9ac0: 20 74 68 65 20 77 69 6e 64 6f 77 73 20 61 6c 72   the windows alr
9ad0: 65 61 64 79 20 6c 69 6e 6b 65 64 20 75 73 65 20  eady linked use 
9ae0: 61 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 6e  a compatible win
9af0: 64 6f 77 20 66 72 61 6d 65 2e 0a 2a 2f 0a 76 6f  dow frame..*/.vo
9b00: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
9b10: 4c 69 6e 6b 28 53 65 6c 65 63 74 20 2a 70 53 65  Link(Select *pSe
9b20: 6c 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  l, Window *pWin)
9b30: 7b 0a 20 20 69 66 28 20 70 53 65 6c 21 3d 30 0a  {.  if( pSel!=0.
9b40: 20 20 20 26 26 20 28 30 3d 3d 70 53 65 6c 2d 3e     && (0==pSel->
9b50: 70 57 69 6e 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  pWin || 0==sqlit
9b60: 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28  e3WindowCompare(
9b70: 30 2c 20 70 53 65 6c 2d 3e 70 57 69 6e 2c 20 70  0, pSel->pWin, p
9b80: 57 69 6e 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Win, 0)).  ){.  
9b90: 20 20 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e    pWin->pNextWin
9ba0: 20 3d 20 70 53 65 6c 2d 3e 70 57 69 6e 3b 0a 20   = pSel->pWin;. 
9bb0: 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 57 69     if( pSel->pWi
9bc0: 6e 20 29 7b 0a 20 20 20 20 20 20 70 53 65 6c 2d  n ){.      pSel-
9bd0: 3e 70 57 69 6e 2d 3e 70 70 54 68 69 73 20 3d 20  >pWin->ppThis = 
9be0: 26 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 3b  &pWin->pNextWin;
9bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 2d  .    }.    pSel-
9c00: 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20  >pWin = pWin;.  
9c10: 20 20 70 57 69 6e 2d 3e 70 70 54 68 69 73 20 3d    pWin->ppThis =
9c20: 20 26 70 53 65 6c 2d 3e 70 57 69 6e 3b 0a 20 20   &pSel->pWin;.  
9c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
9c40: 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 77  n 0 if the two w
9c50: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 61 72  indow objects ar
9c60: 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20  e identical, or 
9c70: 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69  non-zero otherwi
9c80: 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69 63 61 6c  se..** Identical
9c90: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   window objects 
9ca0: 63 61 6e 20 62 65 20 70 72 6f 63 65 73 73 65 64  can be processed
9cb0: 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 73 63 61   in a single sca
9cc0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
9cd0: 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 50  3WindowCompare(P
9ce0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
9cf0: 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f 77  ndow *p1, Window
9d00: 20 2a 70 32 2c 20 69 6e 74 20 62 46 69 6c 74 65   *p2, int bFilte
9d10: 72 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 46  r){.  if( p1->eF
9d20: 72 6d 54 79 70 65 21 3d 70 32 2d 3e 65 46 72 6d  rmType!=p2->eFrm
9d30: 54 79 70 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Type ) return 1;
9d40: 0a 20 20 69 66 28 20 70 31 2d 3e 65 53 74 61 72  .  if( p1->eStar
9d50: 74 21 3d 70 32 2d 3e 65 53 74 61 72 74 20 29 20  t!=p2->eStart ) 
9d60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9d70: 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45  p1->eEnd!=p2->eE
9d80: 6e 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  nd ) return 1;. 
9d90: 20 69 66 28 20 70 31 2d 3e 65 45 78 63 6c 75 64   if( p1->eExclud
9da0: 65 21 3d 70 32 2d 3e 65 45 78 63 6c 75 64 65 20  e!=p2->eExclude 
9db0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
9dc0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
9dd0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d  pare(pParse, p1-
9de0: 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53 74  >pStart, p2->pSt
9df0: 61 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72  art, -1) ) retur
9e00: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
9e10: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
9e20: 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20  arse, p1->pEnd, 
9e30: 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20  p2->pEnd, -1) ) 
9e40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9e50: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
9e60: 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72 74  ompare(p1->pPart
9e70: 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74  ition, p2->pPart
9e80: 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74  ition, -1) ) ret
9e90: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9ea0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
9eb0: 61 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42 79  are(p1->pOrderBy
9ec0: 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20  , p2->pOrderBy, 
9ed0: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9ee0: 20 20 69 66 28 20 62 46 69 6c 74 65 72 20 29 7b    if( bFilter ){
9ef0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9f00: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
9f10: 73 65 2c 20 70 31 2d 3e 70 46 69 6c 74 65 72 2c  se, p1->pFilter,
9f20: 20 70 32 2d 3e 70 46 69 6c 74 65 72 2c 20 2d 31   p2->pFilter, -1
9f30: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
9f40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9f50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
9f60: 63 61 6c 6c 65 64 20 62 79 20 63 6f 64 65 20 69  called by code i
9f70: 6e 20 73 65 6c 65 63 74 2e 63 20 62 65 66 6f 72  n select.c befor
9f80: 65 20 69 74 20 63 61 6c 6c 73 20 73 71 6c 69 74  e it calls sqlit
9f90: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
9fa0: 2a 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61  * to begin itera
9fb0: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
9fc0: 20 73 75 62 2d 71 75 65 72 79 20 72 65 73 75 6c   sub-query resul
9fd0: 74 73 2e 20 49 74 20 69 73 20 75 73 65 64 20 74  ts. It is used t
9fe0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e  o allocate.** an
9ff0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  d initialize reg
a000: 69 73 74 65 72 73 20 61 6e 64 20 63 75 72 73 6f  isters and curso
a010: 72 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  rs used by sqlit
a020: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
a030: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
a040: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69  te3WindowCodeIni
a050: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
a060: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b   Window *pMWin){
a070: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
a080: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
a090: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
a0a0: 73 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  se);..  /* Alloc
a0b0: 61 74 65 20 72 65 67 69 73 74 65 72 73 20 74 6f  ate registers to
a0c0: 20 75 73 65 20 66 6f 72 20 50 41 52 54 49 54 49   use for PARTITI
a0d0: 4f 4e 20 42 59 20 76 61 6c 75 65 73 2c 20 69 66  ON BY values, if
a0e0: 20 61 6e 79 2e 20 49 6e 69 74 69 61 6c 69 7a 65   any. Initialize
a0f0: 0a 20 20 2a 2a 20 73 61 69 64 20 72 65 67 69 73  .  ** said regis
a100: 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a  ters to NULL.  *
a110: 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
a120: 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20  Partition ){.   
a130: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4d 57   int nExpr = pMW
a140: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e  in->pPartition->
a150: 6e 45 78 70 72 3b 0a 20 20 20 20 70 4d 57 69 6e  nExpr;.    pMWin
a160: 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61 72  ->regPart = pPar
a170: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
a180: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
a190: 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c 69 74  nExpr;.    sqlit
a1a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a1b0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69  OP_Null, 0, pMWi
a1c0: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69  n->regPart, pMWi
a1d0: 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 45 78 70 72  n->regPart+nExpr
a1e0: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 57 69  -1);.  }..  pMWi
a1f0: 6e 2d 3e 72 65 67 4f 6e 65 20 3d 20 2b 2b 70 50  n->regOne = ++pP
a200: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
a210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a220: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
a230: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65 29  , pMWin->regOne)
a240: 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  ;..  if( pMWin->
a250: 65 45 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20  eExclude ){.    
a260: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
a270: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
a280: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e  >nMem;.    pMWin
a290: 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 3d 20  ->regEndRowid = 
a2a0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
a2b0: 20 20 20 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70      pMWin->csrAp
a2c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a2d0: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
a2e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a2f0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69  Integer, 1, pMWi
a300: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
a310: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a320: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a330: 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e  nteger, 0, pMWin
a340: 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 29 3b 0a  ->regEndRowid);.
a350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a360: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
a370: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 63 73 72 41  Dup, pMWin->csrA
a380: 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  pp, pMWin->iEphC
a390: 73 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  sr);.    return;
a3a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 57 69 6e  .  }..  for(pWin
a3b0: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
a3c0: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
a3d0: 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  n){.    FuncDef 
a3e0: 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  *p = pWin->pFunc
a3f0: 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 75  ;.    if( (p->fu
a400: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
a410: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26  _FUNC_MINMAX) &&
a420: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54   pWin->eStart!=T
a430: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
a440: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69       /* The inli
a450: 6e 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d  ne versions of m
a460: 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 72  in() and max() r
a470: 65 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65 20  equire a single 
a480: 65 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20 20  ephemeral.      
a490: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20 72  ** table and 3 r
a4a0: 65 67 69 73 74 65 72 73 2e 20 54 68 65 20 72 65  egisters. The re
a4b0: 67 69 73 74 65 72 73 20 61 72 65 20 75 73 65 64  gisters are used
a4c0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
a4d0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
a4e0: 20 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20   regApp+0: slot 
a4f0: 74 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61  to copy min()/ma
a500: 78 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  x() argument to 
a510: 66 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20  for MakeRecord. 
a520: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70       **   regApp
a530: 2b 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c 75  +1: integer valu
a540: 65 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  e used to ensure
a550: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
a560: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41  .      **   regA
a570: 70 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66 20  pp+2: output of 
a580: 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20  MakeRecord.     
a590: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
a5a0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e  st *pList = pWin
a5b0: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
a5c0: 74 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  t;.      KeyInfo
a5d0: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c   *pKeyInfo = sql
a5e0: 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
a5f0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
a600: 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pList, 0, 0);.  
a610: 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70      pWin->csrApp
a620: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
a630: 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72  +;.      pWin->r
a640: 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  egApp = pParse->
a650: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50  nMem+1;.      pP
a660: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b  arse->nMem += 3;
a670: 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
a680: 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46 75  nfo && pWin->pFu
a690: 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69  nc->zName[1]=='i
a6a0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ' ){.        ass
a6b0: 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
a6c0: 53 6f 72 74 46 6c 61 67 73 5b 30 5d 3d 3d 30 20  SortFlags[0]==0 
a6d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  );.        pKeyI
a6e0: 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b  nfo->aSortFlags[
a6f0: 30 5d 20 3d 20 4b 45 59 49 4e 46 4f 5f 4f 52 44  0] = KEYINFO_ORD
a700: 45 52 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 7d  ER_DESC;.      }
a710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a720: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
a730: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57  penEphemeral, pW
a740: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a  in->csrApp, 2);.
a750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a760: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
a770: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
a780: 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  O);.      sqlite
a790: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a7a0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
a7b0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
a7c0: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
a7d0: 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f  ( p->zName==nth_
a7e0: 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e  valueName || p->
a7f0: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
a800: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
a810: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20  /* Allocate two 
a820: 72 65 67 69 73 74 65 72 73 20 61 74 20 70 57 69  registers at pWi
a830: 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68 65 73 65  n->regApp. These
a840: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
a850: 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  .      ** store 
a860: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
a870: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  d index of the c
a880: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a  urrent frame.  *
a890: 2f 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  /.      pWin->re
a8a0: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
a8b0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57 69  Mem+1;.      pWi
a8c0: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
a8d0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
a8e0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
a8f0: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
a900: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a910: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
a920: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
a930: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
a940: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
a950: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
a960: 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61   || p->zName==la
a970: 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 70  gName ){.      p
a980: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
a990: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
a9c0: 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  Dup, pWin->csrAp
a9d0: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
a9e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
a9f0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f  .#define WINDOW_
aa00: 53 54 41 52 54 49 4e 47 5f 49 4e 54 20 20 30 0a  STARTING_INT  0.
aa10: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 45  #define WINDOW_E
aa20: 4e 44 49 4e 47 5f 49 4e 54 20 20 20 20 31 0a 23  NDING_INT    1.#
aa30: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 4e 54  define WINDOW_NT
aa40: 48 5f 56 41 4c 55 45 5f 49 4e 54 20 32 0a 23 64  H_VALUE_INT 2.#d
aa50: 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41  efine WINDOW_STA
aa60: 52 54 49 4e 47 5f 4e 55 4d 20 20 33 0a 23 64 65  RTING_NUM  3.#de
aa70: 66 69 6e 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49  fine WINDOW_ENDI
aa80: 4e 47 5f 4e 55 4d 20 20 20 20 34 0a 0a 2f 2a 0a  NG_NUM    4../*.
aa90: 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e 47 20  ** A "PRECEDING 
aaa0: 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d  <expr>" (eCond==
aab0: 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47  0) or "FOLLOWING
aac0: 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d   <expr>" (eCond=
aad0: 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20 76 61  =1) or the.** va
aae0: 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  lue of the secon
aaf0: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74  d argument to nt
ab00: 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f 6e 64  h_value() (eCond
ab10: 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20 62 65  ==2) has just be
ab20: 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  en.** evaluated 
ab30: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 6c  and the result l
ab40: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
ab50: 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  reg. This functi
ab60: 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 0a  on generates VM.
ab70: 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  ** code to check
ab80: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
ab90: 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
aba0: 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68  e integer and th
abb0: 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63 65 70  rows an.** excep
abc0: 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  tion if it is no
abd0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
abe0: 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c  d windowCheckVal
abf0: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
ac00: 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 65  , int reg, int e
ac10: 43 6f 6e 64 29 7b 0a 20 20 73 74 61 74 69 63 20  Cond){.  static 
ac20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 72  const char *azEr
ac30: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72 61  r[] = {.    "fra
ac40: 6d 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73  me starting offs
ac50: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
ac60: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
ac70: 72 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65  r",.    "frame e
ac80: 6e 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  nding offset mus
ac90: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
aca0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
acb0: 20 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65    "second argume
acc0: 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 20  nt to nth_value 
acd0: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
ace0: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
acf0: 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67   "frame starting
ad00: 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20   offset must be 
ad10: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e  a non-negative n
ad20: 75 6d 62 65 72 22 2c 0a 20 20 20 20 22 66 72 61  umber",.    "fra
ad30: 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65 74  me ending offset
ad40: 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e   must be a non-n
ad50: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 22 2c  egative number",
ad60: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69  .  };.  static i
ad70: 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f  nt aOp[] = { OP_
ad80: 47 65 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74  Ge, OP_Ge, OP_Gt
ad90: 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 20 7d  , OP_Ge, OP_Ge }
ada0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
adb0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
adc0: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a  rse);.  int regZ
add0: 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ero = sqlite3Get
ade0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
adf0: 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64  .  assert( eCond
ae00: 3e 3d 30 20 26 26 20 65 43 6f 6e 64 3c 41 72 72  >=0 && eCond<Arr
ae10: 61 79 53 69 7a 65 28 61 7a 45 72 72 29 20 29 3b  aySize(azErr) );
ae20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ae30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
ae40: 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b  er, 0, regZero);
ae50: 0a 20 20 69 66 28 20 65 43 6f 6e 64 3e 3d 57 49  .  if( eCond>=WI
ae60: 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55  NDOW_STARTING_NU
ae70: 4d 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  M ){.    int reg
ae80: 53 74 72 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  String = sqlite3
ae90: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
aea0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
aeb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
aec0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 53  String8, 0, regS
aed0: 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20 50 34  tring, 0, "", P4
aee0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
aef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
af00: 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53 74 72  v, OP_Ge, regStr
af10: 69 6e 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ing, sqlite3Vdbe
af20: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
af30: 2c 20 72 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  , reg);.    sqli
af40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
af50: 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
af60: 4d 45 52 49 43 7c 53 51 4c 49 54 45 5f 4a 55 4d  MERIC|SQLITE_JUM
af70: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 56 64  PIFNULL);.    Vd
af80: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
af90: 20 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64     assert( eCond
afa0: 3d 3d 33 20 7c 7c 20 65 43 6f 6e 64 3d 3d 34 20  ==3 || eCond==4 
afb0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
afc0: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
afd0: 33 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  3);.    VdbeCove
afe0: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
aff0: 3d 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  =4);.  }else{.  
b000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b010: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
b020: 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65  Int, reg, sqlite
b030: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
b040: 28 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62 65  (v)+2);.    Vdbe
b050: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b060: 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64 3d 3d   assert( eCond==
b070: 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20 7c 7c  0 || eCond==1 ||
b080: 20 65 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20 20 20   eCond==2 );.   
b090: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
b0a0: 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20  v, eCond==0);.  
b0b0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
b0c0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20  (v, eCond==1);. 
b0d0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
b0e0: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a  f(v, eCond==2);.
b0f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
b100: 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65  eAddOp3(v, aOp[e
b110: 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20  Cond], regZero, 
b120: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
b130: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
b140: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
b150: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
b160: 65 43 6f 6e 64 3d 3d 30 29 3b 20 2f 2a 20 4e 55  eCond==0); /* NU
b170: 4c 4c 20 63 61 73 65 20 63 61 70 74 75 72 65 64  LL case captured
b180: 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 6f 76   by */.  VdbeCov
b190: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
b1a0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 20 2f  (v, eCond==1); /
b1b0: 2a 20 20 20 74 68 65 20 4f 50 5f 4d 75 73 74 42  *   the OP_MustB
b1c0: 65 49 6e 74 20 2a 2f 0a 20 20 56 64 62 65 43 6f  eInt */.  VdbeCo
b1d0: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
b1e0: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a  f(v, eCond==2);.
b1f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
b200: 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f  verNullIf(v, eCo
b210: 6e 64 3d 3d 33 29 3b 20 2f 2a 20 4e 55 4c 4c 20  nd==3); /* NULL 
b220: 63 61 73 65 20 63 61 75 67 68 74 20 62 79 20 2a  case caught by *
b230: 2f 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  /.  VdbeCoverage
b240: 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65  NeverNullIf(v, e
b250: 43 6f 6e 64 3d 3d 34 29 3b 20 2f 2a 20 20 20 74  Cond==4); /*   t
b260: 68 65 20 4f 50 5f 47 65 20 2a 2f 0a 20 20 73 71  he OP_Ge */.  sq
b270: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
b280: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
b290: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b2a0: 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45 52  _Halt, SQLITE_ER
b2b0: 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a  ROR, OE_Abort);.
b2c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
b2d0: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
b2e0: 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50 34  azErr[eCond], P4
b2f0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
b300: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b310: 67 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65 72  g(pParse, regZer
b320: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  o);.}../*.** Ret
b330: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
b340: 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
b350: 65 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f 77  ed to the window
b360: 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69  -function associ
b370: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
b380: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
b390: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
b3a0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
b3b0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b3c0: 69 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  int windowArgCou
b3d0: 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  nt(Window *pWin)
b3e0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
b3f0: 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e  ist = pWin->pOwn
b400: 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 72  er->x.pList;.  r
b410: 65 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20 70  eturn (pList ? p
b420: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
b430: 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
b440: 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  uct WindowCodeAr
b450: 67 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 3b  g WindowCodeArg;
b460: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
b470: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
b480: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 3b  WindowCsrAndReg;
b490: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ../*.** See comm
b4a0: 65 6e 74 73 20 61 62 6f 76 65 20 73 74 72 75 63  ents above struc
b4b0: 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 2e  t WindowCodeArg.
b4c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 69 6e 64 6f  .*/.struct Windo
b4d0: 77 43 73 72 41 6e 64 52 65 67 20 7b 0a 20 20 69  wCsrAndReg {.  i
b4e0: 6e 74 20 63 73 72 3b 20 20 20 20 20 20 20 20 20  nt csr;         
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b500: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
b510: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 3b 20 20 20  */.  int reg;   
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
b540: 20 61 72 72 61 79 20 6f 66 20 70 65 65 72 20 76   array of peer v
b550: 61 6c 75 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  alues */.};../*.
b560: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 73 74  ** A single inst
b570: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
b580: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
b590: 74 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ted on the stack
b5a0: 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   by .** sqlite3W
b5b0: 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20  indowCodeStep() 
b5c0: 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
b5d0: 20 69 74 20 70 61 73 73 65 64 20 74 6f 20 74 68   it passed to th
b5e0: 65 20 76 61 72 69 6f 75 73 20 68 65 6c 70 65 72  e various helper
b5f0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2e 20 54 68  .** routines. Th
b600: 69 73 20 69 73 20 74 6f 20 72 65 64 75 63 65 20  is is to reduce 
b610: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  the number of ar
b620: 67 75 6d 65 6e 74 73 20 72 65 71 75 69 72 65 64  guments required
b630: 20 62 79 20 65 61 63 68 0a 2a 2a 20 68 65 6c 70   by each.** help
b640: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
b650: 2a 2a 20 72 65 67 41 72 67 3a 0a 2a 2a 20 20 20  ** regArg:.**   
b660: 45 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  Each window func
b670: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
b680: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
b690: 69 73 74 65 72 20 28 6a 75 73 74 20 61 73 20 61  ister (just as a
b6a0: 6e 0a 2a 2a 20 20 20 6f 72 64 69 6e 61 72 79 20  n.**   ordinary 
b6b0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
b6c0: 6f 6e 20 64 6f 65 73 29 2e 20 54 68 69 73 20 76  on does). This v
b6d0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
b6e0: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  o the first.**  
b6f0: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
b700: 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
b710: 73 74 65 72 73 20 2d 20 6f 6e 65 20 66 6f 72 20  sters - one for 
b720: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
b730: 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20 74 68 65  tion.**   in the
b740: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 2e 70   WindowCodeArg.p
b750: 4d 57 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  MWin list..**.**
b760: 20 65 44 65 6c 65 74 65 3a 0a 2a 2a 20 20 20 54   eDelete:.**   T
b770: 68 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  he window functi
b780: 6f 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ons implementati
b790: 6f 6e 20 73 6f 6d 65 74 69 6d 65 73 20 63 61 63  on sometimes cac
b7a0: 68 65 73 20 74 68 65 20 69 6e 70 75 74 20 72 6f  hes the input ro
b7b0: 77 73 0a 2a 2a 20 20 20 74 68 61 74 20 69 74 20  ws.**   that it 
b7c0: 70 72 6f 63 65 73 73 65 73 20 69 6e 20 61 20 74  processes in a t
b7d0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
b7e0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
b7f0: 6f 2c 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72  o, this.**   var
b800: 69 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20  iable indicates 
b810: 77 68 65 6e 20 72 6f 77 73 20 6d 61 79 20 62 65  when rows may be
b820: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
b830: 65 20 74 65 6d 70 20 74 61 62 6c 65 20 28 69 6e  e temp table (in
b840: 0a 2a 2a 20 20 20 6f 72 64 65 72 20 74 6f 20 72  .**   order to r
b850: 65 64 75 63 65 20 6d 65 6d 6f 72 79 20 72 65 71  educe memory req
b860: 75 69 72 65 6d 65 6e 74 73 20 2d 20 69 74 20 77  uirements - it w
b870: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 73  ould always be s
b880: 61 66 65 20 6a 75 73 74 0a 2a 2a 20 20 20 74 6f  afe just.**   to
b890: 20 6c 65 61 76 65 20 74 68 65 6d 20 74 68 65 72   leave them ther
b8a0: 65 29 2e 20 50 6f 73 73 69 62 6c 65 20 76 61 6c  e). Possible val
b8b0: 75 65 73 20 66 6f 72 20 65 44 65 6c 65 74 65 20  ues for eDelete 
b8c0: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  are:.**.**      
b8d0: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
b8e0: 57 3a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6e 20  W:.**        An 
b8f0: 69 6e 70 75 74 20 72 6f 77 20 63 61 6e 20 62 65  input row can be
b900: 20 64 69 73 63 61 72 64 65 64 20 61 66 74 65 72   discarded after
b910: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
b920: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
b930: 2a 0a 2a 2a 20 20 20 20 20 20 57 49 4e 44 4f 57  *.**      WINDOW
b940: 5f 41 47 47 49 4e 56 45 52 53 45 3a 0a 2a 2a 20  _AGGINVERSE:.** 
b950: 20 20 20 20 20 20 20 41 6e 20 69 6e 70 75 74 20         An input 
b960: 72 6f 77 20 63 61 6e 20 62 65 20 64 69 73 63 61  row can be disca
b970: 72 64 65 64 20 61 66 74 65 72 20 74 68 65 20 77  rded after the w
b980: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
b990: 78 49 6e 76 65 72 73 65 28 29 0a 2a 2a 20 20 20  xInverse().**   
b9a0: 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 73 20 68       callbacks h
b9b0: 61 76 65 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64  ave been invoked
b9c0: 20 69 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 20 20   in it..**.**   
b9d0: 20 20 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45     WINDOW_AGGSTE
b9e0: 50 3a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6e 20  P:.**        An 
b9f0: 69 6e 70 75 74 20 72 6f 77 20 63 61 6e 20 62 65  input row can be
ba00: 20 64 69 73 63 61 72 64 65 64 20 61 66 74 65 72   discarded after
ba10: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 75 6e 63   the window func
ba20: 74 69 6f 6e 73 20 78 53 74 65 70 28 29 0a 2a 2a  tions xStep().**
ba30: 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
ba40: 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 76 6f  s have been invo
ba50: 6b 65 64 20 69 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a  ked in it..**.**
ba60: 20 73 74 61 72 74 2c 63 75 72 72 65 6e 74 2c 65   start,current,e
ba70: 6e 64 0a 2a 2a 20 20 20 43 6f 6e 73 69 64 65 72  nd.**   Consider
ba80: 20 61 20 77 69 6e 64 6f 77 2d 66 72 61 6d 65 20   a window-frame 
ba90: 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 66  similar to the f
baa0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
bab0: 20 20 20 20 28 4f 52 44 45 52 20 42 59 20 61 2c      (ORDER BY a,
bac0: 20 62 20 47 52 4f 55 50 53 20 42 45 54 57 45 45   b GROUPS BETWEE
bad0: 4e 20 32 20 50 52 45 43 45 44 49 4e 47 20 41 4e  N 2 PRECEDING AN
bae0: 44 20 32 20 46 4f 4c 4c 4f 57 49 4e 47 29 0a 2a  D 2 FOLLOWING).*
baf0: 2a 0a 2a 2a 20 20 20 54 68 65 20 77 69 6e 64 6f  *.**   The windo
bb00: 77 73 20 66 75 6e 63 74 69 6f 6e 73 20 69 6d 70  ws functions imp
bb10: 6c 6d 65 6e 74 61 74 69 6f 6e 20 63 61 63 68 65  lmentation cache
bb20: 73 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77 73  s the input rows
bb30: 20 69 6e 20 61 20 74 65 6d 70 0a 2a 2a 20 20 20   in a temp.**   
bb40: 74 61 62 6c 65 2c 20 73 6f 72 74 65 64 20 62 79  table, sorted by
bb50: 20 22 61 2c 20 62 22 20 28 69 74 20 61 63 74 75   "a, b" (it actu
bb60: 61 6c 6c 79 20 70 6f 70 75 6c 61 74 65 73 20 74  ally populates t
bb70: 68 65 20 63 61 63 68 65 20 6c 61 7a 69 6c 79 2c  he cache lazily,
bb80: 20 61 6e 64 0a 2a 2a 20 20 20 61 67 67 72 65 73   and.**   aggres
bb90: 73 69 76 65 6c 79 20 72 65 6d 6f 76 65 73 20 72  sively removes r
bba0: 6f 77 73 20 6f 6e 63 65 20 74 68 65 79 20 61 72  ows once they ar
bbb0: 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  e no longer requ
bbc0: 69 72 65 64 2c 20 62 75 74 20 74 68 61 74 27 73  ired, but that's
bbd0: 0a 2a 2a 20 20 20 61 20 6d 65 72 65 20 64 65 74  .**   a mere det
bbe0: 61 69 6c 29 2e 20 49 74 20 6b 65 65 70 73 20 74  ail). It keeps t
bbf0: 68 72 65 65 20 63 75 72 73 6f 72 73 20 6f 70 65  hree cursors ope
bc00: 6e 20 6f 6e 20 74 68 65 20 74 65 6d 70 20 74 61  n on the temp ta
bc10: 62 6c 65 2e 20 4f 6e 65 0a 2a 2a 20 20 20 28 63  ble. One.**   (c
bc20: 75 72 72 65 6e 74 29 20 74 68 61 74 20 70 6f 69  urrent) that poi
bc30: 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nts to the next 
bc40: 72 6f 77 20 74 6f 20 72 65 74 75 72 6e 20 74 6f  row to return to
bc50: 20 74 68 65 20 71 75 65 72 79 20 65 6e 67 69 6e   the query engin
bc60: 65 0a 2a 2a 20 20 20 6f 6e 63 65 20 69 74 73 20  e.**   once its 
bc70: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
bc80: 76 61 6c 75 65 73 20 68 61 76 65 20 62 65 65 6e  values have been
bc90: 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 41 6e 6f   calculated. Ano
bca0: 74 68 65 72 20 28 65 6e 64 29 0a 2a 2a 20 20 20  ther (end).**   
bcb0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65  points to the ne
bcc0: 78 74 20 72 6f 77 20 74 6f 20 63 61 6c 6c 20 74  xt row to call t
bcd0: 68 65 20 78 53 74 65 70 28 29 20 6d 65 74 68 6f  he xStep() metho
bce0: 64 20 6f 66 20 65 61 63 68 20 77 69 6e 64 6f 77  d of each window
bcf0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 6f   function.**   o
bd00: 6e 20 28 73 6f 20 74 68 61 74 20 69 74 20 69 73  n (so that it is
bd10: 20 32 20 67 72 6f 75 70 73 20 61 68 65 61 64 20   2 groups ahead 
bd20: 6f 66 20 63 75 72 72 65 6e 74 29 2e 20 41 6e 64  of current). And
bd30: 20 61 20 74 68 69 72 64 20 28 73 74 61 72 74 29   a third (start)
bd40: 20 74 68 61 74 0a 2a 2a 20 20 20 70 6f 69 6e 74   that.**   point
bd50: 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  s to the next ro
bd60: 77 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 78 49  w to call the xI
bd70: 6e 76 65 72 73 65 28 29 20 6d 65 74 68 6f 64 20  nverse() method 
bd80: 6f 66 20 65 61 63 68 20 77 69 6e 64 6f 77 0a 2a  of each window.*
bd90: 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 2e  *   function on.
bda0: 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 63 75  .**.**   Each cu
bdb0: 72 73 6f 72 20 28 73 74 61 72 74 2c 20 63 75 72  rsor (start, cur
bdc0: 72 65 6e 74 20 61 6e 64 20 65 6e 64 29 20 63 6f  rent and end) co
bdd0: 6e 73 69 73 74 73 20 6f 66 20 61 20 56 44 42 45  nsists of a VDBE
bde0: 20 63 75 72 73 6f 72 0a 2a 2a 20 20 20 28 57 69   cursor.**   (Wi
bdf0: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 2e 63 73  ndowCsrAndReg.cs
be00: 72 29 20 61 6e 64 20 61 6e 20 61 72 72 61 79 20  r) and an array 
be10: 6f 66 20 72 65 67 69 73 74 65 72 73 20 28 73 74  of registers (st
be20: 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 57  arting at.**   W
be30: 69 6e 64 6f 77 43 6f 64 65 41 72 67 2e 72 65 67  indowCodeArg.reg
be40: 29 20 74 68 61 74 20 61 6c 77 61 79 73 20 63 6f  ) that always co
be50: 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f 66  ntains a copy of
be60: 20 74 68 65 20 70 65 65 72 20 76 61 6c 75 65 73   the peer values
be70: 20 0a 2a 2a 20 20 20 72 65 61 64 20 66 72 6f 6d   .**   read from
be80: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
be90: 6e 67 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ng cursor..**.**
bea0: 20 20 20 44 65 70 65 6e 64 69 6e 67 20 6f 6e 20     Depending on 
beb0: 74 68 65 20 77 69 6e 64 6f 77 2d 66 72 61 6d 65  the window-frame
bec0: 20 69 6e 20 71 75 65 73 74 69 6f 6e 2c 20 61 6c   in question, al
bed0: 6c 20 74 68 72 65 65 20 63 75 72 73 6f 72 73 20  l three cursors 
bee0: 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 62 65 20  may not.**   be 
bef0: 72 65 71 75 69 72 65 64 2e 20 49 6e 20 74 68 69  required. In thi
bf00: 73 20 63 61 73 65 20 62 6f 74 68 20 57 69 6e 64  s case both Wind
bf10: 6f 77 43 6f 64 65 41 72 67 2e 63 73 72 20 61 6e  owCodeArg.csr an
bf20: 64 20 72 65 67 20 61 72 65 20 73 65 74 20 74 6f  d reg are set to
bf30: 0a 2a 2a 20 20 20 30 2e 0a 2a 2f 0a 73 74 72 75  .**   0..*/.stru
bf40: 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  ct WindowCodeArg
bf50: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
bf60: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
bf70: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
bf80: 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d   */.  Window *pM
bf90: 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Win;            
bfa0: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 6c 69 73   /* First in lis
bfb0: 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 62  t of functions b
bfc0: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a  eing processed *
bfd0: 2f 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b  /.  Vdbe *pVdbe;
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bff0: 2a 20 56 44 42 45 20 6f 62 6a 65 63 74 20 2a 2f  * VDBE object */
c000: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
c010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c020: 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 74 68 69   OP_Gosub to thi
c030: 73 20 61 64 64 72 65 73 73 20 74 6f 20 72 65 74  s address to ret
c040: 75 72 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 20  urn one row */. 
c050: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 3b 20 20   int regGosub;  
c060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c070: 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74  egister used wit
c080: 68 20 4f 50 5f 47 6f 73 75 62 28 61 64 64 72 47  h OP_Gosub(addrG
c090: 6f 73 75 62 29 20 2a 2f 0a 20 20 69 6e 74 20 72  osub) */.  int r
c0a0: 65 67 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  egArg;          
c0b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
c0c0: 6e 20 61 72 72 61 79 20 6f 66 20 61 63 63 75 6d  n array of accum
c0d0: 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
c0e0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 6c 65 74   */.  int eDelet
c0f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c100: 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f   /* See above */
c110: 0a 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64  ..  WindowCsrAnd
c120: 52 65 67 20 73 74 61 72 74 3b 0a 20 20 57 69 6e  Reg start;.  Win
c130: 64 6f 77 43 73 72 41 6e 64 52 65 67 20 63 75 72  dowCsrAndReg cur
c140: 72 65 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73  rent;.  WindowCs
c150: 72 41 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b 0a  rAndReg end;.};.
c160: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c170: 56 4d 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20  VM code to read 
c180: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
c190: 73 20 70 65 65 72 20 76 61 6c 75 65 73 20 66 72  s peer values fr
c1a0: 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 20 69 6e  om cursor csr in
c1b0: 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f  to.** an array o
c1c0: 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  f registers star
c1d0: 74 69 6e 67 20 61 74 20 72 65 67 2e 0a 2a 2f 0a  ting at reg..*/.
c1e0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
c1f0: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
c200: 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  (.  WindowCodeAr
c210: 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63 73 72 2c  g *p,.  int csr,
c220: 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b 0a 20 20  .  int reg.){.  
c230: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
c240: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45 78 70 72  p->pMWin;.  Expr
c250: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
c260: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
c270: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
c280: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
c290: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c2a0: 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20 20  (p->pParse);.   
c2b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
c2c0: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
c2d0: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 43  tion;.    int iC
c2e0: 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e  olOff = pMWin->n
c2f0: 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50 61  BufferCol + (pPa
c300: 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
c310: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
c320: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
c330: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
c340: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
c350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c360: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
c370: 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69 2c 20 72  sr, iColOff+i, r
c380: 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  eg+i);.    }.  }
c390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c3a0: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
c3b0: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53 74 65  voke either xSte
c3c0: 70 28 29 20 28 69 66 20 62 49 6e 76 65 72 73 65  p() (if bInverse
c3d0: 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20 78 49   is 0) or .** xI
c3e0: 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e 76 65  nverse (if bInve
c3f0: 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29  rse is non-zero)
c400: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
c410: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
c420: 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
c430: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 4d 57   starting at pMW
c440: 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c  in. Or, for buil
c450: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
c460: 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 64 6f  tions.** that do
c470: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
c480: 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e 20 41  ndard function A
c490: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
c4a0: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69 6e 6c   required.** inl
c4b0: 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a  ine VM code..**.
c4c0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 63  ** If argument c
c4d0: 73 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  sr is greater th
c4e0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30  an or equal to 0
c4f0: 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e 74 20  , then argument 
c500: 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  reg is.** the fi
c510: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
c520: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
c530: 73 74 65 72 73 20 67 75 61 72 61 6e 74 65 65 64  sters guaranteed
c540: 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
c550: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
c560: 68 65 20 61 72 72 61 79 20 6f 66 20 61 72 67 75  he array of argu
c570: 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68 20 66  ments for each f
c580: 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  unction. In this
c590: 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61 72 67   case.** the arg
c5a0: 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74 72 61  uments are extra
c5b0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 75  cted from the cu
c5c0: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 73 72  rrent row of csr
c5d0: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72   into the.** arr
c5e0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
c5f0: 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
c600: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
c610: 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a  _AggInverse.**.*
c620: 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69 73 20  * Or, if csr is 
c630: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
c640: 74 68 65 6e 20 74 68 65 20 61 72 72 61 79 20 6f  then the array o
c650: 66 20 72 65 67 69 73 74 65 72 73 20 61 74 20 72  f registers at r
c660: 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  eg is.** already
c670: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
c680: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  all columns from
c690: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
c6a0: 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
c6b0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  y..**.** If argu
c6c0: 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65  ment regPartSize
c6d0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
c6e0: 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69 73  en it is a regis
c6f0: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
c700: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
c710: 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75 72 72  rows in the curr
c720: 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ent partition..*
c730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
c740: 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20 20 57  ndowAggStep(.  W
c750: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c  indowCodeArg *p,
c760: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
c770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c780: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
c790: 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63  t of window func
c7a0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63  tions */.  int c
c7b0: 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
c7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c7d0: 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  ad arguments fro
c7e0: 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  m this cursor */
c7f0: 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c  .  int bInverse,
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
c820: 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e  voke xInverse in
c830: 73 74 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a  stead of xStep *
c840: 2f 0a 20 20 69 6e 74 20 72 65 67 20 20 20 20 20  /.  int reg     
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
c870: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 29 7b 0a  registers */.){.
c880: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c890: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  = p->pParse;.  V
c8a0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
c8b0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
c8c0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
c8d0: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
c8e0: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
c8f0: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
c900: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
c910: 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  c = pWin->pFunc;
c920: 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72 67 3b  .    int regArg;
c930: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  .    int nArg = 
c940: 70 57 69 6e 2d 3e 62 45 78 70 72 41 72 67 73 20  pWin->bExprArgs 
c950: 3f 20 30 20 3a 20 77 69 6e 64 6f 77 41 72 67 43  ? 0 : windowArgC
c960: 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20  ount(pWin);.    
c970: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65  int i;..    asse
c980: 72 74 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20  rt( bInverse==0 
c990: 7c 7c 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21  || pWin->eStart!
c9a0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b  =TK_UNBOUNDED );
c9b0: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 4f 56 45  ..    /* All OVE
c9c0: 52 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  R clauses in the
c9d0: 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 66 75 6e   same window fun
c9e0: 63 74 69 6f 6e 20 61 67 67 72 65 67 61 74 65 20  ction aggregate 
c9f0: 73 74 65 70 20 6d 75 73 74 0a 20 20 20 20 2a 2a  step must.    **
ca00: 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   be the same. */
ca10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
ca20: 6e 3d 3d 70 4d 57 69 6e 20 7c 7c 20 73 71 6c 69  n==pMWin || sqli
ca30: 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65  te3WindowCompare
ca40: 28 70 50 61 72 73 65 2c 70 57 69 6e 2c 70 4d 57  (pParse,pWin,pMW
ca50: 69 6e 2c 30 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  in,0)==0 );..   
ca60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
ca70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ca80: 28 20 69 21 3d 31 20 7c 7c 20 70 46 75 6e 63 2d  ( i!=1 || pFunc-
ca90: 3e 7a 4e 61 6d 65 21 3d 6e 74 68 5f 76 61 6c 75  >zName!=nth_valu
caa0: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  eName ){.       
cab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cac0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
cad0: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
cae0: 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Col+i, reg+i);. 
caf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cb00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cb10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
cb20: 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  mn, pMWin->iEphC
cb30: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
cb40: 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20  l+i, reg+i);.   
cb50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
cb60: 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a 20 20  egArg = reg;..  
cb70: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67    if( pMWin->reg
cb80: 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20  StartRowid==0.  
cb90: 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e 66 75     && (pFunc->fu
cba0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
cbb0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
cbc0: 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53      && (pWin->eS
cbd0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
cbe0: 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED).    ){.     
cbf0: 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 20   int addrIsNull 
cc00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cc10: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
cc20: 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20  , regArg);.     
cc30: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
cc40: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 76  ;.      if( bInv
cc50: 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erse==0 ){.     
cc60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc70: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
cc80: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  m, pWin->regApp+
cc90: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 1);.        s
cca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ccb0: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65  (v, OP_SCopy, re
ccc0: 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41  gArg, pWin->regA
ccd0: 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pp);.        sql
cce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ccf0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
cd00: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32   pWin->regApp, 2
cd10: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32  , pWin->regApp+2
cd20: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cd30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cd40: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57  OP_IdxInsert, pW
cd50: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e  in->csrApp, pWin
cd60: 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20  ->regApp+2);.   
cd70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cd80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd90: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65  Op4Int(v, OP_See
cda0: 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  kGE, pWin->csrAp
cdb0: 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29  p, 0, regArg, 1)
cdc0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
cdd0: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
cde0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
cdf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ce00: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57 69  , OP_Delete, pWi
ce10: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
ce20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ce30: 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74  umpHere(v, sqlit
ce40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ce50: 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d  r(v)-2);.      }
ce60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ce70: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ce80: 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  drIsNull);.    }
ce90: 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72  else if( pWin->r
cea0: 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  egApp ){.      a
ceb0: 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 7a 4e  ssert( pFunc->zN
cec0: 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame==nth_valueNa
ced0: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  me.           ||
cee0: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66   pFunc->zName==f
cef0: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  irst_valueName. 
cf00: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
cf10: 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d 3d  sert( bInverse==
cf20: 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31  0 || bInverse==1
cf30: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
cf40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cf50: 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e  P_AddImm, pWin->
cf60: 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72 73  regApp+1-bInvers
cf70: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 1);.    }else
cf80: 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75   if( pFunc->xSFu
cf90: 6e 63 21 3d 6e 6f 6f 70 53 74 65 70 46 75 6e 63  nc!=noopStepFunc
cfa0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
cfb0: 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  drIf = 0;.      
cfc0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
cfd0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
cfe0: 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20   regTmp;.       
cff0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 62   assert( pWin->b
d000: 45 78 70 72 41 72 67 73 20 7c 7c 20 21 6e 41 72  ExprArgs || !nAr
d010: 67 20 7c 7c 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e  g ||nArg==pWin->
d020: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
d030: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
d040: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e    assert( pWin->
d050: 62 45 78 70 72 41 72 67 73 20 7c 7c 20 6e 41 72  bExprArgs || nAr
d060: 67 20 20 7c 7c 70 57 69 6e 2d 3e 70 4f 77 6e 65  g  ||pWin->pOwne
d070: 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b  r->x.pList==0 );
d080: 0a 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20  .        regTmp 
d090: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d0a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
d0b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d0c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
d0d0: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
d0e0: 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67  iArgCol+nArg,reg
d0f0: 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 61 64  Tmp);.        ad
d100: 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64  drIf = sqlite3Vd
d110: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
d120: 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c  fNot, regTmp, 0,
d130: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
d140: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
d160: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
d170: 73 65 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20  se, regTmp);.   
d180: 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
d190: 20 20 69 66 28 20 70 57 69 6e 2d 3e 62 45 78 70    if( pWin->bExp
d1a0: 72 41 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  rArgs ){.       
d1b0: 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20 73 71   int iStart = sq
d1c0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d1d0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
d1e0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 2c 20 2a 70   VdbeOp *pOp, *p
d1f0: 45 6e 64 3b 0a 0a 20 20 20 20 20 20 20 20 6e 41  End;..        nA
d200: 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  rg = pWin->pOwne
d210: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
d220: 72 3b 0a 20 20 20 20 20 20 20 20 72 65 67 41 72  r;.        regAr
d230: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
d240: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d250: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 73  nArg);.        s
d260: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
d270: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
d280: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
d290: 4c 69 73 74 2c 20 72 65 67 41 72 67 2c 20 30 2c  List, regArg, 0,
d2a0: 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45   0);..        pE
d2b0: 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
d2c0: 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20  GetOp(v, -1);.  
d2d0: 20 20 20 20 20 20 66 6f 72 28 70 4f 70 3d 73 71        for(pOp=sq
d2e0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
d2f0: 2c 20 69 53 74 61 72 74 29 3b 20 70 4f 70 3c 3d  , iStart); pOp<=
d300: 70 45 6e 64 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20  pEnd; pOp++){.  
d310: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
d320: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
d330: 6d 6e 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 70  mn && pOp->p1==p
d340: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 7b 0a  Win->iEphCsr ){.
d350: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d              pOp-
d360: 3e 70 31 20 3d 20 63 73 72 3b 0a 20 20 20 20 20  >p1 = csr;.     
d370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
d380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d390: 66 28 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  f( pFunc->funcFl
d3a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
d3b0: 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
d3c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
d3d0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  Coll;.        as
d3e0: 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29 3b 0a  sert( nArg>0 );.
d3f0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
d400: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
d410: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 57 69  lSeq(pParse, pWi
d420: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
d430: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
d440: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d450: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
d460: 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c  _CollSeq, 0,0,0,
d470: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43   (const char*)pC
d480: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
d490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d4b0: 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f 20 4f  3(v, bInverse? O
d4c0: 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a 20 4f  P_AggInverse : O
d4d0: 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20 20 20  P_AggStep, .    
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20 72 65      bInverse, re
d500: 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41  gArg, pWin->regA
d510: 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ccum);.      sql
d520: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
d530: 28 76 2c 20 70 46 75 6e 63 2c 20 50 34 5f 46 55  (v, pFunc, P4_FU
d540: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
d550: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d560: 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
d570: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
d580: 62 45 78 70 72 41 72 67 73 20 29 7b 0a 20 20 20  bExprArgs ){.   
d590: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
d5a0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d5b0: 72 73 65 2c 20 72 65 67 41 72 67 2c 20 6e 41 72  rse, regArg, nAr
d5c0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
d5d0: 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73    if( addrIf ) s
d5e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d5f0: 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20  re(v, addrIf);. 
d600: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
d610: 2a 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61  * Values that ma
d620: 79 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74  y be passed as t
d630: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
d640: 6e 74 20 74 6f 20 77 69 6e 64 6f 77 43 6f 64 65  nt to windowCode
d650: 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  Op()..*/.#define
d660: 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
d670: 4f 57 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e  OW 1.#define WIN
d680: 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32  DOW_AGGINVERSE 2
d690: 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f  .#define WINDOW_
d6a0: 41 47 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a  AGGSTEP    3../*
d6b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20  .** Generate VM 
d6c0: 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65  code to invoke e
d6d0: 69 74 68 65 72 20 78 56 61 6c 75 65 28 29 20 28  ither xValue() (
d6e0: 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78 46 69 6e  bFin==0) or xFin
d6f0: 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e  alize().** (bFin
d700: 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77 69  ==1) for each wi
d710: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
d720: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
d730: 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20   starting at.** 
d740: 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62  pMWin. Or, for b
d750: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66  uilt-in window-f
d760: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f  unctions that do
d770: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
d780: 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65  ndard.** API, ge
d790: 6e 65 72 61 74 65 20 74 68 65 20 65 71 75 69 76  nerate the equiv
d7a0: 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a  alent VM code..*
d7b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
d7c0: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 57 69 6e  ndowAggFinal(Win
d7d0: 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 69  dowCodeArg *p, i
d7e0: 6e 74 20 62 46 69 6e 29 7b 0a 20 20 50 61 72 73  nt bFin){.  Pars
d7f0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
d800: 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20  Parse;.  Window 
d810: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
d820: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  n;.  Vdbe *v = s
d830: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d840: 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20  arse);.  Window 
d850: 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70 57  *pWin;..  for(pW
d860: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
d870: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
d880: 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  Win){.    if( pM
d890: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
d8a0: 69 64 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  id==0.     && (p
d8b0: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
d8c0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
d8d0: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20  UNC_MINMAX) .   
d8e0: 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61    && (pWin->eSta
d8f0: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
d900: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
d910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d920: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d930: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
d940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d950: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d960: 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41  Last, pWin->csrA
d970: 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  pp);.      VdbeC
d980: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d9a0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
d9b0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
d9c0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
d9d0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
d9e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d9f0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
da00: 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a  rentAddr(v)-2);.
da10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
da20: 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20  in->regApp ){.  
da30: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
da40: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
da50: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
da60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67  {.      int nArg
da70: 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e   = windowArgCoun
da80: 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 69  t(pWin);.      i
da90: 66 28 20 62 46 69 6e 20 29 7b 0a 20 20 20 20 20  f( bFin ){.     
daa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dab0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
dac0: 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  nal, pWin->regAc
dad0: 63 75 6d 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  cum, nArg);.    
dae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
daf0: 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d  ppendP4(v, pWin-
db00: 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
db10: 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  EF);.        sql
db20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
db30: 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d  , OP_Copy, pWin-
db40: 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d  >regAccum, pWin-
db50: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
db60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
db80: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
db90: 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ccum);.      }el
dba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
dbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dbc0: 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c 70 57 69   OP_AggValue,pWi
dbd0: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 6e 41 72 67  n->regAccum,nArg
dbe0: 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74  ,pWin->regResult
dbf0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dc00: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
dc10: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
dc20: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
dc30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
dc40: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
dc50: 63 6f 64 65 20 74 6f 20 63 61 6c 63 75 6c 61 74  code to calculat
dc60: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  e the current va
dc70: 6c 75 65 73 20 6f 66 20 61 6c 6c 20 77 69 6e 64  lues of all wind
dc80: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ow functions in 
dc90: 74 68 65 0a 2a 2a 20 70 2d 3e 70 4d 57 69 6e 20  the.** p->pMWin 
dca0: 6c 69 73 74 20 62 79 20 64 6f 69 6e 67 20 61 20  list by doing a 
dcb0: 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 74 68 65  full scan of the
dcc0: 20 63 75 72 72 65 6e 74 20 77 69 6e 64 6f 77 20   current window 
dcd0: 66 72 61 6d 65 2e 20 53 74 6f 72 65 20 74 68 65  frame. Store the
dce0: 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 74  .** results in t
dcf0: 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73  he Window.regRes
dd00: 75 6c 74 20 72 65 67 69 73 74 65 72 73 2c 20 72  ult registers, r
dd10: 65 61 64 79 20 74 6f 20 72 65 74 75 72 6e 20 74  eady to return t
dd20: 68 65 20 75 70 70 65 72 0a 2a 2a 20 6c 61 79 65  he upper.** laye
dd30: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
dd40: 64 20 77 69 6e 64 6f 77 46 75 6c 6c 53 63 61 6e  d windowFullScan
dd50: 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a  (WindowCodeArg *
dd60: 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  p){.  Window *pW
dd70: 69 6e 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in;.  Parse *pPa
dd80: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
dd90: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
dda0: 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56   = p->pMWin;.  V
ddb0: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62  dbe *v = p->pVdb
ddc0: 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67 43 52 6f  e;..  int regCRo
ddd0: 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
dde0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
ddf0: 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a   rowid value */.
de00: 20 20 69 6e 74 20 72 65 67 43 50 65 65 72 20 3d    int regCPeer =
de10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
de20: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 65 65    /* Current pee
de30: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
de40: 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de60: 20 41 67 67 53 74 65 70 20 72 6f 77 69 64 20 76   AggStep rowid v
de70: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  alue */.  int re
de80: 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20  gPeer = 0;      
de90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 67 67            /* Agg
dea0: 53 74 65 70 20 70 65 65 72 20 76 61 6c 75 65 73  Step peer values
deb0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 65 65 72   */..  int nPeer
dec0: 3b 0a 20 20 69 6e 74 20 6c 62 6c 4e 65 78 74 3b  ;.  int lblNext;
ded0: 0a 20 20 69 6e 74 20 6c 62 6c 42 72 6b 3b 0a 20  .  int lblBrk;. 
dee0: 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a 20   int addrNext;. 
def0: 20 69 6e 74 20 63 73 72 3b 0a 0a 20 20 56 64 62   int csr;..  Vdb
df00: 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
df10: 76 2c 20 22 77 69 6e 64 6f 77 46 75 6c 6c 53 63  v, "windowFullSc
df20: 61 6e 20 62 65 67 69 6e 22 29 29 3b 0a 0a 20 20  an begin"));..  
df30: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 21 3d 30  assert( pMWin!=0
df40: 20 29 3b 0a 20 20 63 73 72 20 3d 20 70 4d 57 69   );.  csr = pMWi
df50: 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 6e 50 65  n->csrApp;.  nPe
df60: 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72  er = (pMWin->pOr
df70: 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70  derBy ? pMWin->p
df80: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
df90: 20 30 29 3b 0a 0a 20 20 6c 62 6c 4e 65 78 74 20   0);..  lblNext 
dfa0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
dfb0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
dfc0: 20 20 6c 62 6c 42 72 6b 20 3d 20 73 71 6c 69 74    lblBrk = sqlit
dfd0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
dfe0: 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 67 43  pParse);..  regC
dff0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
e000: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
e010: 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20  );.  regRowid = 
e020: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
e030: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  g(pParse);.  if(
e040: 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20 72 65   nPeer ){.    re
e050: 67 43 50 65 65 72 20 3d 20 73 71 6c 69 74 65 33  gCPeer = sqlite3
e060: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
e070: 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20  rse, nPeer);.   
e080: 20 72 65 67 50 65 65 72 20 3d 20 73 71 6c 69 74   regPeer = sqlit
e090: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
e0a0: 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20  Parse, nPeer);. 
e0b0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
e0c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
e0d0: 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  wid, pMWin->iEph
e0e0: 43 73 72 2c 20 72 65 67 43 52 6f 77 69 64 29 3b  Csr, regCRowid);
e0f0: 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65  .  windowReadPee
e100: 72 56 61 6c 75 65 73 28 70 2c 20 70 4d 57 69 6e  rValues(p, pMWin
e110: 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 43 50  ->iEphCsr, regCP
e120: 65 65 72 29 3b 0a 0a 20 20 66 6f 72 28 70 57 69  eer);..  for(pWi
e130: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
e140: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
e150: 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  in){.    sqlite3
e160: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e170: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
e180: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 7d 0a 0a  regAccum);.  }..
e190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e1a0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45  Op3(v, OP_SeekGE
e1b0: 2c 20 63 73 72 2c 20 6c 62 6c 42 72 6b 2c 20 70  , csr, lblBrk, p
e1c0: 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
e1d0: 77 69 64 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  wid);.  VdbeCove
e1e0: 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64 72 4e  rage(v);.  addrN
e1f0: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
e200: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
e210: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e220: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
e230: 2c 20 63 73 72 2c 20 72 65 67 52 6f 77 69 64 29  , csr, regRowid)
e240: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e250: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20  ddOp3(v, OP_Gt, 
e260: 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77  pMWin->regEndRow
e270: 69 64 2c 20 6c 62 6c 42 72 6b 2c 20 72 65 67 52  id, lblBrk, regR
e280: 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43 6f 76  owid);.  VdbeCov
e290: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76  erageNeverNull(v
e2a0: 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  );..  if( pMWin-
e2b0: 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 43 55  >eExclude==TK_CU
e2c0: 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 73 71 6c  RRENT ){.    sql
e2d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e2e0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f 77  , OP_Eq, regCRow
e2f0: 69 64 2c 20 6c 62 6c 4e 65 78 74 2c 20 72 65 67  id, lblNext, reg
e300: 52 6f 77 69 64 29 3b 0a 20 20 20 20 56 64 62 65  Rowid);.    Vdbe
e310: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
e320: 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  l(v);.  }else if
e330: 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64  ( pMWin->eExclud
e340: 65 21 3d 54 4b 5f 4e 4f 20 29 7b 0a 20 20 20 20  e!=TK_NO ){.    
e350: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e  int addr;.    in
e360: 74 20 61 64 64 72 45 71 20 3d 20 30 3b 0a 20 20  t addrEq = 0;.  
e370: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
e380: 6e 66 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  nfo = 0;..    if
e390: 28 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  ( pMWin->pOrderB
e3a0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49  y ){.      pKeyI
e3b0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
e3c0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
e3d0: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
e3e0: 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
e3f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e400: 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d  MWin->eExclude==
e410: 54 4b 5f 54 49 45 53 20 29 7b 0a 20 20 20 20 20  TK_TIES ){.     
e420: 20 61 64 64 72 45 71 20 3d 20 73 71 6c 69 74 65   addrEq = sqlite
e430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e440: 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69 64 2c  P_Eq, regCRowid,
e450: 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   0, regRowid);. 
e460: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
e470: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
e480: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4b 65     }.    if( pKe
e490: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 77  yInfo ){.      w
e4a0: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
e4b0: 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67 50  ues(p, csr, regP
e4c0: 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eer);.      sqli
e4d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e4e0: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
e4f0: 50 65 65 72 2c 20 72 65 67 43 50 65 65 72 2c 20  Peer, regCPeer, 
e500: 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  nPeer);.      sq
e510: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
e520: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
e530: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
e540: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
e550: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e560: 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
e570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e580: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
e590: 20 61 64 64 72 2c 20 6c 62 6c 4e 65 78 74 2c 20   addr, lblNext, 
e5a0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 56 64 62  addr);.      Vdb
e5b0: 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29  eCoverageEqNe(v)
e5c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e5e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
e5f0: 20 30 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a 20 20   0, lblNext);.  
e600: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 64 64 72    }.    if( addr
e610: 45 71 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  Eq ) sqlite3Vdbe
e620: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e630: 45 71 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64  Eq);.  }..  wind
e640: 6f 77 41 67 67 53 74 65 70 28 70 2c 20 70 4d 57  owAggStep(p, pMW
e650: 69 6e 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e 72  in, csr, 0, p->r
e660: 65 67 41 72 67 29 3b 0a 0a 20 20 73 71 6c 69 74  egArg);..  sqlit
e670: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
e680: 65 6c 28 76 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a  el(v, lblNext);.
e690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e6a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
e6b0: 63 73 72 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  csr, addrNext);.
e6c0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
e6d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
e6e0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e6f0: 4e 65 78 74 2d 31 29 3b 0a 20 20 73 71 6c 69 74  Next-1);.  sqlit
e700: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e710: 2c 20 61 64 64 72 4e 65 78 74 2b 31 29 3b 0a 20  , addrNext+1);. 
e720: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
e730: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
e740: 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
e750: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
e760: 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 52 6f  g(pParse, regCRo
e770: 77 69 64 29 3b 0a 20 20 69 66 28 20 6e 50 65 65  wid);.  if( nPee
e780: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
e790: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
e7a0: 28 70 50 61 72 73 65 2c 20 72 65 67 50 65 65 72  (pParse, regPeer
e7b0: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 73 71  , nPeer);.    sq
e7c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
e7d0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
e7e0: 67 43 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a  gCPeer, nPeer);.
e7f0: 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67    }..  windowAgg
e800: 46 69 6e 61 6c 28 70 2c 20 31 29 3b 0a 20 20 56  Final(p, 1);.  V
e810: 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
e820: 28 28 76 2c 20 22 77 69 6e 64 6f 77 46 75 6c 6c  ((v, "windowFull
e830: 53 63 61 6e 20 65 6e 64 22 29 29 3b 0a 7d 0a 0a  Scan end"));.}..
e840: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
e850: 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20   sub-routine at 
e860: 72 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72 61  regGosub (genera
e870: 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73  ted by code in s
e880: 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72  elect.c) to.** r
e890: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
e8a0: 74 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e  t row of Window.
e8b0: 69 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c 20  iEphCsr. If all 
e8c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
e8d0: 20 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61 74   are.** aggregat
e8e0: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
e8f0: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
e900: 73 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61 20  standard API, a 
e910: 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73  single.** OP_Gos
e920: 75 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ub instruction i
e930: 73 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73 20  s all that this 
e940: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
e950: 73 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64 65  s. Extra VM code
e960: 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77 20  .** for per-row 
e970: 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f 6e  processing is on
e980: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
e990: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   the following b
e9a0: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a  uilt-in window.*
e9b0: 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  * functions:.**.
e9c0: 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 29  **   nth_value()
e9d0: 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c 75  .**   first_valu
e9e0: 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a  e().**   lag().*
e9f0: 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74  *   lead().*/.st
ea00: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
ea10: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 57 69 6e  ReturnOneRow(Win
ea20: 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 29 7b 0a  dowCodeArg *p){.
ea30: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20    Window *pMWin 
ea40: 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64  = p->pMWin;.  Vd
ea50: 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65  be *v = p->pVdbe
ea60: 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  ;..  if( pMWin->
ea70: 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29 7b  regStartRowid ){
ea80: 0a 20 20 20 20 77 69 6e 64 6f 77 46 75 6c 6c 53  .    windowFullS
ea90: 63 61 6e 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  can(p);.  }else{
eaa0: 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72  .    Parse *pPar
eab0: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
eac0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
ead0: 3b 0a 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d  ;..    for(pWin=
eae0: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
eaf0: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
eb00: 29 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  ){.      FuncDef
eb10: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
eb20: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28  pFunc;.      if(
eb30: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
eb40: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  th_valueName.   
eb50: 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e      || pFunc->zN
eb60: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
eb70: 4e 61 6d 65 0a 20 20 20 20 20 20 29 7b 0a 20 20  Name.      ){.  
eb80: 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20        int csr = 
eb90: 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20  pWin->csrApp;.  
eba0: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
ebb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ebc0: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
ebd0: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
ebe0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
ebf0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
ec00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
ec20: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
ec30: 52 65 73 75 6c 74 29 3b 0a 20 20 0a 20 20 20 20  Result);.  .    
ec40: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
ec50: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
ec60: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
ec70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ec80: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
ec90: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 70  pMWin->iEphCsr,p
eca0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74  Win->iArgCol+1,t
ecb0: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
ecc0: 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c    windowCheckVal
ecd0: 75 65 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65  ue(pParse, tmpRe
ece0: 67 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  g, 2);.        }
ecf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ed00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ed10: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ed20: 20 31 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20   1, tmpReg);.   
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
ed40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ed50: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74 6d 70 52  (v, OP_Add, tmpR
ed60: 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  eg, pWin->regApp
ed70: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
ed80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ed90: 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70  dOp3(v, OP_Gt, p
eda0: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c  Win->regApp+1, l
edb0: 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  bl, tmpReg);.   
edc0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
edd0: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
ede0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
edf0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
ee00: 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 30  eekRowid, csr, 0
ee10: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
ee20: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e     VdbeCoverageN
ee30: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
ee40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ee50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
ee60: 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d  lumn, csr, pWin-
ee70: 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e  >iArgCol, pWin->
ee80: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
ee90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
eea0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
eeb0: 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  bl);.        sql
eec0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
eed0: 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65  eg(pParse, tmpRe
eee0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
eef0: 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e 63    else if( pFunc
ef00: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
ef10: 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  e || pFunc->zNam
ef20: 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20  e==lagName ){.  
ef30: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
ef40: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
ef50: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
ef60: 20 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d         int csr =
ef70: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20   pWin->csrApp;. 
ef80: 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d         int lbl =
ef90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
efa0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
efb0: 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65         int tmpRe
efc0: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
efd0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
efe0: 20 20 20 20 20 20 20 69 6e 74 20 69 45 70 68 20         int iEph 
eff0: 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  = pMWin->iEphCsr
f000: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28  ;.  .        if(
f010: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 20   nArg<3 ){.     
f020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f030: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
f040: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
f050: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
f060: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f080: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
f090: 20 69 45 70 68 2c 70 57 69 6e 2d 3e 69 41 72 67   iEph,pWin->iArg
f0a0: 43 6f 6c 2b 32 2c 70 57 69 6e 2d 3e 72 65 67 52  Col+2,pWin->regR
f0b0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
f0c0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
f0d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f0e0: 50 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74  P_Rowid, iEph, t
f0f0: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
f100: 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
f110: 20 20 20 20 20 20 20 20 69 6e 74 20 76 61 6c 20          int val 
f120: 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  = (pFunc->zName=
f130: 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 31 20 3a 20  =leadName ? 1 : 
f140: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  -1);.          s
f150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f160: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
f170: 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20  mpReg, val);.   
f180: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f190: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28        int op = (
f1a0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
f1b0: 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64 20  adName ? OP_Add 
f1c0: 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a  : OP_Subtract);.
f1d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d            int tm
f1e0: 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47  pReg2 = sqlite3G
f1f0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
f210: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f220: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70  , OP_Column, iEp
f230: 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  h, pWin->iArgCol
f240: 2b 31 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20  +1, tmpReg2);.  
f250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f260: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
f270: 20 74 6d 70 52 65 67 32 2c 20 74 6d 70 52 65 67   tmpReg2, tmpReg
f280: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
f290: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
f2a0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f2b0: 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20  e, tmpReg2);.   
f2c0: 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
f2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f2e0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
f2f0: 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74  wid, csr, lbl, t
f300: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
f310: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f330: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f340: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
f350: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
f360: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
f370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f380: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
f390: 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
f3a0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f3b0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d  mpReg(pParse, tm
f3c0: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pReg);.      }. 
f3d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
f3e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f3f0: 4f 50 5f 47 6f 73 75 62 2c 20 70 2d 3e 72 65 67  OP_Gosub, p->reg
f400: 47 6f 73 75 62 2c 20 70 2d 3e 61 64 64 72 47 6f  Gosub, p->addrGo
f410: 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  sub);.}../*.** G
f420: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
f430: 73 65 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61  set the accumula
f440: 74 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72  tor register for
f450: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
f460: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
f470: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73  linked list pass
f480: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
f490: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c   argument to NUL
f4a0: 4c 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a  L. And perform.*
f4b0: 2a 20 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74  * any equivalent
f4c0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
f4d0: 72 65 71 75 69 72 65 64 20 62 79 20 61 6e 79 20  required by any 
f4e0: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
f4f0: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  functions.** in 
f500: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
f510: 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e  tic int windowIn
f520: 69 74 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70  itAccum(Parse *p
f530: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
f540: 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76  MWin){.  Vdbe *v
f550: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f560: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
f570: 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e   regArg;.  int n
f580: 41 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f  Arg = 0;.  Windo
f590: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
f5a0: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
f5b0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
f5c0: 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44  tWin){.    FuncD
f5d0: 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
f5e0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c  ->pFunc;.    sql
f5f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f600: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
f610: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
f620: 20 20 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41     nArg = MAX(nA
f630: 72 67 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  rg, windowArgCou
f640: 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69  nt(pWin));.    i
f650: 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
f660: 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20  rtRowid==0 ){.  
f670: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
f680: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
f690: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
f6a0: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
f6b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
f6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f6d0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f6e0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
f6f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f700: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f710: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
f720: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
f730: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
f740: 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  f( (pFunc->funcF
f750: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
f760: 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57  NC_MINMAX) && pW
f770: 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20 20  in->csrApp ){.  
f780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
f790: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
f7a0: 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20  NBOUNDED );.    
f7b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f7c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
f7d0: 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63  tSorter, pWin->c
f7e0: 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20  srApp);.        
f7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f800: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f810: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
f820: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +1);.      }.   
f830: 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41 72 67 20   }.  }.  regArg 
f840: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
f850: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
f860: 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72 65 74 75   += nArg;.  retu
f870: 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a 0a 2f 2a  rn regArg;.}../*
f880: 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65   .** Return true
f890: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
f8a0: 66 72 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20  frame should be 
f8b0: 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 65 70  cached in the ep
f8c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2c 0a 2a  hemeral table,.*
f8d0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  * even if there 
f8e0: 61 72 65 20 6e 6f 20 78 49 6e 76 65 72 73 65 28  are no xInverse(
f8f0: 29 20 63 61 6c 6c 73 20 72 65 71 75 69 72 65 64  ) calls required
f900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f910: 77 69 6e 64 6f 77 43 61 63 68 65 46 72 61 6d 65  windowCacheFrame
f920: 28 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b  (Window *pMWin){
f930: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
f940: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65  .  if( pMWin->re
f950: 67 53 74 61 72 74 52 6f 77 69 64 20 29 20 72 65  gStartRowid ) re
f960: 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 70 57  turn 1;.  for(pW
f970: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
f980: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
f990: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
f9a0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
f9b0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
f9c0: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e  (pFunc->zName==n
f9d0: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20  th_valueName).  
f9e0: 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
f9f0: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
fa00: 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70  Name).     || (p
fa10: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61  Func->zName==lea
fa20: 64 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28  dName).     || (
fa30: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61  pFunc->zName==la
fa40: 67 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20  gName).    ){.  
fa50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fa60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
fa70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 72 65 67   0;.}../*.** reg
fa80: 4f 6c 64 20 61 6e 64 20 72 65 67 4e 65 77 20 61  Old and regNew a
fa90: 72 65 20 65 61 63 68 20 74 68 65 20 66 69 72 73  re each the firs
faa0: 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e  t register in an
fab0: 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 0a 2a   array of size.*
fac0: 2a 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  * pOrderBy->nExp
fad0: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
fae0: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
faf0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 20 74  to compare the t
fb00: 77 6f 0a 2a 2a 20 61 72 72 61 79 73 20 6f 66 20  wo.** arrays of 
fb10: 72 65 67 69 73 74 65 72 73 20 75 73 69 6e 67 20  registers using 
fb20: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
fb30: 71 75 65 6e 63 65 73 20 61 6e 64 20 6f 74 68 65  quences and othe
fb40: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  r comparison.** 
fb50: 70 61 72 61 6d 65 74 65 72 73 20 73 70 65 63 69  parameters speci
fb60: 66 69 65 64 20 62 79 20 70 4f 72 64 65 72 42 79  fied by pOrderBy
fb70: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
fb80: 74 77 6f 20 61 72 72 61 79 73 20 61 72 65 20 6e  two arrays are n
fb90: 6f 74 20 65 71 75 61 6c 2c 20 74 68 65 20 63 6f  ot equal, the co
fba0: 6e 74 65 6e 74 73 20 6f 66 20 72 65 67 4e 65 77  ntents of regNew
fbb0: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 0a 2a   is copied to .*
fbc0: 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20 63 6f 6e  * regOld and con
fbd0: 74 72 6f 6c 20 66 61 6c 6c 73 20 74 68 72 6f 75  trol falls throu
fbe0: 67 68 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  gh. Otherwise, i
fbf0: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
fc00: 66 20 74 68 65 20 61 72 72 61 79 73 0a 2a 2a 20  f the arrays.** 
fc10: 61 72 65 20 65 71 75 61 6c 2c 20 61 6e 20 4f 50  are equal, an OP
fc20: 5f 47 6f 74 6f 20 69 73 20 65 78 65 63 75 74 65  _Goto is execute
fc30: 64 2e 20 54 68 65 20 61 64 64 72 65 73 73 20 6f  d. The address o
fc40: 66 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 69 73  f the OP_Goto is
fc50: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
fc60: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
fc70: 49 66 4e 65 77 50 65 65 72 28 0a 20 20 50 61 72  IfNewPeer(.  Par
fc80: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
fc90: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
fca0: 2c 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 2c 20  ,.  int regNew, 
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcc0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
fcd0: 61 72 72 61 79 20 6f 66 20 6e 65 77 20 76 61 6c  array of new val
fce0: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ues */.  int reg
fcf0: 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Old,            
fd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fd10: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6f 6c  t in array of ol
fd20: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  d values */.  in
fd30: 74 20 61 64 64 72 20 20 20 20 20 20 20 20 20 20  t addr          
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd50: 20 4a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 29 7b   Jump here */.){
fd60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
fd70: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
fd80: 73 65 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  se);.  if( pOrde
fd90: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
fda0: 56 61 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Val = pOrderBy->
fdb0: 6e 45 78 70 72 3b 0a 20 20 20 20 4b 65 79 49 6e  nExpr;.    KeyIn
fdc0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
fdd0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
fde0: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
fdf0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30  , pOrderBy, 0, 0
fe00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fe10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
fe20: 6f 6d 70 61 72 65 2c 20 72 65 67 4f 6c 64 2c 20  ompare, regOld, 
fe30: 72 65 67 4e 65 77 2c 20 6e 56 61 6c 29 3b 0a 20  regNew, nVal);. 
fe40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
fe50: 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
fe60: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
fe70: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
fe80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fe90: 20 4f 50 5f 4a 75 6d 70 2c 20 0a 20 20 20 20 20   OP_Jump, .     
fea0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
feb0: 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 61 64  entAddr(v)+1, ad
fec0: 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  dr, sqlite3VdbeC
fed0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 0a  urrentAddr(v)+1.
fee0: 20 20 20 20 29 3b 0a 20 20 20 20 56 64 62 65 43      );.    VdbeC
fef0: 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a  overageEqNe(v);.
ff00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
ff20: 2c 20 72 65 67 4e 65 77 2c 20 72 65 67 4f 6c 64  , regNew, regOld
ff30: 2c 20 6e 56 61 6c 2d 31 29 3b 0a 20 20 7d 65 6c  , nVal-1);.  }el
ff40: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
ff50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ff60: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a  Goto, 0, addr);.
ff70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
ff80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ff90: 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
ffa0: 67 65 6e 65 72 61 74 69 6e 67 20 56 4d 20 70 72  generating VM pr
ffb0: 6f 67 72 61 6d 73 20 66 6f 72 20 52 41 4e 47 45  ograms for RANGE
ffc0: 0a 2a 2a 20 6f 66 66 73 65 74 20 50 52 45 43 45  .** offset PRECE
ffd0: 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47 20 66  DING/FOLLOWING f
ffe0: 72 61 6d 65 20 62 6f 75 6e 64 61 72 69 65 73 2e  rame boundaries.
fff0: 20 41 73 73 75 6d 69 6e 67 20 22 41 53 43 22 20   Assuming "ASC" 
10000 6f 72 64 65 72 20 66 6f 72 0a 2a 2a 20 74 68 65  order for.** the
10010 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69   ORDER BY term i
10020 6e 20 74 68 65 20 77 69 6e 64 6f 77 2c 20 61 6e  n the window, an
10030 64 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20  d that argument 
10040 6f 70 20 69 73 20 4f 50 5f 47 65 2c 20 69 74 20  op is OP_Ge, it 
10050 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f 64  generates.** cod
10060 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  e equivalent to:
10070 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 63 73 72  .**.**   if( csr
10080 31 2e 70 65 65 72 56 61 6c 20 2b 20 72 65 67 56  1.peerVal + regV
10090 61 6c 20 3e 3d 20 63 73 72 32 2e 70 65 65 72 56  al >= csr2.peerV
100a0 61 6c 20 29 20 67 6f 74 6f 20 6c 62 6c 3b 0a 2a  al ) goto lbl;.*
100b0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  *.** The value o
100c0 66 20 70 61 72 61 6d 65 74 65 72 20 6f 70 20 6d  f parameter op m
100d0 61 79 20 61 6c 73 6f 20 62 65 20 4f 50 5f 47 74  ay also be OP_Gt
100e0 20 6f 72 20 4f 50 5f 4c 65 2e 20 49 6e 20 74 68   or OP_Le. In th
100f0 65 73 65 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  ese cases the.**
10100 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74 68 65   operator in the
10110 20 61 62 6f 76 65 20 70 73 65 75 64 6f 2d 63 6f   above pseudo-co
10120 64 65 20 69 73 20 72 65 70 6c 61 63 65 64 20 77  de is replaced w
10130 69 74 68 20 22 3e 22 20 6f 72 20 22 3c 3d 22 2c  ith ">" or "<=",
10140 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
10150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 72 74  *.** If the sort
10160 2d 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 4f  -order for the O
10170 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 6e 20  RDER BY term in 
10180 74 68 65 20 77 69 6e 64 6f 77 20 69 73 20 44 45  the window is DE
10190 53 43 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  SC, then the.** 
101a0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 72 65  comparison is re
101b0 76 65 72 73 65 64 2e 20 49 6e 73 74 65 61 64 20  versed. Instead 
101c0 6f 66 20 61 64 64 69 6e 67 20 72 65 67 56 61 6c  of adding regVal
101d0 20 74 6f 20 63 73 72 31 2e 70 65 65 72 56 61 6c   to csr1.peerVal
101e0 2c 20 69 74 20 69 73 0a 2a 2a 20 73 75 62 74 72  , it is.** subtr
101f0 61 63 74 65 64 2e 20 41 6e 64 20 74 68 65 20 63  acted. And the c
10200 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
10210 6f 72 20 69 73 20 69 6e 76 65 72 74 65 64 20 74  or is inverted t
10220 6f 20 2d 20 22 3e 3d 22 20 62 65 63 6f 6d 65 73  o - ">=" becomes
10230 20 22 3c 3d 22 2c 0a 2a 2a 20 22 3e 22 20 62 65   "<=",.** ">" be
10240 63 6f 6d 65 73 20 22 3c 22 2c 20 61 6e 64 20 73  comes "<", and s
10250 6f 20 6f 6e 2e 20 53 6f 2c 20 77 69 74 68 20 44  o on. So, with D
10260 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2c 20  ESC sort order, 
10270 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
10280 6f 70 0a 2a 2a 20 69 73 20 4f 50 5f 47 65 2c 20  op.** is OP_Ge, 
10290 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f  the generated co
102a0 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
102b0 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28   to:.**.**   if(
102c0 20 63 73 72 31 2e 70 65 65 72 56 61 6c 20 2d 20   csr1.peerVal - 
102d0 72 65 67 56 61 6c 20 3c 3d 20 63 73 72 32 2e 70  regVal <= csr2.p
102e0 65 65 72 56 61 6c 20 29 20 67 6f 74 6f 20 6c 62  eerVal ) goto lb
102f0 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70 65 63 69  l;.**.** A speci
10300 61 6c 20 74 79 70 65 20 6f 66 20 61 72 69 74 68  al type of arith
10310 6d 65 74 69 63 20 69 73 20 75 73 65 64 20 73 75  metic is used su
10320 63 68 20 74 68 61 74 20 69 66 20 63 73 72 31 2e  ch that if csr1.
10330 70 65 65 72 56 61 6c 20 69 73 20 6e 6f 74 0a 2a  peerVal is not.*
10340 2a 20 61 20 6e 75 6d 65 72 69 63 20 74 79 70 65  * a numeric type
10350 20 28 72 65 61 6c 20 6f 72 20 69 6e 74 65 67 65   (real or intege
10360 72 29 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  r), then the res
10370 75 6c 74 20 6f 66 20 74 68 65 20 61 64 64 69 74  ult of the addit
10380 69 6f 6e 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20  ion addition.** 
10390 6f 72 20 73 75 62 74 72 61 63 74 69 6f 6e 20 69  or subtraction i
103a0 73 20 61 20 61 20 63 6f 70 79 20 6f 66 20 63 73  s a a copy of cs
103b0 72 31 2e 70 65 65 72 56 61 6c 2e 0a 2a 2f 0a 73  r1.peerVal..*/.s
103c0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
103d0 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a  wCodeRangeTest(.
103e0 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20    WindowCodeArg 
103f0 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 20 20  *p, .  int op,  
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 65 2c         /* OP_Ge,
10420 20 4f 50 5f 47 74 2c 20 6f 72 20 4f 50 5f 4c 65   OP_Gt, or OP_Le
10430 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c 20   */.  int csr1, 
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10460 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 73 6f  number for curso
10470 72 20 31 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  r 1 */.  int reg
10480 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Val,            
10490 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
104a0 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
104b0 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d  non-negative num
104c0 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  ber */.  int csr
104d0 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
104e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
104f0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
10500 72 73 6f 72 20 32 20 2a 2f 0a 20 20 69 6e 74 20  rsor 2 */.  int 
10510 6c 62 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  lbl             
10520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
10530 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
10540 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  if condition is 
10550 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 72  true */.){.  Par
10560 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
10570 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
10580 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10590 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 45 78  be(pParse);.  Ex
105a0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
105b0 20 3d 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72   = p->pMWin->pOr
105c0 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52  derBy;  /* ORDER
105d0 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 77   BY clause for w
105e0 69 6e 64 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72  indow */.  int r
105f0 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg1 = sqlite3Get
10600 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10610 20 20 20 20 20 2f 2a 20 52 65 67 2e 20 66 6f 72       /* Reg. for
10620 20 63 73 72 31 2e 70 65 65 72 56 61 6c 2b 72 65   csr1.peerVal+re
10630 67 56 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 65  gVal */.  int re
10640 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  g2 = sqlite3GetT
10650 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 20  empReg(pParse); 
10660 20 20 20 20 2f 2a 20 52 65 67 2e 20 66 6f 72 20      /* Reg. for 
10670 63 73 72 32 2e 70 65 65 72 56 61 6c 20 2a 2f 0a  csr2.peerVal */.
10680 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e 67 20    int regString 
10690 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
106a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
106b0 65 67 2e 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74  eg. for constant
106c0 20 76 61 6c 75 65 20 27 27 20 2a 2f 0a 20 20 69   value '' */.  i
106d0 6e 74 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64  nt arith = OP_Ad
106e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
106f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 41           /* OP_A
10700 64 64 20 6f 72 20 4f 50 5f 53 75 62 74 72 61 63  dd or OP_Subtrac
10710 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  t */.  int addrG
10720 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61   /* Jump destina
10750 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
10760 74 28 20 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20  t( op==OP_Ge || 
10770 6f 70 3d 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d  op==OP_Gt || op=
10780 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
10790 72 74 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  rt( pOrderBy && 
107a0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
107b0 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  =1 );.  if( pOrd
107c0 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46  erBy->a[0].sortF
107d0 6c 61 67 73 20 26 20 4b 45 59 49 4e 46 4f 5f 4f  lags & KEYINFO_O
107e0 52 44 45 52 5f 44 45 53 43 20 29 7b 0a 20 20 20  RDER_DESC ){.   
107f0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
10800 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65 3a       case OP_Ge:
10810 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 62 72 65   op = OP_Le; bre
10820 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
10830 50 5f 47 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c 74  P_Gt: op = OP_Lt
10840 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64  ; break;.      d
10850 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
10860 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70 20  op==OP_Le ); op 
10870 3d 20 4f 50 5f 47 65 3b 20 62 72 65 61 6b 3b 0a  = OP_Ge; break;.
10880 20 20 20 20 7d 0a 20 20 20 20 61 72 69 74 68 20      }.    arith 
10890 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 0a 20  = OP_Subtract;. 
108a0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
108b0 65 20 70 65 65 72 2d 76 61 6c 75 65 20 66 72 6f  e peer-value fro
108c0 6d 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  m each cursor in
108d0 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f  to a register */
108e0 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65  .  windowReadPee
108f0 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72 31 2c  rValues(p, csr1,
10900 20 72 65 67 31 29 3b 0a 20 20 77 69 6e 64 6f 77   reg1);.  window
10910 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
10920 2c 20 63 73 72 32 2c 20 72 65 67 32 29 3b 0a 0a  , csr2, reg2);..
10930 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
10940 65 6e 74 28 28 76 2c 20 22 43 6f 64 65 52 61 6e  ent((v, "CodeRan
10950 67 65 54 65 73 74 3a 20 69 66 28 20 52 25 64 20  geTest: if( R%d 
10960 25 73 20 52 25 64 20 25 73 20 52 25 64 20 29 20  %s R%d %s R%d ) 
10970 67 6f 74 6f 20 6c 62 6c 22 2c 0a 20 20 20 20 20  goto lbl",.     
10980 20 72 65 67 31 2c 20 28 61 72 69 74 68 3d 3d 4f   reg1, (arith==O
10990 50 5f 41 64 64 20 3f 20 22 2b 22 20 3a 20 22 2d  P_Add ? "+" : "-
109a0 22 29 2c 20 72 65 67 56 61 6c 2c 0a 20 20 20 20  "), regVal,.    
109b0 20 20 28 28 6f 70 3d 3d 4f 50 5f 47 65 29 20 3f    ((op==OP_Ge) ?
109c0 20 22 3e 3d 22 20 3a 20 28 6f 70 3d 3d 4f 50 5f   ">=" : (op==OP_
109d0 4c 65 29 20 3f 20 22 3c 3d 22 20 3a 20 28 6f 70  Le) ? "<=" : (op
109e0 3d 3d 4f 50 5f 47 74 29 20 3f 20 22 3e 22 20 3a  ==OP_Gt) ? ">" :
109f0 20 22 3c 22 29 2c 20 72 65 67 32 0a 20 20 29 29   "<"), reg2.  ))
10a00 3b 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ;..  /* Register
10a10 20 72 65 67 31 20 63 75 72 72 65 6e 74 6c 79 20   reg1 currently 
10a20 63 6f 6e 74 61 69 6e 73 20 63 73 72 31 2e 70 65  contains csr1.pe
10a30 65 72 56 61 6c 20 28 74 68 65 20 70 65 65 72 2d  erVal (the peer-
10a40 76 61 6c 75 65 20 66 72 6f 6d 20 63 73 72 31 29  value from csr1)
10a50 2e 0a 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63  ..  ** This bloc
10a60 6b 20 61 64 64 73 20 28 6f 72 20 73 75 62 74 72  k adds (or subtr
10a70 61 63 74 73 20 66 6f 72 20 44 45 53 43 29 20 74  acts for DESC) t
10a80 68 65 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65  he numeric value
10a90 20 69 6e 20 72 65 67 56 61 6c 0a 20 20 2a 2a 20   in regVal.  ** 
10aa0 66 72 6f 6d 20 69 74 2e 20 4f 72 2c 20 69 66 20  from it. Or, if 
10ab0 72 65 67 31 20 69 73 20 6e 6f 74 20 6e 75 6d 65  reg1 is not nume
10ac0 72 69 63 20 28 69 74 20 69 73 20 61 20 4e 55 4c  ric (it is a NUL
10ad0 4c 2c 20 61 20 74 65 78 74 20 76 61 6c 75 65 20  L, a text value 
10ae0 6f 72 20 61 20 62 6c 6f 62 29 2c 0a 20 20 2a 2a  or a blob),.  **
10af0 20 74 68 65 6e 20 6c 65 61 76 65 20 72 65 67 31   then leave reg1
10b00 20 61 73 20 69 74 20 69 73 2e 20 49 6e 20 70 73   as it is. In ps
10b10 65 75 64 6f 2d 63 6f 64 65 2c 20 74 68 69 73 20  eudo-code, this 
10b20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
10b30 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 69  s:.  **.  **   i
10b40 66 28 20 72 65 67 31 3e 3d 27 27 20 29 20 67 6f  f( reg1>='' ) go
10b50 74 6f 20 61 64 64 72 47 65 3b 0a 20 20 2a 2a 20  to addrGe;.  ** 
10b60 20 20 72 65 67 31 20 3d 20 72 65 67 31 20 2b 2f    reg1 = reg1 +/
10b70 2d 20 72 65 67 56 61 6c 0a 20 20 2a 2a 20 20 20  - regVal.  **   
10b80 61 64 64 72 47 65 3a 0a 20 20 2a 2a 0a 20 20 2a  addrGe:.  **.  *
10b90 2a 20 53 69 6e 63 65 20 61 6c 6c 20 73 74 72 69  * Since all stri
10ba0 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 61 72  ngs and blobs ar
10bb0 65 20 67 72 65 61 74 65 72 2d 74 68 61 6e 2d 6f  e greater-than-o
10bc0 72 2d 65 71 75 61 6c 2d 74 6f 20 61 6e 20 65 6d  r-equal-to an em
10bd0 70 74 79 20 73 74 72 69 6e 67 2c 0a 20 20 2a 2a  pty string,.  **
10be0 20 74 68 65 20 61 64 64 2f 73 75 62 74 72 61 63   the add/subtrac
10bf0 74 20 69 73 20 73 6b 69 70 70 65 64 20 66 6f 72  t is skipped for
10c00 20 74 68 65 73 65 2c 20 61 73 20 72 65 71 75 69   these, as requi
10c10 72 65 64 2e 20 49 66 20 72 65 67 31 20 69 73 20  red. If reg1 is 
10c20 61 20 4e 55 4c 4c 2c 0a 20 20 2a 2a 20 74 68 65  a NULL,.  ** the
10c30 6e 20 74 68 65 20 61 72 69 74 68 6d 65 74 69 63  n the arithmetic
10c40 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2c 20 62   is performed, b
10c50 75 74 20 73 69 6e 63 65 20 61 64 64 69 6e 67 20  ut since adding 
10c60 6f 72 20 73 75 62 74 72 61 63 74 69 6e 67 20 66  or subtracting f
10c70 72 6f 6d 0a 20 20 2a 2a 20 4e 55 4c 4c 20 69 73  rom.  ** NULL is
10c80 20 61 6c 77 61 79 73 20 4e 55 4c 4c 20 61 6e 79   always NULL any
10c90 77 61 79 2c 20 74 68 69 73 20 63 61 73 65 20 69  way, this case i
10ca0 73 20 68 61 6e 64 6c 65 64 20 61 73 20 72 65 71  s handled as req
10cb0 75 69 72 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20  uired too.  */. 
10cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10cd0 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
10ce0 2c 20 30 2c 20 72 65 67 53 74 72 69 6e 67 2c 20  , 0, regString, 
10cf0 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49 43  0, "", P4_STATIC
10d00 29 3b 0a 20 20 61 64 64 72 47 65 20 3d 20 73 71  );.  addrGe = sq
10d10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10d20 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53 74 72  v, OP_Ge, regStr
10d30 69 6e 67 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  ing, 0, reg1);. 
10d40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10d50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10d60 64 64 4f 70 33 28 76 2c 20 61 72 69 74 68 2c 20  ddOp3(v, arith, 
10d70 72 65 67 56 61 6c 2c 20 72 65 67 31 2c 20 72 65  regVal, reg1, re
10d80 67 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  g1);.  sqlite3Vd
10d90 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10da0 64 72 47 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  drGe);..  /* If 
10db0 74 68 65 20 42 49 47 4e 55 4c 4c 20 66 6c 61 67  the BIGNULL flag
10dc0 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65 20   is set for the 
10dd0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 69  ORDER BY, then i
10de0 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  t is required to
10df0 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 20   .  ** consider 
10e00 4e 55 4c 4c 20 76 61 6c 75 65 73 20 74 6f 20 62  NULL values to b
10e10 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  e larger than al
10e20 6c 20 6f 74 68 65 72 20 76 61 6c 75 65 73 2c 20  l other values, 
10e30 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 2a 2a  instead of .  **
10e40 20 74 68 65 20 75 73 75 61 6c 20 73 6d 61 6c 6c   the usual small
10e50 65 72 2e 20 54 68 65 20 56 44 42 45 20 6f 70 63  er. The VDBE opc
10e60 6f 64 65 73 20 4f 50 5f 47 65 20 61 6e 64 20 73  odes OP_Ge and s
10e70 6f 20 6f 6e 20 64 6f 20 6e 6f 74 20 68 61 6e 64  o on do not hand
10e80 6c 65 20 74 68 69 73 0a 20 20 2a 2a 20 28 61 6e  le this.  ** (an
10e90 64 20 61 64 64 69 6e 67 20 74 68 61 74 20 63 61  d adding that ca
10ea0 70 61 62 69 6c 69 74 79 20 63 61 75 73 65 73 20  pability causes 
10eb0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  a performance re
10ec0 67 72 65 73 73 69 6f 6e 29 2c 20 73 6f 0a 20 20  gression), so.  
10ed0 2a 2a 20 69 6e 73 74 65 61 64 20 69 66 20 74 68  ** instead if th
10ee0 65 20 42 49 47 4e 55 4c 4c 20 66 6c 61 67 20 69  e BIGNULL flag i
10ef0 73 20 73 65 74 20 74 68 65 6e 20 63 61 73 65 73  s set then cases
10f00 20 77 68 65 72 65 20 65 69 74 68 65 72 20 72 65   where either re
10f10 67 31 20 6f 72 0a 20 20 2a 2a 20 72 65 67 32 20  g1 or.  ** reg2 
10f20 61 72 65 20 4e 55 4c 4c 20 61 72 65 20 68 61 6e  are NULL are han
10f30 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20  dled separately 
10f40 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
10f50 20 62 6c 6f 63 6b 2e 20 54 68 65 20 63 6f 64 65   block. The code
10f60 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
10f70 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
10f80 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 69 66  :.  **.  **   if
10f90 28 20 72 65 67 31 20 49 53 20 4e 55 4c 4c 20 29  ( reg1 IS NULL )
10fa0 7b 0a 20 20 2a 2a 20 20 20 20 20 69 66 28 20 6f  {.  **     if( o
10fb0 70 3d 3d 4f 50 5f 47 65 20 29 20 67 6f 74 6f 20  p==OP_Ge ) goto 
10fc0 6c 62 6c 3b 0a 20 20 2a 2a 20 20 20 20 20 69 66  lbl;.  **     if
10fd0 28 20 6f 70 3d 3d 4f 50 5f 47 74 20 26 26 20 72  ( op==OP_Gt && r
10fe0 65 67 32 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  eg2 IS NOT NULL 
10ff0 29 20 67 6f 74 6f 20 6c 62 6c 3b 0a 20 20 2a 2a  ) goto lbl;.  **
11000 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f       if( op==OP_
11010 4c 65 20 26 26 20 72 65 67 32 20 49 53 20 4e 55  Le && reg2 IS NU
11020 4c 4c 20 29 20 67 6f 74 6f 20 6c 62 6c 3b 0a 20  LL ) goto lbl;. 
11030 20 2a 2a 20 20 20 7d 65 6c 73 65 20 69 66 28 20   **   }else if( 
11040 72 65 67 32 20 49 53 20 4e 55 4c 4c 20 29 7b 0a  reg2 IS NULL ){.
11050 20 20 2a 2a 20 20 20 20 20 69 66 28 20 6f 70 3d    **     if( op=
11060 3d 4f 50 5f 4c 65 20 29 20 67 6f 74 6f 20 6c 62  =OP_Le ) goto lb
11070 6c 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20 2a 2a  l;.  **   }.  **
11080 0a 20 20 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  .  ** Additional
11090 6c 79 2c 20 69 66 20 65 69 74 68 65 72 20 72 65  ly, if either re
110a0 67 31 20 6f 72 20 72 65 67 32 20 61 72 65 20 4e  g1 or reg2 are N
110b0 55 4c 4c 20 62 75 74 20 74 68 65 20 6a 75 6d 70  ULL but the jump
110c0 20 74 6f 20 6c 62 6c 20 69 73 20 0a 20 20 2a 2a   to lbl is .  **
110d0 20 6e 6f 74 20 74 61 6b 65 6e 2c 20 63 6f 6e 74   not taken, cont
110e0 72 6f 6c 20 6a 75 6d 70 73 20 6f 76 65 72 20 74  rol jumps over t
110f0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
11100 65 72 61 74 6f 72 20 63 6f 64 65 64 20 62 65 6c  erator coded bel
11110 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 62 6c 6f  ow this.  ** blo
11120 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ck.  */.  if( pO
11130 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
11140 74 46 6c 61 67 73 20 26 20 4b 45 59 49 4e 46 4f  tFlags & KEYINFO
11150 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 20 29  _ORDER_BIGNULL )
11160 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  {.    /* This bl
11170 6f 63 6b 20 72 75 6e 73 20 69 66 20 72 65 67 31  ock runs if reg1
11180 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
11190 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  . */.    int add
111a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
111b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
111c0 75 6c 6c 2c 20 72 65 67 31 29 3b 20 56 64 62 65  ull, reg1); Vdbe
111d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
111e0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
111f0 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65 3a       case OP_Ge:
11200 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
11210 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11220 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 29 3b  P_Goto, 0, lbl);
11230 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b   .        break;
11240 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47  .      case OP_G
11250 74 3a 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t: .        sqli
11260 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11270 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67   OP_NotNull, reg
11280 32 2c 20 6c 62 6c 29 3b 20 0a 20 20 20 20 20 20  2, lbl); .      
11290 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
112a0 29 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65 61  ); .        brea
112b0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
112c0 5f 4c 65 3a 20 0a 20 20 20 20 20 20 20 20 73 71  _Le: .        sq
112d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
112e0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
112f0 67 32 2c 20 6c 62 6c 29 3b 20 0a 20 20 20 20 20  g2, lbl); .     
11300 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
11310 76 29 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65  v); .        bre
11320 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
11330 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f  t: assert( op==O
11340 50 5f 4c 74 20 29 3b 20 2f 2a 20 6e 6f 2d 6f 70  P_Lt ); /* no-op
11350 20 2a 2f 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d   */ break;.    }
11360 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11370 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
11380 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62  o, 0, sqlite3Vdb
11390 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
113a0 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  3);..    /* This
113b0 20 62 6c 6f 63 6b 20 72 75 6e 73 20 69 66 20 72   block runs if r
113c0 65 67 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  eg1 is not NULL,
113d0 20 62 75 74 20 72 65 67 32 20 69 73 2e 20 2a 2f   but reg2 is. */
113e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
113f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11410 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11420 73 4e 75 6c 6c 2c 20 72 65 67 32 2c 20 6c 62 6c  sNull, reg2, lbl
11430 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
11440 76 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  v);.    if( op==
11450 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  OP_Gt || op==OP_
11460 47 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Ge ){.      sqli
11470 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
11480 76 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  v, -1, sqlite3Vd
11490 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
114a0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  +1);.    }.  }..
114b0 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 72 65 67    /* Compare reg
114c0 69 73 74 65 72 73 20 72 65 67 32 20 61 6e 64 20  isters reg2 and 
114d0 72 65 67 31 2c 20 74 61 6b 69 6e 67 20 74 68 65  reg1, taking the
114e0 20 6a 75 6d 70 20 69 66 20 72 65 71 75 69 72 65   jump if require
114f0 64 2e 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  d. Note that.  *
11500 2a 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20  * control skips 
11510 6f 76 65 72 20 74 68 69 73 20 74 65 73 74 20 69  over this test i
11520 66 20 74 68 65 20 42 49 47 4e 55 4c 4c 20 66 6c  f the BIGNULL fl
11530 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 65 69  ag is set and ei
11540 74 68 65 72 0a 20 20 2a 2a 20 72 65 67 31 20 6f  ther.  ** reg1 o
11550 72 20 72 65 67 32 20 63 6f 6e 74 61 69 6e 20 61  r reg2 contain a
11560 20 4e 55 4c 4c 20 76 61 6c 75 65 2e 20 20 2a 2f   NULL value.  */
11570 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11580 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 32  dOp3(v, op, reg2
11590 2c 20 6c 62 6c 2c 20 72 65 67 31 29 3b 20 56 64  , lbl, reg1); Vd
115a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
115b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
115c0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
115d0 55 4c 4c 45 51 29 3b 0a 0a 20 20 61 73 73 65 72  ULLEQ);..  asser
115e0 74 28 20 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20  t( op==OP_Ge || 
115f0 6f 70 3d 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d  op==OP_Gt || op=
11600 3d 4f 50 5f 4c 74 20 7c 7c 20 6f 70 3d 3d 4f 50  =OP_Lt || op==OP
11610 5f 4c 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73  _Le );.  testcas
11620 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
11630 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
11640 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 74 65  op==OP_Ge);.  te
11650 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
11660 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
11670 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  f(v, op==OP_Lt);
11680 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  .  testcase(op==
11690 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
116a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
116b0 5f 4c 65 29 3b 0a 20 20 74 65 73 74 63 61 73 65  _Le);.  testcase
116c0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
116d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
116e0 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 73 71 6c  p==OP_Gt);.  sql
116f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11700 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 31 29  eg(pParse, reg1)
11710 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
11720 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
11730 2c 20 72 65 67 32 29 3b 0a 0a 20 20 56 64 62 65  , reg2);..  Vdbe
11740 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
11750 2c 20 22 43 6f 64 65 52 61 6e 67 65 54 65 73 74  , "CodeRangeTest
11760 3a 20 65 6e 64 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a  : end"));.}../*.
11770 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
11780 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 57 69  on for sqlite3Wi
11790 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 20  ndowCodeStep(). 
117a0 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69  Each call to thi
117b0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 67 65  s function.** ge
117c0 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
117d0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 52 45 54  for a single RET
117e0 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50  URN_ROW, AGGSTEP
117f0 20 6f 72 20 41 47 47 49 4e 56 45 52 53 45 20 0a   or AGGINVERSE .
11800 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 52 65  ** operation. Re
11810 66 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 65  fer to the heade
11820 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 73 71  r comment for sq
11830 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
11840 74 65 70 28 29 20 66 6f 72 0a 2a 2a 20 64 65 74  tep() for.** det
11850 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
11860 69 6e 74 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  int windowCodeOp
11870 28 0a 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  (. WindowCodeArg
11880 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11890 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f      /* Context o
118a0 62 6a 65 63 74 20 2a 2f 0a 20 69 6e 74 20 6f 70  bject */. int op
118b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
118c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49             /* WI
118d0 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
118e0 20 41 47 47 53 54 45 50 20 6f 72 20 41 47 47 49   AGGSTEP or AGGI
118f0 4e 56 45 52 53 45 20 2a 2f 0a 20 69 6e 74 20 72  NVERSE */. int r
11900 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 20 20 20  egCountdown,    
11910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11920 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 49  egister for OP_I
11930 66 50 6f 73 20 63 6f 75 6e 74 64 6f 77 6e 20 2a  fPos countdown *
11940 2f 0a 20 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66  /. int jumpOnEof
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11970 20 69 66 20 73 74 65 70 70 65 64 20 63 75 72 73   if stepped curs
11980 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 20 2a  or reaches EOF *
11990 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 73 72 2c 20  /.){.  int csr, 
119a0 72 65 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  reg;.  Parse *pP
119b0 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
119c0 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ;.  Window *pMWi
119d0 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20  n = p->pMWin;.  
119e0 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 56  int ret = 0;.  V
119f0 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62  dbe *v = p->pVdb
11a00 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  e;.  int addrCon
11a10 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74  tinue = 0;.  int
11a20 20 62 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d   bPeer = (pMWin-
11a30 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 4f  >eFrmType!=TK_RO
11a40 57 53 29 3b 0a 0a 20 20 69 6e 74 20 6c 62 6c 44  WS);..  int lblD
11a50 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
11a60 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
11a70 65 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e 65  e);.  int addrNe
11a80 78 74 52 61 6e 67 65 20 3d 20 30 3b 0a 0a 20 20  xtRange = 0;..  
11a90 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
11aa0 2d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  - WINDOW_AGGINVE
11ab0 52 53 45 20 69 73 20 61 6c 77 61 79 73 20 61 20  RSE is always a 
11ac0 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 66 72 61  no-op if the fra
11ad0 6d 65 0a 20 20 2a 2a 20 73 74 61 72 74 73 20 77  me.  ** starts w
11ae0 69 74 68 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  ith UNBOUNDED PR
11af0 45 43 45 44 49 4e 47 2e 20 2a 2f 0a 20 20 69 66  ECEDING. */.  if
11b00 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47  ( op==WINDOW_AGG
11b10 49 4e 56 45 52 53 45 20 26 26 20 70 4d 57 69 6e  INVERSE && pMWin
11b20 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
11b30 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 61 73  OUNDED ){.    as
11b40 73 65 72 74 28 20 72 65 67 43 6f 75 6e 74 64 6f  sert( regCountdo
11b50 77 6e 3d 3d 30 20 26 26 20 6a 75 6d 70 4f 6e 45  wn==0 && jumpOnE
11b60 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  of==0 );.    ret
11b70 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
11b80 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3e 30  ( regCountdown>0
11b90 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69   ){.    if( pMWi
11ba0 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f  n->eFrmType==TK_
11bb0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 61  RANGE ){.      a
11bc0 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 73  ddrNextRange = s
11bd0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11be0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
11bf0 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44  assert( op==WIND
11c00 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 7c 7c  OW_AGGINVERSE ||
11c10 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 53   op==WINDOW_AGGS
11c20 54 45 50 20 29 3b 0a 20 20 20 20 20 20 69 66 28  TEP );.      if(
11c30 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49   op==WINDOW_AGGI
11c40 4e 56 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20  NVERSE ){.      
11c50 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
11c60 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
11c70 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  G ){.          w
11c80 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65  indowCodeRangeTe
11c90 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
11ca0 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d 3e 63    p, OP_Le, p->c
11cb0 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 43  urrent.csr, regC
11cc0 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73 74 61  ountdown, p->sta
11cd0 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a  rt.csr, lblDone.
11ce0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
11cf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11d00 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
11d10 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20  RangeTest(.     
11d20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47           p, OP_G
11d30 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c  e, p->start.csr,
11d40 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70   regCountdown, p
11d50 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c  ->current.csr, l
11d60 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  blDone.         
11d70 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
11d80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11d90 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e     windowCodeRan
11da0 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20 20  geTest(.        
11db0 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c 20 70 2d      p, OP_Gt, p-
11dc0 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67 43 6f 75  >end.csr, regCou
11dd0 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72 72 65  ntdown, p->curre
11de0 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a  nt.csr, lblDone.
11df0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
11e00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11e20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
11e30 73 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c  s, regCountdown,
11e40 20 6c 62 6c 44 6f 6e 65 2c 20 31 29 3b 0a 20 20   lblDone, 1);.  
11e50 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11e60 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  (v);.    }.  }..
11e70 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57    if( op==WINDOW
11e80 5f 52 45 54 55 52 4e 5f 52 4f 57 20 26 26 20 70  _RETURN_ROW && p
11e90 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
11ea0 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69  wid==0 ){.    wi
11eb0 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c 20  ndowAggFinal(p, 
11ec0 30 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 43 6f  0);.  }.  addrCo
11ed0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
11ee0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
11ef0 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
11f00 73 20 69 73 20 61 20 28 52 41 4e 47 45 20 42 45  s is a (RANGE BE
11f10 54 57 45 45 4e 20 61 20 46 4f 4c 4c 4f 57 49 4e  TWEEN a FOLLOWIN
11f20 47 20 41 4e 44 20 62 20 46 4f 4c 4c 4f 57 49 4e  G AND b FOLLOWIN
11f30 47 29 20 6f 72 0a 20 20 2a 2a 20 28 52 41 4e 47  G) or.  ** (RANG
11f40 45 20 42 45 54 57 45 45 4e 20 62 20 50 52 45 43  E BETWEEN b PREC
11f50 45 44 49 4e 47 20 41 4e 44 20 61 20 50 52 45 43  EDING AND a PREC
11f60 45 44 49 4e 47 29 20 66 72 61 6d 65 2c 20 65 6e  EDING) frame, en
11f70 73 75 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 73  sure the .  ** s
11f80 74 61 72 74 20 63 75 72 73 6f 72 20 64 6f 65 73  tart cursor does
11f90 20 6e 6f 74 20 61 64 76 61 6e 63 65 20 70 61 73   not advance pas
11fa0 74 20 74 68 65 20 65 6e 64 20 63 75 72 73 6f 72  t the end cursor
11fb0 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 2a   within the .  *
11fc0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
11fd0 65 2e 20 49 74 20 6f 74 68 65 72 77 69 73 65 20  e. It otherwise 
11fe0 6d 69 67 68 74 2c 20 69 66 20 28 61 3e 62 29 2e  might, if (a>b).
11ff0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
12000 2d 3e 65 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d  ->eStart==pMWin-
12010 3e 65 45 6e 64 20 26 26 20 72 65 67 43 6f 75 6e  >eEnd && regCoun
12020 74 64 6f 77 6e 0a 20 20 20 26 26 20 70 4d 57 69  tdown.   && pMWi
12030 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f  n->eFrmType==TK_
12040 52 41 4e 47 45 20 26 26 20 6f 70 3d 3d 57 49 4e  RANGE && op==WIN
12050 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 0a 20  DOW_AGGINVERSE. 
12060 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 52   ){.    int regR
12070 6f 77 69 64 31 20 3d 20 73 71 6c 69 74 65 33 47  owid1 = sqlite3G
12080 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12090 29 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  );.    int regRo
120a0 77 69 64 32 20 3d 20 73 71 6c 69 74 65 33 47 65  wid2 = sqlite3Ge
120b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
120c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
120d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
120e0 77 69 64 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73  wid, p->start.cs
120f0 72 2c 20 72 65 67 52 6f 77 69 64 31 29 3b 0a 20  r, regRowid1);. 
12100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12110 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
12120 2c 20 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65  , p->end.csr, re
12130 67 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 73 71  gRowid2);.    sq
12140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12150 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 52 6f 77  v, OP_Ge, regRow
12160 69 64 32 2c 20 6c 62 6c 44 6f 6e 65 2c 20 72 65  id2, lblDone, re
12170 67 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 56 64  gRowid1);.    Vd
12180 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12190 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
121a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
121b0 20 72 65 67 52 6f 77 69 64 31 29 3b 0a 20 20 20   regRowid1);.   
121c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
121d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
121e0 65 67 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 61  egRowid2);.    a
121f0 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
12200 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
12210 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
12220 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
12230 47 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  G );.  }..  swit
12240 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
12250 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  se WINDOW_RETURN
12260 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72 20  _ROW:.      csr 
12270 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  = p->current.csr
12280 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d  ;.      reg = p-
12290 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20 20  >current.reg;.  
122a0 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e      windowReturn
122b0 4f 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20 20 20  OneRow(p);.     
122c0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
122d0 65 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  e WINDOW_AGGINVE
122e0 52 53 45 3a 0a 20 20 20 20 20 20 63 73 72 20 3d  RSE:.      csr =
122f0 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a 20   p->start.csr;. 
12300 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 73 74       reg = p->st
12310 61 72 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 69  art.reg;.      i
12320 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
12330 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  rtRowid ){.     
12340 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
12350 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29 3b  ->regEndRowid );
12360 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12370 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12380 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e  _AddImm, pMWin->
12390 72 65 67 53 74 61 72 74 52 6f 77 69 64 2c 20 31  regStartRowid, 1
123a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
123b0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67          windowAg
123c0 67 53 74 65 70 28 70 2c 20 70 4d 57 69 6e 2c 20  gStep(p, pMWin, 
123d0 63 73 72 2c 20 31 2c 20 70 2d 3e 72 65 67 41 72  csr, 1, p->regAr
123e0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
123f0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
12400 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
12410 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f  ert( op==WINDOW_
12420 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20  AGGSTEP );.     
12430 20 63 73 72 20 3d 20 70 2d 3e 65 6e 64 2e 63 73   csr = p->end.cs
12440 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70  r;.      reg = p
12450 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20 20 20 20 20  ->end.reg;.     
12460 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
12470 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  tartRowid ){.   
12480 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
12490 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20  in->regEndRowid 
124a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
124b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
124c0 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e  OP_AddImm, pMWin
124d0 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 2c 20 31  ->regEndRowid, 1
124e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
124f0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67          windowAg
12500 67 53 74 65 70 28 70 2c 20 70 4d 57 69 6e 2c 20  gStep(p, pMWin, 
12510 63 73 72 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72  csr, 0, p->regAr
12520 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
12530 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
12540 69 66 28 20 6f 70 3d 3d 70 2d 3e 65 44 65 6c 65  if( op==p->eDele
12550 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
12560 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12570 50 5f 44 65 6c 65 74 65 2c 20 63 73 72 29 3b 0a  P_Delete, csr);.
12580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12590 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
125a0 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 3b  G_SAVEPOSITION);
125b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 75 6d 70  .  }..  if( jump
125c0 4f 6e 45 6f 66 20 29 7b 0a 20 20 20 20 73 71 6c  OnEof ){.    sql
125d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
125e0 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20  , OP_Next, csr, 
125f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12600 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
12610 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12620 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c  );.    ret = sql
12630 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
12640 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 65  , OP_Goto);.  }e
12650 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12660 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12670 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c 69  _Next, csr, sqli
12680 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
12690 64 72 28 76 29 2b 31 2b 62 50 65 65 72 29 3b 0a  dr(v)+1+bPeer);.
126a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
126b0 28 76 29 3b 0a 20 20 20 20 69 66 28 20 62 50 65  (v);.    if( bPe
126c0 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
126d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
126e0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c   OP_Goto, 0, lbl
126f0 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Done);.    }.  }
12700 0a 0a 20 20 69 66 28 20 62 50 65 65 72 20 29 7b  ..  if( bPeer ){
12710 0a 20 20 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  .    int nReg = 
12720 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  (pMWin->pOrderBy
12730 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   ? pMWin->pOrder
12740 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
12750 20 20 20 20 69 6e 74 20 72 65 67 54 6d 70 20 3d      int regTmp =
12760 20 28 6e 52 65 67 20 3f 20 73 71 6c 69 74 65 33   (nReg ? sqlite3
12770 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
12780 72 73 65 2c 20 6e 52 65 67 29 20 3a 20 30 29 3b  rse, nReg) : 0);
12790 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50  .    windowReadP
127a0 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
127b0 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 77  , regTmp);.    w
127c0 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28 70  indowIfNewPeer(p
127d0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f  Parse, pMWin->pO
127e0 72 64 65 72 42 79 2c 20 72 65 67 54 6d 70 2c 20  rderBy, regTmp, 
127f0 72 65 67 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  reg, addrContinu
12800 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  e);.    sqlite3R
12810 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
12820 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70 2c 20  pParse, regTmp, 
12830 6e 52 65 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  nReg);.  }..  if
12840 28 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20  ( addrNextRange 
12850 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12870 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4e 65 78 74  oto, 0, addrNext
12880 52 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Range);.  }.  sq
12890 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
128a0 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 44 6f 6e 65  Label(v, lblDone
128b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  );.  return ret;
128c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
128d0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
128e0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
128f0 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  e Window object 
12900 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
12910 0a 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65  .** third argume
12920 6e 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64  nt. Set the Wind
12930 6f 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20  ow.pOwner field 
12940 6f 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  of the new objec
12950 74 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a  t to.** pOwner..
12960 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74  */.Window *sqlit
12970 65 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69  e3WindowDup(sqli
12980 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
12990 4f 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70  Owner, Window *p
129a0 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65  ){.  Window *pNe
129b0 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 41 4c 57  w = 0;.  if( ALW
129c0 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 4e  AYS(p) ){.    pN
129d0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
129e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
129f0 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20  eof(Window));.  
12a00 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
12a10 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20      pNew->zName 
12a20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
12a30 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  p(db, p->zName);
12a40 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 42 61  .      pNew->zBa
12a50 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
12a60 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a 42 61 73  rDup(db, p->zBas
12a70 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  e);.      pNew->
12a80 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65  pFilter = sqlite
12a90 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
12aa0 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20  pFilter, 0);.   
12ab0 20 20 20 70 4e 65 77 2d 3e 70 46 75 6e 63 20 3d     pNew->pFunc =
12ac0 20 70 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20   p->pFunc;.     
12ad0 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f   pNew->pPartitio
12ae0 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  n = sqlite3ExprL
12af0 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  istDup(db, p->pP
12b00 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
12b10 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
12b20 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
12b30 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
12b40 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
12b50 20 20 20 70 4e 65 77 2d 3e 65 46 72 6d 54 79 70     pNew->eFrmTyp
12b60 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79 70 65 3b  e = p->eFrmType;
12b70 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e  .      pNew->eEn
12b80 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
12b90 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74 20     pNew->eStart 
12ba0 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20  = p->eStart;.   
12bb0 20 20 20 70 4e 65 77 2d 3e 65 45 78 63 6c 75 64     pNew->eExclud
12bc0 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64 65 3b  e = p->eExclude;
12bd0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 65 67  .      pNew->reg
12be0 52 65 73 75 6c 74 20 3d 20 70 2d 3e 72 65 67 52  Result = p->regR
12bf0 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 70 4e 65  esult;.      pNe
12c00 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69  w->pStart = sqli
12c10 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
12c20 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
12c30 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d      pNew->pEnd =
12c40 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
12c50 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b  db, p->pEnd, 0);
12c60 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77  .      pNew->pOw
12c70 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20  ner = pOwner;.  
12c80 20 20 20 20 70 4e 65 77 2d 3e 62 49 6d 70 6c 69      pNew->bImpli
12c90 63 69 74 46 72 61 6d 65 20 3d 20 70 2d 3e 62 49  citFrame = p->bI
12ca0 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20 20  mplicitFrame;.  
12cb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12cc0 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
12cd0 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
12ce0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
12cf0 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63   of Window objec
12d00 74 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ts passed as the
12d10 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  .** second argum
12d20 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a  ent..*/.Window *
12d30 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73  sqlite3WindowLis
12d40 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
12d50 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20  , Window *p){.  
12d60 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
12d70 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20 30  Window *pRet = 0
12d80 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70 20  ;.  Window **pp 
12d90 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72 28  = &pRet;..  for(
12da0 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70 57  pWin=p; pWin; pW
12db0 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
12dc0 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71  n){.    *pp = sq
12dd0 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64  lite3WindowDup(d
12de0 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20 20  b, 0, pWin);.   
12df0 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62 72   if( *pp==0 ) br
12e00 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26 28  eak;.    pp = &(
12e10 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e 29  (*pp)->pNextWin)
12e20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12e30 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
12e40 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
12e50 20 63 61 6e 20 62 65 20 64 65 74 65 72 6d 69 6e   can be determin
12e60 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
12e70 6d 65 20 74 68 61 74 20 65 78 70 72 65 73 73 69  me that expressi
12e80 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20 65 76 61  on .** pExpr eva
12e90 6c 75 61 74 65 73 20 74 6f 20 61 20 76 61 6c 75  luates to a valu
12ea0 65 20 74 68 61 74 2c 20 77 68 65 6e 20 63 61 73  e that, when cas
12eb0 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2c  t to an integer,
12ec0 20 69 73 20 67 72 65 61 74 65 72 20 0a 2a 2a 20   is greater .** 
12ed0 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61 6c 73 65  than zero. False
12ee0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
12ef0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
12f00 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66  r occurs, this f
12f10 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
12f20 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c 6c 6f 63   Parse.db.malloc
12f30 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c 61 67 20  Failed .** flag 
12f40 61 6e 64 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  and returns zero
12f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12f60 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72 6f  windowExprGtZero
12f70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12f80 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
12f90 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 73  int ret = 0;.  s
12fa0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12fb0 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  rse->db;.  sqlit
12fc0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
12fd0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   0;.  sqlite3Val
12fe0 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20 70  ueFromExpr(db, p
12ff0 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 53  Expr, db->enc, S
13000 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
13010 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20 69 66 28  C, &pVal);.  if(
13020 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65 33   pVal && sqlite3
13030 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29  _value_int(pVal)
13040 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  >0 ){.    ret = 
13050 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
13060 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
13070 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
13080 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57  ../*.** sqlite3W
13090 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73 20  hereBegin() has 
130a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
130b0 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c 45  led for the SELE
130c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
130d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
130e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77  econd argument w
130f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
13100 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74  n is invoked. It
13110 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f   generates.** co
13120 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  de to populate t
13130 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73  he Window.regRes
13140 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  ult register for
13150 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
13160 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69 6e  ction .** and in
13170 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75  voke the sub-rou
13180 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63 74  tine at instruct
13190 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f 6e  ion addrGosub on
131a0 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2e  ce for each row.
131b0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
131c0 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73 20  End() is always 
131d0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
131e0 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a 20  turning. .**.** 
131f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  This function ha
13200 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64 69  ndles several di
13210 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
13220 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20   window frames, 
13230 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72 65  which.** require
13240 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
13250 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ent processing. 
13260 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73  The following ps
13270 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a 20  eudo code is.** 
13280 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
13290 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20  t window frames 
132a0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
132b0 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
132c0 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44  N <expr1> PRECED
132d0 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
132e0 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
132f0 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72 61  Other window fra
13300 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61 72  me types use var
13310 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 6c  iants of the fol
13320 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
13330 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74    ... loop start
13340 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
13350 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a  reBegin() ....**
13360 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
13370 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
13380 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
13390 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  sh.**       }.**
133a0 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
133b0 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
133c0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 0a  able..**       .
133d0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
133e0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
133f0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
13400 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72 65    // Rewind thre
13410 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20 6f  e cursors, all o
13420 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20 74  pen on the eph t
13430 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
13440 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 3b   Rewind(csrEnd);
13450 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
13460 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a 2a  nd(csrStart);.**
13470 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
13480 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a 20  csrCurrent);.** 
13490 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20 20        .**       
134a0 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
134b0 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46  2>          // F
134c0 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73  OLLOWING express
134d0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  ion.**         r
134e0 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
134f0 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45 43  >        // PREC
13500 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  EDING expression
13510 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
13520 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 46  .**         // F
13530 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 62  irst time this b
13540 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c 20  ranch is taken, 
13550 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63 6f  the eph table co
13560 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20 20  ntains two .**  
13570 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e 20         // rows. 
13580 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e  The first row in
13590 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c 20   the partition, 
135a0 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65 20  which all three 
135b0 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20  cursors.**      
135c0 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79 20     // currently 
135d0 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74 68  point to, and th
135e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77 2e  e following row.
135f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
13600 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  TEP.**         i
13610 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
13620 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
13630 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
13640 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
13650 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
13660 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41  **             A
13670 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
13680 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
13690 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
136a0 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
136b0 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20   flush:.**      
136c0 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
136d0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
136e0 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 20           RETURN 
136f0 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ROW.**         i
13700 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69 73  f( csrCurrent is
13710 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a 2a   EOF ) break;.**
13720 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
13730 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
13740 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
13750 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72 74  Inverse(csrStart
13760 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  ).**           N
13770 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
13780 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
13790 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20      }.**.** The 
137a0 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f 76  pseudo-code abov
137b0 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c 6f  e uses the follo
137c0 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a 0a  wing shorthand:.
137d0 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50 3a  **.**   AGGSTEP:
137e0 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20 61      invoke the a
137f0 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28 29  ggregate xStep()
13800 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
13810 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
13820 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  on.**           
13830 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65 6e      with argumen
13840 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ts read from the
13850 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
13860 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20 74  cursor csrEnd, t
13870 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hen.**          
13880 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f 72       step cursor
13890 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64 20   csrEnd forward 
138a0 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73 71  one row (i.e. sq
138b0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
138c0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55 52  )..**.**   RETUR
138d0 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61 20  N_ROW: return a 
138e0 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  row to the calle
138f0 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  r based on the c
13900 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
13910 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13920 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
13930 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20 74  csrCurrent and t
13940 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
13950 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 20   of all .**     
13960 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65 67            aggreg
13970 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70 20  ates. Then step 
13980 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65 6e  cursor csrCurren
13990 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f  t forward one ro
139a0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49 4e  w..**.**   AGGIN
139b0 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74 68  VERSE: invoke th
139c0 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e 76  e aggregate xInv
139d0 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  erse() function 
139e0 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
139f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13a00 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68    functions with
13a10 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64 20   arguments read 
13a20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
13a30 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a 2a   row of cursor.*
13a40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13a50 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20 73  csrStart. Then s
13a60 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f 72  tep csrStart for
13a70 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a  ward one row..**
13a80 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77  .** There are tw
13a90 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69 6e  o other ROWS win
13aa0 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74 20  dow frames that 
13ab0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67 6e  are handled sign
13ac0 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69 66  ificantly.** dif
13ad0 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
13ae0 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57 45  e above - "BETWE
13af0 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  EN <expr> PRECED
13b00 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20 50  ING AND <expr> P
13b10 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e 64  RECEDING".** and
13b20 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e   "BETWEEN <expr>
13b30 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c   FOLLOWING AND <
13b40 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  expr> FOLLOWING"
13b50 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65 63  . These are spec
13b60 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62 65  ial .** cases be
13b70 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e 67  cause they chang
13b80 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  e the order in w
13b90 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20 63  hich the three c
13ba0 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72 74  ursors (csrStart
13bb0 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74 20  ,.** csrCurrent 
13bc0 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65 72  and csrEnd) iter
13bd0 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
13be0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
13bf0 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 75   Cases that.** u
13c00 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20  se UNBOUNDED or 
13c10 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65 20  CURRENT ROW are 
13c20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61 72  much simpler var
13c30 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20 6f  iations on one o
13c40 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65 65  f these.** three
13c50 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42  ..**.**   ROWS B
13c60 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
13c70 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
13c80 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a  pr2> PRECEDING.*
13c90 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f  *.**     ... loo
13ca0 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c  p started by sql
13cb0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
13cc0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
13cd0 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
13ce0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
13cf0 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
13d00 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e     }.**       In
13d10 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
13d20 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
13d30 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
13d40 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
13d50 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52   ){.**         R
13d60 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20  ewind(csrEnd) ; 
13d70 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
13d80 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72   ; Rewind(csrCur
13d90 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  rent).**        
13da0 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
13db0 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67  >.**         reg
13dc0 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a  Start = <expr1>.
13dd0 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  **       }else{.
13de0 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28  **         if( (
13df0 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
13e00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
13e10 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
13e20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  }.**         RET
13e30 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
13e40 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
13e50 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
13e60 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
13e70 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  E.**         }.*
13e80 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
13e90 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
13ea0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72  .**       if( (r
13eb0 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  egEnd--)<=0 ){.*
13ec0 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45  *         AGGSTE
13ed0 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  P.**       }.** 
13ee0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
13ef0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  .**.**.**   ROWS
13f00 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
13f10 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c   FOLLOWING AND <
13f20 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
13f30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
13f40 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
13f50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
13f60 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66  () ....**     if
13f70 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
13f80 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  ){.**       Gosu
13f90 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 7d  b flush.**     }
13fa0 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20 6e  .**     Insert n
13fb0 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
13fc0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69 66  table..**     if
13fd0 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
13fe0 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
13ff0 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45       Rewind(csrE
14000 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  nd) ; Rewind(csr
14010 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28  Start) ; Rewind(
14020 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20  csrCurrent).**  
14030 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
14040 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 72  xpr2>.**       r
14050 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e 64  egStart = regEnd
14060 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   - <expr1>.**   
14070 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
14080 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
14090 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
140a0 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
140b0 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
140c0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
140d0 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
140e0 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
140f0 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
14100 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
14110 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
14120 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
14130 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
14140 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
14150 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c   if( (regEnd--)<
14160 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
14170 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
14180 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
14190 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20   break;.**      
141a0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20   }.**       if( 
141b0 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
141c0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  ){.**         AG
141d0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
141e0 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62 72      if( eof ) br
141f0 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  eak.**       }.*
14200 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77  *     }.**     w
14210 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75  hile( !eof csrCu
14220 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20  rrent ){.**     
14230 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
14240 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72 20      }.**.** For 
14250 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20 74  the most part, t
14260 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f 76  he patterns abov
14270 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74 6f  e are adapted to
14280 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e 44   support UNBOUND
14290 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69 6e  ED by.** assumin
142a0 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  g that it is equ
142b0 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66 69  ivalent to "infi
142c0 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f 46  nity PRECEDING/F
142d0 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a 2a  OLLOWING" and.**
142e0 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79 20   CURRENT ROW by 
142f0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 74  assuming that it
14300 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20 74   is equivilent t
14310 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f 46  o "0 PRECEDING/F
14320 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54 68  OLLOWING"..** Th
14330 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  is is optimized 
14340 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61 6e  of course - bran
14350 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ches that will n
14360 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61 6e  ever be taken an
14370 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
14380 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20  that are always 
14390 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65 64  true are omitted
143a0 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f 64   from the VM cod
143b0 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20 65  e. The only.** e
143c0 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20  xceptional case 
143d0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  is:.**.**   ROWS
143e0 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
143f0 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 55   FOLLOWING AND U
14400 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
14410 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  NG.**.**     ...
14420 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79   loop started by
14430 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
14440 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  in() ....**     
14450 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
14460 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f  n ){.**       Go
14470 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
14480 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74   }.**     Insert
14490 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
144a0 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
144b0 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66  if( first row of
144c0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
144d0 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73         Rewind(cs
144e0 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63  rEnd) ; Rewind(c
144f0 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e  srStart) ; Rewin
14500 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a  d(csrCurrent).**
14510 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
14520 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
14530 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
14540 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
14550 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c  }.**   }.**   fl
14560 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47 53  ush:.**     AGGS
14570 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65  TEP.**     while
14580 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
14590 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
145a0 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
145b0 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
145c0 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
145d0 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20  ) break.**      
145e0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55   }.**       RETU
145f0 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a  RN_ROW.**     }.
14600 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21 65  **     while( !e
14610 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29 7b  of csrCurrent ){
14620 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e  .**       RETURN
14630 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  _ROW.**     }.**
14640 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72 69  .** Also requiri
14650 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  ng special handl
14660 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73 65  ing are the case
14670 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  s:.**.**   ROWS 
14680 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
14690 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
146a0 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
146b0 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
146c0 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57  N <expr1> FOLLOW
146d0 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
146e0 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
146f0 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65 78  when (expr1 < ex
14700 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64 65  pr2). This is de
14710 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69 6d  tected at runtim
14720 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20 66  e, not by this f
14730 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20 68  unction..** To h
14740 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2c  andle this case,
14750 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65   the pseudo-code
14760 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63 74   programs depict
14770 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f 64  ed above are mod
14780 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74 6c  ified.** slightl
14790 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  y to be:.**.**  
147a0 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
147b0 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
147c0 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
147d0 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61  *     if( new pa
147e0 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
147f0 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
14800 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
14810 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
14820 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
14830 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20  *     if( first 
14840 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
14850 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65 77   ){.**       Rew
14860 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65  ind(csrEnd) ; Re
14870 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b  wind(csrStart) ;
14880 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65   Rewind(csrCurre
14890 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65 67  nt).**       reg
148a0 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a  End = <expr2>.**
148b0 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
148c0 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
148d0 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c 20     if( regEnd < 
148e0 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20 20  regStart ){.**  
148f0 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
14900 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 6c  W.**         del
14910 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63 6f  ete eph table co
14920 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 20  ntents.**       
14930 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20 20    continue.**   
14940 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e 2e      }.**     ...
14950 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 22  .**.** The new "
14960 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65 6d  continue" statem
14970 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ent in the above
14980 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e 65   jumps to the ne
14990 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a 20  xt iteration.** 
149a0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
149b0 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61 72  p - the one star
149c0 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
149d0 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a 2a  ereBegin()..**.*
149e0 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47 52  * The various GR
149f0 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20 69  OUPS cases are i
14a00 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
14a10 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65 72   the same patter
14a20 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20 54  ns as.** ROWS. T
14a30 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d 6f  he VM code is mo
14a40 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79 20  dified slightly 
14a50 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  so that:.**.**  
14a60 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72 61   1. The else bra
14a70 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  nch in the main 
14a80 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61 6b  loop is only tak
14a90 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a 75  en if the row ju
14aa0 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65 64  st.**      added
14ab0 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
14ac0 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 73  l table is the s
14ad0 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67 72  tart of a new gr
14ae0 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20 20  oup. In.**      
14af0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
14b00 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  becomes:.**.**  
14b10 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20         ... loop 
14b20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74  started by sqlit
14b30 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e  e3WhereBegin() .
14b40 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  ...**         if
14b50 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
14b60 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
14b70 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
14b80 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
14b90 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72      Insert new r
14ba0 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c  ow into eph tabl
14bb0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e..**         if
14bc0 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
14bd0 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
14be0 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
14bf0 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64  csrEnd) ; Rewind
14c00 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77  (csrStart) ; Rew
14c10 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a  ind(csrCurrent).
14c20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67  **           reg
14c30 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a  End = <expr2>.**
14c40 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53 74             regSt
14c50 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a  art = <expr1>.**
14c60 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
14c70 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b 0a  f( new group ){.
14c80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  **           ...
14c90 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a   .**         }.*
14ca0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  *       }.**.** 
14cb0 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66 20    2. Instead of 
14cc0 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69 6e  processing a sin
14cd0 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52 45  gle row, each RE
14ce0 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45  TURN_ROW, AGGSTE
14cf0 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41 47  P or .**      AG
14d00 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70 72  GINVERSE step pr
14d10 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72 72  ocesses the curr
14d20 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ent row of the r
14d30 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20 61  elevant cursor a
14d40 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20 73  nd.**      all s
14d50 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20 62  ubsequent rows b
14d60 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
14d70 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a 2a  same group..**.*
14d80 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20 66  * RANGE window f
14d90 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74 74  rames are a litt
14da0 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67 61  le different aga
14db0 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55 50  in. As for GROUP
14dc0 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  S, the .** main 
14dd0 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 70  loop runs once p
14de0 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20 41  er group only. A
14df0 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41  nd RETURN_ROW, A
14e00 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49 4e  GGSTEP and AGGIN
14e10 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69 6e  VERSE.** deal in
14e20 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64 20   groups instead 
14e30 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72 20  of rows. As for 
14e40 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53 2c  ROWS and GROUPS,
14e50 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
14e60 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73 3a  .** basic cases:
14e70 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
14e80 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
14e90 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
14ea0 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  pr2> FOLLOWING.*
14eb0 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f  *.**     ... loo
14ec0 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c  p started by sql
14ed0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
14ee0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
14ef0 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
14f00 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
14f10 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
14f20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e     }.**       In
14f30 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
14f40 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
14f50 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
14f60 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
14f70 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52   ){.**         R
14f80 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20  ewind(csrEnd) ; 
14f90 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
14fa0 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72   ; Rewind(csrCur
14fb0 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  rent).**        
14fc0 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
14fd0 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67  >.**         reg
14fe0 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a  Start = <expr1>.
14ff0 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  **       }else{.
15000 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
15010 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68  EP.**         wh
15020 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74  ile( (csrCurrent
15030 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c  .key + regEnd) <
15040 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a   csrEnd.key ){.*
15050 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54 55  *           RETU
15060 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN_ROW.**       
15070 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
15080 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
15090 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
150a0 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
150b0 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
150c0 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
150d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
150e0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
150f0 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a  }.**     flush:.
15100 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45 50  **       AGGSTEP
15110 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
15120 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20   1 ){.**        
15130 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20 20   RETURN ROW.**  
15140 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43 75         if( csrCu
15150 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20 62  rrent is EOF ) b
15160 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 20  reak;.**        
15170 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74 61     while( csrSta
15180 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72  rt.key + regStar
15190 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e  t) < csrCurrent.
151a0 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
151b0 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45        AGGINVERSE
151c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  .**           }.
151d0 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
151e0 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 6e        }.**.** In
151f0 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61 74   the above notat
15200 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20 6d  ion, "csr.key" m
15210 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  eans the current
15220 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52   value of the OR
15230 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72 65  DER BY .** expre
15240 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73 20  ssion (there is 
15250 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72 20  only ever 1 for 
15260 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73 65  a RANGE that use
15270 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  s an <expr> FOLL
15280 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78 70  OWING.** or <exp
15290 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65 61  r PRECEDING) rea
152a0 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63 73  d from cursor cs
152b0 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45  r..**.**   RANGE
152c0 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
152d0 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
152e0 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
152f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
15300 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
15310 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
15320 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20  () ....**       
15330 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
15340 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
15350 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
15360 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
15370 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
15380 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
15390 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73  *       if( firs
153a0 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69  t row of partiti
153b0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
153c0 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20   Rewind(csrEnd) 
153d0 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72  ; Rewind(csrStar
153e0 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43  t) ; Rewind(csrC
153f0 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20  urrent).**      
15400 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
15410 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  r2>.**         r
15420 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
15430 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  >.**       }else
15440 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69  {.**         whi
15450 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20  le( (csrEnd.key 
15460 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72  + regEnd) <= csr
15470 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
15480 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 53  *           AGGS
15490 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  TEP.**         }
154a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c  .**         whil
154b0 65 28 20 28 63 73 72 53 74 61 72 74 2e 6b 65 79  e( (csrStart.key
154c0 20 2b 20 72 65 67 53 74 61 72 74 29 20 3c 20 63   + regStart) < c
154d0 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b  srCurrent.key ){
154e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
154f0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
15500 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
15510 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
15520 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
15530 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
15540 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
15550 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45  srEnd.key + regE
15560 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e  nd) <= csrCurren
15570 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
15580 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
15590 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
155a0 77 68 69 6c 65 28 20 28 63 73 72 53 74 61 72 74  while( (csrStart
155b0 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29  .key + regStart)
155c0 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65   < csrCurrent.ke
155d0 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  y ){.**         
155e0 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20  AGGINVERSE.**   
155f0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52      }.**       R
15600 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a 20  ETURN_ROW.**.** 
15610 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
15620 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr1> FOLLOWIN
15630 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f  G AND <expr2> FO
15640 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
15650 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74    ... loop start
15660 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
15670 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a  reBegin() ....**
15680 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
15690 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
156a0 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
156b0 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  sh.**       }.**
156c0 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
156d0 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
156e0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69  able..**       i
156f0 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
15700 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
15710 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63          Rewind(c
15720 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
15730 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
15740 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
15750 2a 20 20 20 20 20 20 20 20 20 72 65 67 45 6e 64  *         regEnd
15760 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20   = <expr2>.**   
15770 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20 3d        regStart =
15780 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20   <expr1>.**     
15790 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
157a0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
157b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
157c0 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20  srCurrent.key + 
157d0 72 65 67 45 6e 64 29 20 3c 20 63 73 72 45 6e 64  regEnd) < csrEnd
157e0 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
157f0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
15800 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65  Current.key + re
15810 67 53 74 61 72 74 29 20 3e 20 63 73 72 53 74 61  gStart) > csrSta
15820 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  rt.key ){.**    
15830 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
15840 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  RSE.**          
15850 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   }.**           
15860 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
15870 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
15880 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20   }.**     }.**  
15890 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20     flush:.**    
158a0 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
158b0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
158c0 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  **         while
158d0 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
158e0 79 20 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20  y + regStart) > 
158f0 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a  csrStart.key ){.
15900 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
15910 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20  INVERSE.**      
15920 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
15930 72 65 61 6b 20 22 77 68 69 6c 65 28 20 31 20 29  reak "while( 1 )
15940 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20 20 20  " loop..**      
15950 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
15960 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
15970 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77      }.**       w
15980 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75  hile( !eof csrCu
15990 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20  rrent ){.**     
159a0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
159b0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  *       }.**.** 
159c0 54 68 65 20 74 65 78 74 20 61 62 6f 76 65 20 6c  The text above l
159d0 65 61 76 65 73 20 6f 75 74 20 6d 61 6e 79 20 64  eaves out many d
159e0 65 74 61 69 6c 73 2e 20 52 65 66 65 72 20 74 6f  etails. Refer to
159f0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 63 6f   the code and co
15a00 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f 77 20  mments.** below 
15a10 66 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  for a more compl
15a20 65 74 65 20 70 69 63 74 75 72 65 2e 0a 2a 2f 0a  ete picture..*/.
15a30 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
15a40 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20 50 61  owCodeStep(.  Pa
15a50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a70 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
15a80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15aa0 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74 65 6e      /* Rewritten
15ab0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15ac0 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
15ad0 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20   *pWInfo,       
15ae0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
15af0 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  t returned by sq
15b00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
15b10 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f  ) */.  int regGo
15b20 73 75 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  sub,            
15b30 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
15b40 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20  er for OP_Gosub 
15b50 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  */.  int addrGos
15b60 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ub              
15b70 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75 62       /* OP_Gosub
15b80 20 68 65 72 65 20 74 6f 20 72 65 74 75 72 6e 20   here to return 
15b90 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20  each row */.){. 
15ba0 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
15bb0 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78 70 72   p->pWin;.  Expr
15bc0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
15bd0 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
15be0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
15bf0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15c00 72 73 65 29 3b 0a 20 20 69 6e 74 20 63 73 72 57  rse);.  int csrW
15c10 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
15c20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
15c30 72 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  r used to write 
15c40 74 6f 20 65 70 68 2e 20 74 61 62 6c 65 20 2a 2f  to eph. table */
15c50 0a 20 20 69 6e 74 20 63 73 72 49 6e 70 75 74 20  .  int csrInput 
15c60 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
15c70 69 43 75 72 73 6f 72 3b 20 20 20 20 20 2f 2a 20  iCursor;     /* 
15c80 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d 73 65  Cursor of sub-se
15c90 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  lect */.  int nI
15ca0 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nput = p->pSrc->
15cb0 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b  a[0].pTab->nCol;
15cc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15cd0 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64 20 62   cols returned b
15ce0 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  y sub */.  int i
15cf0 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
15d20 74 65 20 74 68 72 6f 75 67 68 20 73 75 62 20 63  te through sub c
15d30 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ols */.  int add
15d40 72 4e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rNe;            
15d50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
15d60 65 73 73 20 6f 66 20 4f 50 5f 4e 65 20 2a 2f 0a  ess of OP_Ne */.
15d70 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 46    int addrGosubF
15d80 6c 75 73 68 20 3d 20 30 3b 20 20 20 20 20 20 20  lush = 0;       
15d90 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
15da0 4f 50 5f 47 6f 73 75 62 20 74 6f 20 66 6c 75 73  OP_Gosub to flus
15db0 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  h: */.  int addr
15dc0 49 6e 74 65 67 65 72 20 3d 20 30 3b 20 20 20 20  Integer = 0;    
15dd0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
15de0 73 73 20 6f 66 20 4f 50 5f 49 6e 74 65 67 65 72  ss of OP_Integer
15df0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6d   */.  int addrEm
15e00 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
15e10 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15e20 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 69 6e   of OP_Rewind in
15e30 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74   flush: */.  int
15e40 20 72 65 67 4e 65 77 3b 20 20 20 20 20 20 20 20   regNew;        
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e60 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
15e70 72 73 20 68 6f 6c 64 69 6e 67 20 6e 65 77 20 69  rs holding new i
15e80 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  nput row */.  in
15e90 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15eb0 20 72 65 67 4e 65 77 20 61 72 72 61 79 20 69 6e   regNew array in
15ec0 20 72 65 63 6f 72 64 20 66 6f 72 6d 20 2a 2f 0a   record form */.
15ed0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20    int regRowid; 
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
15f00 65 67 52 65 63 6f 72 64 20 69 6e 20 65 70 68 20  egRecord in eph 
15f10 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
15f20 65 67 4e 65 77 50 65 65 72 20 3d 20 30 3b 20 20  egNewPeer = 0;  
15f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65             /* Pe
15f40 65 72 20 76 61 6c 75 65 73 20 66 6f 72 20 6e 65  er values for ne
15f50 77 20 72 6f 77 20 28 70 61 72 74 20 6f 66 20 72  w row (part of r
15f60 65 67 4e 65 77 29 20 2a 2f 0a 20 20 69 6e 74 20  egNew) */.  int 
15f70 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20  regPeer = 0;    
15f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15f90 65 65 72 20 76 61 6c 75 65 73 20 66 6f 72 20 63  eer values for c
15fa0 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20  urrent row */.  
15fb0 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
15fc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15fd0 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
15fe0 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72  "Gosub flush_par
15ff0 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 57 69 6e  tition" */.  Win
16000 64 6f 77 43 6f 64 65 41 72 67 20 73 3b 20 20 20  dowCodeArg s;   
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16020 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
16030 6f 72 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20  or sub-routines 
16040 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 57 68 65 72  */.  int lblWher
16050 65 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  eEnd;           
16060 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 6a 75       /* Label ju
16070 73 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  st before sqlite
16080 33 57 68 65 72 65 45 6e 64 28 29 20 63 6f 64 65  3WhereEnd() code
16090 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61   */.  int regSta
160a0 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rt = 0;         
160b0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
160c0 66 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  f <expr> PRECEDI
160d0 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  NG */.  int regE
160e0 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nd = 0;         
160f0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
16100 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f   of <expr> FOLLO
16110 57 49 4e 47 20 2a 2f 0a 0a 20 20 61 73 73 65 72  WING */..  asser
16120 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
16130 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c  ==TK_PRECEDING |
16140 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
16150 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
16160 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
16170 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
16180 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
16190 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
161a0 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
161b0 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
161c0 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70  K_FOLLOWING || p
161d0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
161e0 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c  URRENT .       |
161f0 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  | pMWin->eEnd==T
16200 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 70  K_UNBOUNDED || p
16210 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
16220 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 20  RECEDING .  );. 
16230 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
16240 65 45 78 63 6c 75 64 65 3d 3d 30 20 7c 7c 20 70  eExclude==0 || p
16250 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d  MWin->eExclude==
16260 54 4b 5f 43 55 52 52 45 4e 54 0a 20 20 20 20 20  TK_CURRENT.     
16270 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63    || pMWin->eExc
16280 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f 55 50 20 7c  lude==TK_GROUP |
16290 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64  | pMWin->eExclud
162a0 65 3d 3d 54 4b 5f 54 49 45 53 0a 20 20 20 20 20  e==TK_TIES.     
162b0 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63    || pMWin->eExc
162c0 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a 20 20 29 3b  lude==TK_NO.  );
162d0 0a 0a 20 20 6c 62 6c 57 68 65 72 65 45 6e 64 20  ..  lblWhereEnd 
162e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
162f0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
16300 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
16310 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  e context object
16320 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c   */.  memset(&s,
16330 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f   0, sizeof(Windo
16340 77 43 6f 64 65 41 72 67 29 29 3b 0a 20 20 73 2e  wCodeArg));.  s.
16350 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
16360 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70 4d 57  .  s.pMWin = pMW
16370 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20 3d 20  in;.  s.pVdbe = 
16380 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75 62 20  v;.  s.regGosub 
16390 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 73 2e  = regGosub;.  s.
163a0 61 64 64 72 47 6f 73 75 62 20 3d 20 61 64 64 72  addrGosub = addr
163b0 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72 72 65  Gosub;.  s.curre
163c0 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e 2d 3e  nt.csr = pMWin->
163d0 69 45 70 68 43 73 72 3b 0a 20 20 63 73 72 57 72  iEphCsr;.  csrWr
163e0 69 74 65 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e  ite = s.current.
163f0 63 73 72 2b 31 3b 0a 20 20 73 2e 73 74 61 72 74  csr+1;.  s.start
16400 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74  .csr = s.current
16410 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65 6e 64 2e  .csr+2;.  s.end.
16420 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e  csr = s.current.
16430 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a 20 46 69 67  csr+3;..  /* Fig
16440 75 72 65 20 6f 75 74 20 77 68 65 6e 20 72 6f 77  ure out when row
16450 73 20 6d 61 79 20 62 65 20 64 65 6c 65 74 65 64  s may be deleted
16460 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65   from the epheme
16470 72 61 6c 20 74 61 62 6c 65 2e 20 54 68 65 72 65  ral table. There
16480 0a 20 20 2a 2a 20 61 72 65 20 66 6f 75 72 20 6f  .  ** are four o
16490 70 74 69 6f 6e 73 20 2d 20 74 68 65 79 20 6d 61  ptions - they ma
164a0 79 20 6e 65 76 65 72 20 62 65 20 64 65 6c 65 74  y never be delet
164b0 65 64 20 28 65 44 65 6c 65 74 65 3d 3d 30 29 2c  ed (eDelete==0),
164c0 20 74 68 65 79 20 6d 61 79 20 0a 20 20 2a 2a 20   they may .  ** 
164d0 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
164e0 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65 20 6e  on as they are n
164f0 6f 20 6c 6f 6e 67 65 72 20 70 61 72 74 20 6f 66  o longer part of
16500 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
16510 65 0a 20 20 2a 2a 20 28 65 44 65 6c 65 74 65 3d  e.  ** (eDelete=
16520 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52  =WINDOW_AGGINVER
16530 53 45 29 2c 20 74 68 65 79 20 6d 61 79 20 62 65  SE), they may be
16540 20 64 65 6c 65 74 65 64 20 61 73 20 61 66 74 65   deleted as afte
16550 72 20 74 68 65 20 72 6f 77 20 0a 20 20 2a 2a 20  r the row .  ** 
16560 68 61 73 20 62 65 65 6e 20 72 65 74 75 72 6e 65  has been returne
16570 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
16580 28 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52  (WINDOW_RETURN_R
16590 4f 57 29 2c 20 6f 72 20 74 68 65 79 20 6d 61 79  OW), or they may
165a0 0a 20 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  .  ** be deleted
165b0 20 61 66 74 65 72 20 74 68 65 79 20 65 6e 74 65   after they ente
165c0 72 20 74 68 65 20 66 72 61 6d 65 20 28 57 49 4e  r the frame (WIN
165d0 44 4f 57 5f 41 47 47 53 54 45 50 29 2e 20 2a 2f  DOW_AGGSTEP). */
165e0 0a 20 20 73 77 69 74 63 68 28 20 70 4d 57 69 6e  .  switch( pMWin
165f0 2d 3e 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ->eStart ){.    
16600 63 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  case TK_FOLLOWIN
16610 47 3a 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  G:.      if( pMW
16620 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b  in->eFrmType!=TK
16630 5f 52 41 4e 47 45 0a 20 20 20 20 20 20 20 26 26  _RANGE.       &&
16640 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72   windowExprGtZer
16650 6f 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  o(pParse, pMWin-
16660 3e 70 53 74 61 72 74 29 0a 20 20 20 20 20 20 29  >pStart).      )
16670 7b 0a 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c  {.        s.eDel
16680 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54  ete = WINDOW_RET
16690 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d  URN_ROW;.      }
166a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
166b0 20 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55 4e    case TK_UNBOUN
166c0 44 45 44 3a 0a 20 20 20 20 20 20 69 66 28 20 77  DED:.      if( w
166d0 69 6e 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28  indowCacheFrame(
166e0 70 4d 57 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  pMWin)==0 ){.   
166f0 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
16700 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
16710 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NG ){.          
16720 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54  if( pMWin->eFrmT
16730 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20  ype!=TK_RANGE.  
16740 20 20 20 20 20 20 20 20 20 26 26 20 77 69 6e 64           && wind
16750 6f 77 45 78 70 72 47 74 5a 65 72 6f 28 70 50 61  owExprGtZero(pPa
16760 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  rse, pMWin->pEnd
16770 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
16780 20 20 20 20 20 20 20 20 20 20 20 73 2e 65 44 65             s.eDe
16790 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47  lete = WINDOW_AG
167a0 47 53 54 45 50 3b 0a 20 20 20 20 20 20 20 20 20  GSTEP;.         
167b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
167c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 2e 65 44  {.          s.eD
167d0 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52  elete = WINDOW_R
167e0 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20  ETURN_ROW;.     
167f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
16810 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 2e 65  fault:.      s.e
16820 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f  Delete = WINDOW_
16830 41 47 47 49 4e 56 45 52 53 45 3b 0a 20 20 20 20  AGGINVERSE;.    
16840 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
16850 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69  /* Allocate regi
16860 73 74 65 72 73 20 66 6f 72 20 74 68 65 20 61 72  sters for the ar
16870 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 66 72  ray of values fr
16880 6f 6d 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  om the sub-query
16890 2c 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 76 65  , the.  ** samve
168a0 20 76 61 6c 75 65 73 20 69 6e 20 72 65 63 6f 72   values in recor
168b0 64 20 66 6f 72 6d 2c 20 61 6e 64 20 74 68 65 20  d form, and the 
168c0 72 6f 77 69 64 20 75 73 65 64 20 74 6f 20 69 6e  rowid used to in
168d0 73 65 72 74 20 73 61 69 64 20 72 65 63 6f 72 64  sert said record
168e0 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 65  .  ** into the e
168f0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
16900 20 2a 2f 0a 20 20 72 65 67 4e 65 77 20 3d 20 70   */.  regNew = p
16910 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
16920 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
16930 20 6e 49 6e 70 75 74 3b 0a 20 20 72 65 67 52 65   nInput;.  regRe
16940 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  cord = ++pParse-
16950 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 52 6f 77 69  >nMem;.  regRowi
16960 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
16970 65 6d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  em;..  /* If the
16980 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 63 6f   window frame co
16990 6e 74 61 69 6e 73 20 61 6e 20 22 3c 65 78 70 72  ntains an "<expr
169a0 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f 72 20  > PRECEDING" or 
169b0 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e  "<expr> FOLLOWIN
169c0 47 22 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20  G".  ** clause, 
169d0 61 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65  allocate registe
169e0 72 73 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  rs to store the 
169f0 72 65 73 75 6c 74 73 20 6f 66 20 65 76 61 6c 75  results of evalu
16a00 61 74 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20  ating each.  ** 
16a10 3c 65 78 70 72 3e 2e 20 20 2a 2f 0a 20 20 69 66  <expr>.  */.  if
16a20 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
16a30 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
16a40 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
16a50 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
16a60 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b      regStart = +
16a70 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16a80 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
16a90 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
16aa0 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e  NG || pMWin->eEn
16ab0 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
16ac0 29 7b 0a 20 20 20 20 72 65 67 45 6e 64 20 3d 20  ){.    regEnd = 
16ad0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
16ae0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
16af0 73 20 69 73 20 6e 6f 74 20 61 20 22 52 4f 57 53  s is not a "ROWS
16b00 20 42 45 54 57 45 45 4e 20 2e 2e 2e 22 20 66 72   BETWEEN ..." fr
16b10 61 6d 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  ame, then alloca
16b20 74 65 20 61 72 72 61 79 73 20 6f 66 0a 20 20 2a  te arrays of.  *
16b30 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73  * registers to s
16b40 74 6f 72 65 20 63 6f 70 69 65 73 20 6f 66 20 74  tore copies of t
16b50 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  he ORDER BY expr
16b60 65 73 73 69 6f 6e 73 20 28 70 65 65 72 20 76 61  essions (peer va
16b70 6c 75 65 73 29 20 0a 20 20 2a 2a 20 66 6f 72 20  lues) .  ** for 
16b80 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 2c 20 61  the main loop, a
16b90 6e 64 20 66 6f 72 20 65 61 63 68 20 63 75 72 73  nd for each curs
16ba0 6f 72 20 28 73 74 61 72 74 2c 20 63 75 72 72 65  or (start, curre
16bb0 6e 74 20 61 6e 64 20 65 6e 64 29 2e 20 2a 2f 0a  nt and end). */.
16bc0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72    if( pMWin->eFr
16bd0 6d 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53 20 29  mType!=TK_ROWS )
16be0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20  {.    int nPeer 
16bf0 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  = (pOrderBy ? pO
16c00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
16c10 30 29 3b 0a 20 20 20 20 72 65 67 4e 65 77 50 65  0);.    regNewPe
16c20 65 72 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d  er = regNew + pM
16c30 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b  Win->nBufferCol;
16c40 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
16c50 70 50 61 72 74 69 74 69 6f 6e 20 29 20 72 65 67  pPartition ) reg
16c60 4e 65 77 50 65 65 72 20 2b 3d 20 70 4d 57 69 6e  NewPeer += pMWin
16c70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45  ->pPartition->nE
16c80 78 70 72 3b 0a 20 20 20 20 72 65 67 50 65 65 72  xpr;.    regPeer
16c90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
16ca0 31 3b 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;       pParse-
16cb0 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
16cc0 20 20 20 20 73 2e 73 74 61 72 74 2e 72 65 67 20      s.start.reg 
16cd0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
16ce0 3b 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;   pParse->nMem
16cf0 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73   += nPeer;.    s
16d00 2e 63 75 72 72 65 6e 74 2e 72 65 67 20 3d 20 70  .current.reg = p
16d10 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 70  Parse->nMem+1; p
16d20 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
16d30 50 65 65 72 3b 0a 20 20 20 20 73 2e 65 6e 64 2e  Peer;.    s.end.
16d40 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  reg = pParse->nM
16d50 65 6d 2b 31 3b 20 20 20 20 20 70 50 61 72 73 65  em+1;     pParse
16d60 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
16d70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  .  }..  /* Load 
16d80 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
16d90 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 72 65  s for the row re
16da0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 75  turned by the su
16db0 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69 6e  b-select.  ** in
16dc0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  to an array of r
16dd0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
16de0 67 20 61 74 20 72 65 67 4e 65 77 2e 20 41 73 73  g at regNew. Ass
16df0 65 6d 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a  emble them into.
16e00 20 20 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 6e    ** a record in
16e10 20 72 65 67 69 73 74 65 72 20 72 65 67 52 65 63   register regRec
16e20 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 49  ord. */.  for(iI
16e30 6e 70 75 74 3d 30 3b 20 69 49 6e 70 75 74 3c 6e  nput=0; iInput<n
16e40 49 6e 70 75 74 3b 20 69 49 6e 70 75 74 2b 2b 29  Input; iInput++)
16e50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16e60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
16e70 6c 75 6d 6e 2c 20 63 73 72 49 6e 70 75 74 2c 20  lumn, csrInput, 
16e80 69 49 6e 70 75 74 2c 20 72 65 67 4e 65 77 2b 69  iInput, regNew+i
16e90 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71  Input);.  }.  sq
16ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16eb0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16ec0 2c 20 72 65 67 4e 65 77 2c 20 6e 49 6e 70 75 74  , regNew, nInput
16ed0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20  , regRecord);.. 
16ee0 20 2f 2a 20 41 6e 20 69 6e 70 75 74 20 72 6f 77   /* An input row
16ef0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
16f00 65 61 64 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  ead into an arra
16f10 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  y of registers s
16f20 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
16f30 72 65 67 4e 65 77 2e 20 49 66 20 74 68 65 20 77  regNew. If the w
16f40 69 6e 64 6f 77 20 68 61 73 20 61 20 50 41 52 54  indow has a PART
16f50 49 54 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74 68  ITION clause, th
16f60 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74  is block generat
16f70 65 73 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64 65  es .  ** VM code
16f80 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
16f90 20 69 6e 70 75 74 20 72 6f 77 20 69 73 20 74 68   input row is th
16fa0 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
16fb0 20 70 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a 2a   partition..  **
16fc0 20 49 66 20 73 6f 2c 20 69 74 20 64 6f 65 73 20   If so, it does 
16fd0 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 61  an OP_Gosub to a
16fe0 6e 20 61 64 64 72 65 73 73 20 74 6f 20 62 65 20  n address to be 
16ff0 66 69 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72 2e  filled in later.
17000 20 54 68 65 0a 20 20 2a 2a 20 61 64 64 72 65 73   The.  ** addres
17010 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73 75  s of the OP_Gosu
17020 62 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6c  b is stored in l
17030 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 61 64  ocal variable ad
17040 64 72 47 6f 73 75 62 46 6c 75 73 68 2e 20 2a 2f  drGosubFlush. */
17050 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50  .  if( pMWin->pP
17060 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
17070 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78  int addr;.    Ex
17080 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
17090 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
170a0 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74  n;.    int nPart
170b0 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b   = pPart->nExpr;
170c0 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50  .    int regNewP
170d0 61 72 74 20 3d 20 72 65 67 4e 65 77 20 2b 20 70  art = regNew + p
170e0 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
170f0 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
17100 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
17110 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
17120 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
17130 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rt, 0, 0);..    
17140 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b  regFlushPart = +
17150 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17160 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
17170 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17180 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
17190 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
171a0 67 50 61 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20  gPart, nPart);. 
171b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
171c0 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
171d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
171e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
171f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17200 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
17210 2c 20 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32  , addr+4, addr+2
17220 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
17230 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20  ageEqNe(v);.    
17240 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68 20 3d  addrGosubFlush =
17250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17260 70 31 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p1(v, OP_Gosub, 
17270 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
17280 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17290 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70  v, "call flush_p
172a0 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20  artition"));.   
172b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
172c0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
172d0 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e  egNewPart, pMWin
172e0 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74  ->regPart, nPart
172f0 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  -1);.  }..  /* I
17300 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f  nsert the new ro
17310 77 20 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d  w into the ephem
17320 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  eral table */.  
17330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17340 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
17350 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52  , csrWrite, regR
17360 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
17370 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17380 5f 49 6e 73 65 72 74 2c 20 63 73 72 57 72 69 74  _Insert, csrWrit
17390 65 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65  e, regRecord, re
173a0 67 52 6f 77 69 64 29 3b 0a 20 20 61 64 64 72 4e  gRowid);.  addrN
173b0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
173c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp3(v, OP_Ne, 
173d0 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65 2c 20 30  pMWin->regOne, 0
173e0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56  , regRowid);.  V
173f0 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
17400 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  Null(v);..  /* T
17410 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e  his block is run
17420 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
17430 6f 77 20 6f 66 20 65 61 63 68 20 70 61 72 74 69  ow of each parti
17440 74 69 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41  tion */.  s.regA
17450 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
17460 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
17470 69 6e 29 3b 0a 0a 20 20 69 66 28 20 72 65 67 53  in);..  if( regS
17480 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  tart ){.    sqli
17490 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
174a0 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  se, pMWin->pStar
174b0 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20  t, regStart);.  
174c0 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c    windowCheckVal
174d0 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74  ue(pParse, regSt
174e0 61 72 74 2c 20 30 20 2b 20 28 70 4d 57 69 6e 2d  art, 0 + (pMWin-
174f0 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
17500 4e 47 45 3f 33 3a 30 29 29 3b 0a 20 20 7d 0a 20  NGE?3:0));.  }. 
17510 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
17520 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17530 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  de(pParse, pMWin
17540 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  ->pEnd, regEnd);
17550 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
17560 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
17570 67 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e  gEnd, 1 + (pMWin
17580 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52  ->eFrmType==TK_R
17590 41 4e 47 45 3f 33 3a 30 29 29 3b 0a 20 20 7d 0a  ANGE?3:0));.  }.
175a0 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46  .  if( pMWin->eF
175b0 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45  rmType!=TK_RANGE
175c0 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   && pMWin->eStar
175d0 74 3d 3d 70 4d 57 69 6e 2d 3e 65 45 6e 64 20 26  t==pMWin->eEnd &
175e0 26 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20 20  & regStart ){.  
175f0 20 20 69 6e 74 20 6f 70 20 3d 20 28 28 70 4d 57    int op = ((pMW
17600 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
17610 4f 4c 4c 4f 57 49 4e 47 29 20 3f 20 4f 50 5f 47  OLLOWING) ? OP_G
17620 65 20 3a 20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  e : OP_Le);.    
17630 69 6e 74 20 61 64 64 72 47 65 20 3d 20 73 71 6c  int addrGe = sql
17640 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17650 2c 20 6f 70 2c 20 72 65 67 53 74 61 72 74 2c 20  , op, regStart, 
17660 30 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  0, regEnd);.    
17670 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
17680 72 4e 75 6c 6c 49 66 28 76 2c 20 6f 70 3d 3d 4f  rNullIf(v, op==O
17690 50 5f 47 65 29 3b 20 2f 2a 20 4e 65 76 65 72 4e  P_Ge); /* NeverN
176a0 75 6c 6c 20 62 65 63 61 75 73 65 20 62 6f 75 6e  ull because boun
176b0 64 20 3c 65 78 70 72 3e 20 2a 2f 0a 20 20 20 20  d <expr> */.    
176c0 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
176d0 72 4e 75 6c 6c 49 66 28 76 2c 20 6f 70 3d 3d 4f  rNullIf(v, op==O
176e0 50 5f 4c 65 29 3b 20 2f 2a 20 20 20 76 61 6c 75  P_Le); /*   valu
176f0 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 68  es previously ch
17700 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 77 69 6e  ecked */.    win
17710 64 6f 77 41 67 67 46 69 6e 61 6c 28 26 73 2c 20  dowAggFinal(&s, 
17720 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
17730 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17740 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e  Rewind, s.curren
17750 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20 20 56  t.csr, 1);.    V
17760 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
17770 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 77 69  Taken(v);.    wi
17780 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
17790 28 26 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (&s);.    sqlite
177a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
177b0 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 73  P_ResetSorter, s
177c0 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20  .current.csr);. 
177d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
177e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
177f0 20 30 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29   0, lblWhereEnd)
17800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17810 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17820 72 47 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rGe);.  }.  if( 
17830 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
17840 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 70  K_FOLLOWING && p
17850 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d  MWin->eFrmType!=
17860 54 4b 5f 52 41 4e 47 45 20 26 26 20 72 65 67 45  TK_RANGE && regE
17870 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nd ){.    assert
17880 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
17890 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20  K_FOLLOWING );. 
178a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
178b0 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
178c0 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72  act, regStart, r
178d0 65 67 45 6e 64 2c 20 72 65 67 53 74 61 72 74 29  egEnd, regStart)
178e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
178f0 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
17900 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
17910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17920 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
17930 73 2e 73 74 61 72 74 2e 63 73 72 2c 20 31 29 3b  s.start.csr, 1);
17940 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
17950 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a  eNeverTaken(v);.
17960 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
17970 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
17980 77 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e  wind, s.current.
17990 63 73 72 2c 20 31 29 3b 0a 20 20 56 64 62 65 43  csr, 1);.  VdbeC
179a0 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
179b0 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  n(v);.  sqlite3V
179c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
179d0 52 65 77 69 6e 64 2c 20 73 2e 65 6e 64 2e 63 73  Rewind, s.end.cs
179e0 72 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  r, 1);.  VdbeCov
179f0 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28  erageNeverTaken(
17a00 76 29 3b 0a 20 20 69 66 28 20 72 65 67 50 65 65  v);.  if( regPee
17a10 72 20 26 26 20 70 4f 72 64 65 72 42 79 20 29 7b  r && pOrderBy ){
17a20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17a30 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
17a40 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72  y, regNewPeer, r
17a50 65 67 50 65 65 72 2c 20 70 4f 72 64 65 72 42 79  egPeer, pOrderBy
17a60 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
17a70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17a80 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
17a90 67 50 65 65 72 2c 20 73 2e 73 74 61 72 74 2e 72  gPeer, s.start.r
17aa0 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  eg, pOrderBy->nE
17ab0 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  xpr-1);.    sqli
17ac0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17ad0 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65   OP_Copy, regPee
17ae0 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 72 65 67  r, s.current.reg
17af0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
17b00 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r-1);.    sqlite
17b10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17b20 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c  P_Copy, regPeer,
17b30 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70 4f 72 64   s.end.reg, pOrd
17b40 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  erBy->nExpr-1);.
17b50 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64    }..  sqlite3Vd
17b60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
17b70 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68 65 72 65  oto, 0, lblWhere
17b80 45 6e 64 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  End);..  sqlite3
17b90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
17ba0 61 64 64 72 4e 65 29 3b 0a 0a 20 20 2f 2a 20 42  addrNe);..  /* B
17bb0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
17bc0 62 6c 6f 63 6b 20 65 78 65 63 75 74 65 64 20 66  block executed f
17bd0 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  or the second an
17be0 64 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77  d subsequent row
17bf0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50  s. */.  if( regP
17c00 65 65 72 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  eer ){.    windo
17c10 77 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73  wIfNewPeer(pPars
17c20 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67  e, pOrderBy, reg
17c30 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
17c40 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a  , lblWhereEnd);.
17c50 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
17c60 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
17c70 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e  OWING ){.    win
17c80 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
17c90 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c  NDOW_AGGSTEP, 0,
17ca0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57   0);.    if( pMW
17cb0 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42  in->eEnd!=TK_UNB
17cc0 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
17cd0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54  if( pMWin->eFrmT
17ce0 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b  ype==TK_RANGE ){
17cf0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  .        int lbl
17d00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17d10 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
17d20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
17d30 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
17d40 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17d50 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
17d60 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 26  wCodeRangeTest(&
17d70 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72  s, OP_Ge, s.curr
17d80 65 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c  ent.csr, regEnd,
17d90 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29   s.end.csr, lbl)
17da0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
17db0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
17dc0 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
17dd0 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
17de0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
17df0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
17e00 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20  RN_ROW, 0, 0);. 
17e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17e20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
17e30 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4e 65 78 74  oto, 0, addrNext
17e40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17e50 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17e60 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
17e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17e80 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
17e90 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
17ea0 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b  ROW, regEnd, 0);
17eb0 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
17ec0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
17ed0 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
17ee0 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Start, 0);.     
17ef0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
17f00 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
17f10 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
17f20 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 52 50 53   ){.    int bRPS
17f30 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72   = (pMWin->eStar
17f40 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
17f50 26 26 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79  && pMWin->eFrmTy
17f60 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 3b 0a 20  pe==TK_RANGE);. 
17f70 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
17f80 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
17f90 45 50 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a  EP, regEnd, 0);.
17fa0 20 20 20 20 69 66 28 20 62 52 50 53 20 29 20 77      if( bRPS ) w
17fb0 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
17fc0 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
17fd0 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
17fe0 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
17ff0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
18000 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a  URN_ROW, 0, 0);.
18010 20 20 20 20 69 66 28 20 21 62 52 50 53 20 29 20      if( !bRPS ) 
18020 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
18030 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
18040 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  SE, regStart, 0)
18050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
18060 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
18070 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
18080 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
18090 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
180a0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b   pMWin->eEnd!=TK
180b0 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
180c0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
180d0 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  FrmType==TK_RANG
180e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
180f0 20 6c 62 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20   lbl = 0;.      
18100 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
18110 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18120 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  v);.        if( 
18130 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  regEnd ){.      
18140 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65      lbl = sqlite
18150 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
18160 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
18170 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67    windowCodeRang
18180 65 54 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c  eTest(&s, OP_Ge,
18190 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20   s.current.csr, 
181a0 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73  regEnd, s.end.cs
181b0 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20  r, lbl);.       
181c0 20 7d 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f   }.        windo
181d0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
181e0 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
181f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69  , 0);.        wi
18200 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
18210 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
18220 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
18230 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45          if( regE
18240 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
18250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18260 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
18270 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20   addr);.        
18280 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18290 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
182a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
182b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
182c0 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a    if( regEnd ){.
182d0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
182e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
182f0 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
18300 72 65 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20  regEnd, 0, 1);. 
18310 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
18320 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18330 20 20 7d 0a 20 20 20 20 20 20 20 20 77 69 6e 64    }.        wind
18340 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
18350 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
18360 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77  0, 0);.        w
18370 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
18380 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
18390 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
183a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67  .        if( reg
183b0 45 6e 64 20 29 20 73 71 6c 69 74 65 33 56 64 62  End ) sqlite3Vdb
183c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
183d0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
183e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20  }.  }..  /* End 
183f0 6f 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 70 75  of the main inpu
18400 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69  t loop */.  sqli
18410 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18420 62 65 6c 28 76 2c 20 6c 62 6c 57 68 65 72 65 45  bel(v, lblWhereE
18430 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  nd);.  sqlite3Wh
18440 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
18450 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
18460 67 68 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  gh */.  if( pMWi
18470 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b  n->pPartition ){
18480 0a 20 20 20 20 61 64 64 72 49 6e 74 65 67 65 72  .    addrInteger
18490 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
184a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
184b0 65 72 2c 20 30 2c 20 72 65 67 46 6c 75 73 68 50  er, 0, regFlushP
184c0 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
184d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
184e0 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68 29   addrGosubFlush)
184f0 3b 0a 20 20 7d 0a 0a 20 20 61 64 64 72 45 6d 70  ;.  }..  addrEmp
18500 74 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ty = sqlite3Vdbe
18510 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
18520 69 6e 64 2c 20 63 73 72 57 72 69 74 65 29 3b 0a  ind, csrWrite);.
18530 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18540 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
18550 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
18560 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 52  NG ){.    int bR
18570 50 53 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 53 74  PS = (pMWin->eSt
18580 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
18590 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65 46 72 6d  G && pMWin->eFrm
185a0 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 3b  Type==TK_RANGE);
185b0 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
185c0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
185d0 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20 30 29  STEP, regEnd, 0)
185e0 3b 0a 20 20 20 20 69 66 28 20 62 52 50 53 20 29  ;.    if( bRPS )
185f0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
18600 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
18610 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30  RSE, regStart, 0
18620 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  );.    windowCod
18630 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
18640 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29  ETURN_ROW, 0, 0)
18650 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d  ;.  }else if( pM
18660 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
18670 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
18680 20 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a   int addrStart;.
18690 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61      int addrBrea
186a0 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  k1;.    int addr
186b0 42 72 65 61 6b 32 3b 0a 20 20 20 20 69 6e 74 20  Break2;.    int 
186c0 61 64 64 72 42 72 65 61 6b 33 3b 0a 20 20 20 20  addrBreak3;.    
186d0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
186e0 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
186f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
18700 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d  pMWin->eFrmType=
18710 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
18720 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
18730 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18740 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
18750 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e  addrBreak2 = win
18760 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
18770 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
18780 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
18790 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
187a0 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
187b0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
187c0 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
187d0 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70   }else.    if( p
187e0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
187f0 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
18800 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71    addrStart = sq
18810 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
18820 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61  Addr(v);.      a
18830 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64  ddrBreak1 = wind
18840 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
18850 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
18860 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20  regStart, 1);.  
18870 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d      addrBreak2 =
18880 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
18890 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
188a0 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  RSE, 0, 1);.    
188b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
188c0 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
188d0 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
188e0 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72  ;.      addrStar
188f0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
18900 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
18910 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
18920 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
18930 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
18940 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31 29  _ROW, regEnd, 1)
18950 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
18960 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k2 = windowCodeO
18970 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
18980 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
18990 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 1);.    }.   
189a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
189b0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
189c0 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
189d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
189e0 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
189f0 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53 74  ak2);.    addrSt
18a00 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
18a10 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
18a20 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 33 20  .    addrBreak3 
18a30 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
18a40 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
18a50 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
18a60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a70 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18a80 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
18a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18aa0 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
18ab0 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ak1);.    sqlite
18ac0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18ad0 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20 20   addrBreak3);.  
18ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61  }else{.    int a
18af0 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69 6e  ddrBreak;.    in
18b00 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20  t addrStart;.   
18b10 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
18b20 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
18b30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64 64  , 0, 0);.    add
18b40 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  rStart = sqlite3
18b50 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18b60 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61  v);.    addrBrea
18b70 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  k = windowCodeOp
18b80 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
18b90 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
18ba0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
18bb0 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
18bc0 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
18bd0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
18be0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18bf0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74  _Goto, 0, addrSt
18c00 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
18c10 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18c20 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d   addrBreak);.  }
18c30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
18c40 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45 6d  mpHere(v, addrEm
18c50 70 74 79 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pty);..  sqlite3
18c60 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18c70 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e  _ResetSorter, s.
18c80 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20  current.csr);.  
18c90 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
18ca0 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  ition ){.    if(
18cb0 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
18cc0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73  Rowid ){.      s
18cd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18ce0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18cf0 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
18d00 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  rtRowid);.      
18d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18d20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
18d30 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e   0, pMWin->regEn
18d40 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  dRowid);.    }. 
18d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
18d60 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 49 6e  angeP1(v, addrIn
18d70 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 56 64  teger, sqlite3Vd
18d80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18d90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18da0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
18db0 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
18dc0 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e  art);.  }.}..#en
18dd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
18de0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
18df0 0a                                               .