/ Hex Artifact Content
Login

Artifact 9a860432916ffa4d5266f1e60d4d88bac11fb7ee5ee20c2ae9c7d4e5dd68fd58:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d  nArg==0 );.  p =
2870: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
2880: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
2890: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
28a0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
28b0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
28c0: 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d  p->nTotal++;.  }
28d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
28e0: 65 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46 75  ercent_rankInvFu
28f0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2900: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2910: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2920: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2930: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2940: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2950: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2960: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2970: 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28  rg==0 );.  p = (
2980: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2990: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
29a0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
29b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
29c0: 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73   p->nStep++;.}.s
29d0: 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65  tatic void perce
29e0: 6e 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63  nt_rankValueFunc
29f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2a00: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
2a10: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2a20: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2a30: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2a40: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2a50: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2a60: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2a70: 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d  .    p->nValue =
2a80: 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 69   p->nStep;.    i
2a90: 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29  f( p->nTotal>1 )
2aa0: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
2ab0: 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 6e 56   = (double)p->nV
2ac0: 61 6c 75 65 20 2f 20 28 64 6f 75 62 6c 65 29 28  alue / (double)(
2ad0: 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20 20  p->nTotal-1);.  
2ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2af0: 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20  lt_double(pCtx, 
2b00: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2b10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2b20: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
2b30: 20 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   0.0);.    }.  }
2b40: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 65 72 63 65  .}.#define perce
2b50: 6e 74 5f 72 61 6e 6b 46 69 6e 61 6c 69 7a 65 46  nt_rankFinalizeF
2b60: 75 6e 63 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  unc percent_rank
2b70: 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a  ValueFunc../*.**
2b80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2b90: 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  of built-in wind
2ba0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d 65  ow function cume
2bb0: 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65 73  _dist(). Assumes
2bc0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69 6e   that.** the win
2bd0: 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62 65  dow frame has be
2be0: 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a  en set to:.**.**
2bf0: 20 20 20 47 52 4f 55 50 53 20 42 45 54 57 45 45     GROUPS BETWEE
2c00: 4e 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  N 1 FOLLOWING AN
2c10: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
2c20: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
2c30: 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53 74  void cume_distSt
2c40: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
2c50: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2c60: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2c70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2c80: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2c90: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2ca0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2cb0: 45 52 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74  ER(nArg); assert
2cc0: 28 20 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70  ( nArg==0 );.  p
2cd0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2ce0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
2cf0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2d00: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
2d10: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
2d20: 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20    p->nTotal++;. 
2d30: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
2d40: 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75 6e   cume_distInvFun
2d50: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2d60: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
2d70: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2d80: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2d90: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
2da0: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e 55  lCount *p;.  UNU
2db0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
2dc0: 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41 72  rg); assert( nAr
2dd0: 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28 73  g==0 );.  p = (s
2de0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2df0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2e00: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2e10: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2e20: 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74  p->nStep++;.}.st
2e30: 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64  atic void cume_d
2e40: 69 73 74 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  istValueFunc(sql
2e50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2e60: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2e70: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2e80: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
2e90: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
2ea0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2eb0: 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  Ctx, 0);.  if( p
2ec0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
2ed0: 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e   = (double)(p->n
2ee0: 53 74 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29  Step) / (double)
2ef0: 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  (p->nTotal);.   
2f00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f10: 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b  double(pCtx, r);
2f20: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 63  .  }.}.#define c
2f30: 75 6d 65 5f 64 69 73 74 46 69 6e 61 6c 69 7a 65  ume_distFinalize
2f40: 46 75 6e 63 20 63 75 6d 65 5f 64 69 73 74 56 61  Func cume_distVa
2f50: 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43  lueFunc../*.** C
2f60: 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f  ontext object fo
2f70: 72 20 6e 74 69 6c 65 28 29 20 77 69 6e 64 6f 77  r ntile() window
2f80: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2f90: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a  ruct NtileCtx {.
2fa0: 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20    i64 nTotal;   
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20    /* Total rows 
2fd0: 69 6e 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  in partition */.
2fe0: 20 20 69 36 34 20 6e 50 61 72 61 6d 3b 20 20 20    i64 nParam;   
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 70    /* Parameter p
3010: 61 73 73 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e  assed to ntile(N
3020: 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b  ) */.  i64 iRow;
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
3050: 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  t row */.};../*.
3060: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3070: 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e 20 54 68  n of ntile(). Th
3080: 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  is assumes that 
3090: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
30a0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65   has.** been coe
30b0: 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  rced to:.**.**  
30c0: 20 52 4f 57 53 20 43 55 52 52 45 4e 54 20 52 4f   ROWS CURRENT RO
30d0: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
30e0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61  FOLLOWING.*/.sta
30f0: 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 53 74  tic void ntileSt
3100: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
3110: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3120: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3130: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3140: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
3150: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
3160: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
3170: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
3180: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20  ETER(nArg);.  p 
3190: 3d 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65 43  = (struct NtileC
31a0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
31b0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
31c0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
31d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
31e0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
31f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61   ){.      p->nPa
3200: 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ram = sqlite3_va
3210: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
3220: 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0]);.      if( p
3230: 2d 3e 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20  ->nParam<=0 ){. 
3240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
3250: 65 73 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20  esult_error(.   
3260: 20 20 20 20 20 20 20 20 20 70 43 74 78 2c 20 22           pCtx, "
3270: 61 72 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c  argument of ntil
3280: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69  e must be a posi
3290: 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d  tive integer", -
32a0: 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  1.        );.   
32b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
32c0: 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a  ->nTotal++;.  }.
32d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  }.static void nt
32e0: 69 6c 65 49 6e 76 46 75 6e 63 28 0a 20 20 73 71  ileInvFunc(.  sq
32f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
3300: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
3310: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3320: 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73  e **apArg.){.  s
3330: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a  truct NtileCtx *
3340: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  p;.  assert( nAr
3350: 67 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50  g==1 ); UNUSED_P
3360: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a  ARAMETER(nArg);.
3370: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e 74    p = (struct Nt
3380: 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
3390: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
33a0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
33b0: 70 29 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 2b 2b  p));.  p->iRow++
33c0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
33d0: 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e 63 28 73  ntileValueFunc(s
33e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
33f0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
3400: 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 70  NtileCtx *p;.  p
3410: 20 3d 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65   = (struct Ntile
3420: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
3430: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
3440: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
3450: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
3460: 6e 50 61 72 61 6d 3e 30 20 29 7b 0a 20 20 20 20  nParam>0 ){.    
3470: 69 6e 74 20 6e 53 69 7a 65 20 3d 20 28 70 2d 3e  int nSize = (p->
3480: 6e 54 6f 74 61 6c 20 2f 20 70 2d 3e 6e 50 61 72  nTotal / p->nPar
3490: 61 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  am);.    if( nSi
34a0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ze==0 ){.      s
34b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
34c0: 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 69 52 6f  t64(pCtx, p->iRo
34d0: 77 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  w+1);.    }else{
34e0: 0a 20 20 20 20 20 20 69 36 34 20 6e 4c 61 72 67  .      i64 nLarg
34f0: 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c 20 2d 20  e = p->nTotal - 
3500: 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69 7a 65 3b  p->nParam*nSize;
3510: 0a 20 20 20 20 20 20 69 36 34 20 69 53 6d 61 6c  .      i64 iSmal
3520: 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e 53 69 7a  l = nLarge*(nSiz
3530: 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 36 34 20  e+1);.      i64 
3540: 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f 77 3b 0a  iRow = p->iRow;.
3550: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3560: 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65 2b 31 29  nLarge*(nSize+1)
3570: 20 2b 20 28 70 2d 3e 6e 50 61 72 61 6d 2d 6e 4c   + (p->nParam-nL
3580: 61 72 67 65 29 2a 6e 53 69 7a 65 29 3d 3d 70 2d  arge)*nSize)==p-
3590: 3e 6e 54 6f 74 61 6c 20 29 3b 0a 0a 20 20 20 20  >nTotal );..    
35a0: 20 20 69 66 28 20 69 52 6f 77 3c 69 53 6d 61 6c    if( iRow<iSmal
35b0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
35c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
35d0: 34 28 70 43 74 78 2c 20 31 20 2b 20 69 52 6f 77  4(pCtx, 1 + iRow
35e0: 2f 28 6e 53 69 7a 65 2b 31 29 29 3b 0a 20 20 20  /(nSize+1));.   
35f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3600: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3610: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
3620: 20 6e 4c 61 72 67 65 20 2b 20 28 69 52 6f 77 2d   nLarge + (iRow-
3630: 69 53 6d 61 6c 6c 29 2f 6e 53 69 7a 65 29 3b 0a  iSmall)/nSize);.
3640: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3650: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 6e 74 69 6c  }.}.#define ntil
3660: 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 20 6e 74  eFinalizeFunc nt
3670: 69 6c 65 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a  ileValueFunc../*
3680: 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
3690: 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c 75  ct for last_valu
36a0: 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  e() window funct
36b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c  ion..*/.struct L
36c0: 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20 20  astValueCtx {.  
36d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
36e0: 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b  Val;.  int nVal;
36f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .};../*.** Imple
3700: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61 73  mentation of las
3710: 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73 74  t_value()..*/.st
3720: 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76  atic void last_v
3730: 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20  alueStepFunc(.  
3740: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3750: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
3760: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
3770: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
3780: 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75   struct LastValu
3790: 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53 45  eCtx *p;.  UNUSE
37a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
37b0: 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  );.  p = (struct
37c0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
37d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
37e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
37f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
3800: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
3810: 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d  e3_value_free(p-
3820: 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70  >pVal);.    p->p
3830: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
3840: 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d  lue_dup(apArg[0]
3850: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 56  );.    if( p->pV
3860: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
3870: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
3880: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
3890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38a0: 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20 20    p->nVal++;.   
38b0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
38c0: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
38d0: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
38e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
38f0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3900: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3910: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
3920: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
3930: 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  p;.  UNUSED_PARA
3940: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
3950: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3960: 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  apArg);.  p = (s
3970: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3980: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
3990: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
39a0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
39b0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
39c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 2d   ){.    p->nVal-
39d0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 56  -;.    if( p->nV
39e0: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
39f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65  qlite3_value_fre
3a00: 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20  e(p->pVal);.    
3a10: 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20    p->pVal = 0;. 
3a20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
3a30: 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75  c void last_valu
3a40: 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  eValueFunc(sqlit
3a50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3a60: 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74  ){.  struct Last
3a70: 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70  ValueCtx *p;.  p
3a80: 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74 56   = (struct LastV
3a90: 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33  alueCtx*)sqlite3
3aa0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3ab0: 78 74 28 70 43 74 78 2c 20 30 29 3b 0a 20 20 69  xt(pCtx, 0);.  i
3ac0: 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 20  f( p && p->pVal 
3ad0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
3ae0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78  esult_value(pCtx
3af0: 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d 0a  , p->pVal);.  }.
3b00: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3b10: 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65  st_valueFinalize
3b20: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
3b30: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
3b40: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3b50: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
3b60: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
3b70: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
3b80: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
3b90: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
3ba0: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
3bb0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
3bc0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
3bd0: 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20  Ctx, p->pVal);. 
3be0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
3bf0: 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a  _free(p->pVal);.
3c00: 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b      p->pVal = 0;
3c10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
3c20: 61 74 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 74  atic names for t
3c30: 68 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  he built-in wind
3c40: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ow function name
3c50: 73 2e 20 20 54 68 65 73 65 20 73 74 61 74 69 63  s.  These static
3c60: 0a 2a 2a 20 6e 61 6d 65 73 20 61 72 65 20 75 73  .** names are us
3c70: 65 64 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  ed, rather than 
3c80: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2c  string literals,
3c90: 20 73 6f 20 74 68 61 74 20 46 75 6e 63 44 65 66   so that FuncDef
3ca0: 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 63 61 6e 20   objects.** can 
3cb0: 62 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  be associated wi
3cc0: 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  th a particular 
3cd0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
3ce0: 62 79 20 64 69 72 65 63 74 0a 2a 2a 20 63 6f 6d  by direct.** com
3cf0: 70 61 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 7a  parison of the z
3d00: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 45  Name pointer.  E
3d10: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
3d20: 20 20 20 20 69 66 28 20 70 46 75 6e 63 44 65 66      if( pFuncDef
3d30: 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f 76 61 6c  ->zName==row_val
3d40: 75 65 4e 61 6d 65 20 29 7b 20 2e 2e 2e 20 7d 0a  ueName ){ ... }.
3d50: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3d60: 63 68 61 72 20 72 6f 77 5f 6e 75 6d 62 65 72 4e  char row_numberN
3d70: 61 6d 65 5b 5d 20 3d 20 20 20 22 72 6f 77 5f 6e  ame[] =   "row_n
3d80: 75 6d 62 65 72 22 3b 0a 73 74 61 74 69 63 20 63  umber";.static c
3d90: 6f 6e 73 74 20 63 68 61 72 20 64 65 6e 73 65 5f  onst char dense_
3da0: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 22  rankName[] =   "
3db0: 64 65 6e 73 65 5f 72 61 6e 6b 22 3b 0a 73 74 61  dense_rank";.sta
3dc0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
3dd0: 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  ankName[] =     
3de0: 20 20 20 20 22 72 61 6e 6b 22 3b 0a 73 74 61 74      "rank";.stat
3df0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 70 65  ic const char pe
3e00: 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 5b 5d  rcent_rankName[]
3e10: 20 3d 20 22 70 65 72 63 65 6e 74 5f 72 61 6e 6b   = "percent_rank
3e20: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e30: 63 68 61 72 20 63 75 6d 65 5f 64 69 73 74 4e 61  char cume_distNa
3e40: 6d 65 5b 5d 20 3d 20 20 20 20 22 63 75 6d 65 5f  me[] =    "cume_
3e50: 64 69 73 74 22 3b 0a 73 74 61 74 69 63 20 63 6f  dist";.static co
3e60: 6e 73 74 20 63 68 61 72 20 6e 74 69 6c 65 4e 61  nst char ntileNa
3e70: 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 22 6e  me[] =        "n
3e80: 74 69 6c 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  tile";.static co
3e90: 6e 73 74 20 63 68 61 72 20 6c 61 73 74 5f 76 61  nst char last_va
3ea0: 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 6c  lueName[] =   "l
3eb0: 61 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74  ast_value";.stat
3ec0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74  ic const char nt
3ed0: 68 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  h_valueName[] = 
3ee0: 20 20 20 22 6e 74 68 5f 76 61 6c 75 65 22 3b 0a     "nth_value";.
3ef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3f00: 72 20 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  r first_valueNam
3f10: 65 5b 5d 20 3d 20 20 22 66 69 72 73 74 5f 76 61  e[] =  "first_va
3f20: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3f30: 73 74 20 63 68 61 72 20 6c 65 61 64 4e 61 6d 65  st char leadName
3f40: 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 6c 65  [] =         "le
3f50: 61 64 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  ad";.static cons
3f60: 74 20 63 68 61 72 20 6c 61 67 4e 61 6d 65 5b 5d  t char lagName[]
3f70: 20 3d 20 20 20 20 20 20 20 20 20 20 22 6c 61 67   =          "lag
3f80: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  ";../*.** No-op 
3f90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
3fa0: 6f 66 20 78 53 74 65 70 28 29 20 61 6e 64 20 78  of xStep() and x
3fb0: 46 69 6e 61 6c 69 7a 65 28 29 2e 20 20 55 73 65  Finalize().  Use
3fc0: 64 20 61 73 20 70 6c 61 63 65 2d 68 6f 6c 64 65  d as place-holde
3fd0: 72 73 0a 2a 2a 20 66 6f 72 20 62 75 69 6c 74 2d  rs.** for built-
3fe0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3ff0: 6f 6e 73 20 74 68 61 74 20 6e 65 76 65 72 20 63  ons that never c
4000: 61 6c 6c 20 74 68 6f 73 65 20 69 6e 74 65 72 66  all those interf
4010: 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  aces..**.** The 
4020: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28 29 20  noopValueFunc() 
4030: 69 73 20 63 61 6c 6c 65 64 20 62 75 74 20 69 73  is called but is
4040: 20 65 78 70 65 63 74 65 64 20 74 6f 20 64 6f 20   expected to do 
4050: 6e 6f 74 68 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  nothing.  The.**
4060: 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 29 20   noopStepFunc() 
4070: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2c  is never called,
4080: 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 6d 61   and so it is ma
4090: 72 6b 65 64 20 77 69 74 68 20 4e 4f 5f 54 45 53  rked with NO_TES
40a0: 54 20 74 6f 0a 2a 2a 20 6c 65 74 20 74 68 65 20  T to.** let the 
40b0: 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 72 6f  test coverage ro
40c0: 75 74 69 6e 65 20 6b 6e 6f 77 20 6e 6f 74 20 74  utine know not t
40d0: 6f 20 65 78 70 65 63 74 20 74 68 69 73 20 66 75  o expect this fu
40e0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20  nction to be.** 
40f0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
4100: 69 63 20 76 6f 69 64 20 6e 6f 6f 70 53 74 65 70  ic void noopStep
4110: 46 75 6e 63 28 20 20 20 20 2f 2a 4e 4f 5f 54 45  Func(    /*NO_TE
4120: 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  ST*/.  sqlite3_c
4130: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
4140: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4150: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
4170: 54 45 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33  TEST*/.  sqlite3
4180: 5f 76 61 6c 75 65 20 2a 2a 61 20 20 20 20 20 20  _value **a      
4190: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
41a0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
41c0: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
41d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
41e0: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
41f0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
4200: 45 54 45 52 28 6e 29 3b 20 20 20 20 20 20 20 2f  ETER(n);       /
4210: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55  *NO_TEST*/.  UNU
4220: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 29  SED_PARAMETER(a)
4230: 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  ;       /*NO_TES
4240: 54 2a 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b  T*/.  assert(0);
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 7d 20 20   /*NO_TEST*/.}  
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
4290: 45 53 54 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  EST*/.static voi
42a0: 64 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28  d noopValueFunc(
42b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
42c0: 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41  *p){ UNUSED_PARA
42d0: 4d 45 54 45 52 28 70 29 3b 20 2f 2a 6e 6f 2d 6f  METER(p); /*no-o
42e0: 70 2a 2f 20 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77  p*/ }../* Window
42f0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4300: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
4310: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
4320: 2c 20 78 46 69 6e 61 6c 2c 0a 2a 2a 20 78 56 61  , xFinal,.** xVa
4330: 6c 75 65 2c 20 61 6e 64 20 78 49 6e 76 65 72 73  lue, and xInvers
4340: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
4350: 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 61 6d 65 2c  DOWFUNCALL(name,
4360: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
43a0: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
43b0: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
43c0: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
43e0: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
43f0: 63 2c 20 6e 61 6d 65 20 23 23 20 46 69 6e 61 6c  c, name ## Final
4400: 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  izeFunc, name ##
4410: 20 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20   ValueFunc,     
4420: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
4430: 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 6e  me ## InvFunc, n
4440: 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d  ame ## Name, {0}
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57         \.}../* W
4480: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
4490: 74 68 61 74 20 61 72 65 20 69 6d 70 6c 65 6d 65  that are impleme
44a0: 6e 74 65 64 20 75 73 69 6e 67 20 62 79 74 65 63  nted using bytec
44b0: 6f 64 65 20 61 6e 64 20 74 68 75 73 20 68 61 76  ode and thus hav
44c0: 65 0a 2a 2a 20 6e 6f 2d 6f 70 20 72 6f 75 74 69  e.** no-op routi
44d0: 6e 65 73 20 66 6f 72 20 74 68 65 69 72 20 6d 65  nes for their me
44e0: 74 68 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  thods */.#define
44f0: 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28   WINDOWFUNCNOOP(
4500: 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29  name,nArg,extra)
4510: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53      \.  nArg, (S
4540: 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
4550: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78  E_FUNC_WINDOW|ex
4560: 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20  tra), 0, 0,     
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e   \.  noopStepFun
4590: 63 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63  c, noopValueFunc
45a0: 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c  , noopValueFunc,
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
45d0: 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20    noopStepFunc, 
45e0: 6e 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30  name ## Name, {0
45f0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
4620: 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69  /* Window functi
4630: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c  ons that use all
4640: 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63   window interfac
4650: 65 73 3a 20 78 53 74 65 70 2c 20 74 68 65 0a 2a  es: xStep, the.*
4660: 2a 20 73 61 6d 65 20 72 6f 75 74 69 6e 65 20 66  * same routine f
4670: 6f 72 20 78 46 69 6e 61 6c 69 7a 65 20 61 6e 64  or xFinalize and
4680: 20 78 56 61 6c 75 65 20 61 6e 64 20 77 68 69 63   xValue and whic
4690: 68 20 6e 65 76 65 72 20 63 61 6c 6c 0a 2a 2a 20  h never call.** 
46a0: 78 49 6e 76 65 72 73 65 2e 20 2a 2f 0a 23 64 65  xInverse. */.#de
46b0: 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 58  fine WINDOWFUNCX
46c0: 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61  (name,nArg,extra
46d0: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67          \.  nArg
4700: 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53  , (SQLITE_UTF8|S
4710: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
4720: 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20  W|extra), 0, 0, 
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23       \.  name ##
4750: 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20   StepFunc, name 
4760: 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 6e 61  ## ValueFunc, na
4770: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75    \.  noopStepFu
47a0: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65  nc, name ## Name
47b0: 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20 20 20  , {0}           
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
47e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
47f0: 74 65 72 20 74 68 6f 73 65 20 62 75 69 6c 74 2d  ter those built-
4800: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4810: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ons that are not
4820: 20 61 6c 73 6f 20 61 67 67 72 65 67 61 74 65 73   also aggregates
4830: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4840: 33 57 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73  3WindowFunctions
4850: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
4860: 20 46 75 6e 63 44 65 66 20 61 57 69 6e 64 6f 77   FuncDef aWindow
4870: 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Funcs[] = {.    
4880: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 6f 77 5f  WINDOWFUNCX(row_
4890: 6e 75 6d 62 65 72 2c 20 30 2c 20 30 29 2c 0a 20  number, 0, 0),. 
48a0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 64     WINDOWFUNCX(d
48b0: 65 6e 73 65 5f 72 61 6e 6b 2c 20 30 2c 20 30 29  ense_rank, 0, 0)
48c0: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
48d0: 58 28 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20  X(rank, 0, 0),. 
48e0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
48f0: 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30  (percent_rank, 0
4900: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4910: 46 55 4e 43 41 4c 4c 28 63 75 6d 65 5f 64 69 73  FUNCALL(cume_dis
4920: 74 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49  t, 0, 0),.    WI
4930: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 74 69 6c  NDOWFUNCALL(ntil
4940: 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 1, 0),.    WI
4950: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73 74  NDOWFUNCALL(last
4960: 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20  _value, 1, 0),. 
4970: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
4980: 28 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30  (nth_value, 2, 0
4990: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
49a0: 43 41 4c 4c 28 66 69 72 73 74 5f 76 61 6c 75 65  CALL(first_value
49b0: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
49c0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
49d0: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
49e0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
49f0: 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 2, 0),.    WIN
4a00: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
4a10: 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 3, 0),.    WIN
4a20: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c  DOWFUNCNOOP(lag,
4a30: 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   1, 0),.    WIND
4a40: 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20  OWFUNCNOOP(lag, 
4a50: 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  2, 0),.    WINDO
4a60: 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20 33  WFUNCNOOP(lag, 3
4a70: 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c  , 0),.  };.  sql
4a80: 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69  ite3InsertBuilti
4a90: 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75  nFuncs(aWindowFu
4aa0: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
4ab0: 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d  WindowFuncs));.}
4ac0: 0a 0a 73 74 61 74 69 63 20 57 69 6e 64 6f 77 20  ..static Window 
4ad0: 2a 77 69 6e 64 6f 77 46 69 6e 64 28 50 61 72 73  *windowFind(Pars
4ae0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
4af0: 77 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  w *pList, const 
4b00: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4b10: 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 66 6f 72  Window *p;.  for
4b20: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
4b30: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
4b40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4b50: 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Cmp(p->zName, zN
4b60: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4b70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20  .  }.  if( p==0 
4b80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4b90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4ba0: 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20  no such window: 
4bb0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
4bc0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4bd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4be0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d  ion is called im
4bf0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
4c00: 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75  resolving the fu
4c10: 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66  nction name.** f
4c20: 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  or a window func
4c30: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45  tion within a SE
4c40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
4c50: 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69  Argument pList i
4c60: 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  s a.** linked li
4c70: 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66  st of WINDOW def
4c80: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
4c90: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
4ca0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72  statement..** Ar
4cb0: 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20  gument pFunc is 
4cc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  the function def
4cd0: 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73  inition just res
4ce0: 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a  olved and pWin.*
4cf0: 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20  * is the Window 
4d00: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
4d10: 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61 74  ing the associat
4d20: 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20  ed OVER clause. 
4d30: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
4d40: 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e   updates the con
4d50: 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73  tents of pWin as
4d60: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
4d70: 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20    * If the OVER 
4d80: 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20 74  clause refered t
4d90: 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77  o a named window
4da0: 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20   (as in "max(x) 
4db0: 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20  OVER win"),.**  
4dc0: 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20 70     search list p
4dd0: 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68  List for a match
4de0: 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e  ing WINDOW defin
4df0: 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74  ition, and updat
4e00: 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63  e pWin.**     ac
4e10: 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f  cordingly. If no
4e20: 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61   such WINDOW cla
4e30: 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  use can be found
4e40: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
4e50: 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73  .**     in pPars
4e60: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
4e70: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
4e80: 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
4e90: 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
4ea0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
4eb0: 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65      window to be
4ec0: 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22 42   coerced (see "B
4ed0: 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46  UILT-IN WINDOW F
4ee0: 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65  UNCTIONS" at the
4ef0: 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74   top.**     of t
4f00: 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20  his file), pWin 
4f10: 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65 2e  is updated here.
4f20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4f30: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20  WindowUpdate(.  
4f40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
4f50: 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c    Window *pList,
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
4f80: 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74  ed windows for t
4f90: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
4fa0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20  Window *pWin,   
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20  /* Window frame 
4fd0: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46  to update */.  F
4fe0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20  uncDef *pFunc   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5000: 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * Window functio
5010: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a  n definition */.
5020: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
5030: 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65 54  Name && pWin->eT
5040: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ype==0 ){.    Wi
5050: 6e 64 6f 77 20 2a 70 20 3d 20 77 69 6e 64 6f 77  ndow *p = window
5060: 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  Find(pParse, pLi
5070: 73 74 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29  st, pWin->zName)
5080: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
5090: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 57 69   return;.    pWi
50a0: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
50b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
50c0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
50d0: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29  ->pPartition, 0)
50e0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
50f0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
5100: 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
5110: 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
5120: 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  y, 0);.    pWin-
5130: 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
5140: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
5150: 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20  >db, p->pStart, 
5160: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45  0);.    pWin->pE
5170: 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  nd = sqlite3Expr
5180: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
5190: 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
51a0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
51b0: 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 70  p->eStart;.    p
51c0: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65  Win->eEnd = p->e
51d0: 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  End;.    pWin->e
51e0: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
51f0: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5200: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
5210: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
5220: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
5230: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
5240: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
5250: 66 28 20 28 70 57 69 6e 2d 3e 65 54 79 70 65 3d  f( (pWin->eType=
5260: 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20 20 26 26  =TK_RANGE).   &&
5270: 20 28 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 7c   (pWin->pStart |
5280: 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 20 0a 20  | pWin->pEnd) . 
5290: 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 4f 72 64    && (pWin->pOrd
52a0: 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57 69 6e 2d  erBy==0 || pWin-
52b0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
52c0: 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  !=1).  ){.    sq
52d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
52e0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 41  arse, .      "RA
52f0: 4e 47 45 20 77 69 74 68 20 6f 66 66 73 65 74 20  NGE with offset 
5300: 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57  PRECEDING/FOLLOW
5310: 49 4e 47 20 72 65 71 75 69 72 65 73 20 6f 6e 65  ING requires one
5320: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
5330: 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 7d  sion".    );.  }
5340: 65 6c 73 65 0a 20 20 69 66 28 20 70 46 75 6e 63  else.  if( pFunc
5350: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
5360: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
5370: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
5380: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5390: 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e  ;.    if( pWin->
53a0: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
53b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
53c0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
53d0: 20 20 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75      "FILTER clau
53e0: 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  se may only be u
53f0: 73 65 64 20 77 69 74 68 20 61 67 67 72 65 67 61  sed with aggrega
5400: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
5410: 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  ons".      );.  
5420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
5430: 74 72 75 63 74 20 57 69 6e 64 6f 77 55 70 64 61  truct WindowUpda
5440: 74 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  te {.        con
5450: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a  st char *zFunc;.
5460: 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70          int eTyp
5470: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  e;.        int e
5480: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 69  Start;.        i
5490: 6e 74 20 65 45 6e 64 3b 0a 20 20 20 20 20 20 7d  nt eEnd;.      }
54a0: 20 61 55 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20   aUp[] = {.     
54b0: 20 20 20 7b 20 72 6f 77 5f 6e 75 6d 62 65 72 4e     { row_numberN
54c0: 61 6d 65 2c 20 20 20 54 4b 5f 52 4f 57 53 2c 20  ame,   TK_ROWS, 
54d0: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20    TK_UNBOUNDED, 
54e0: 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20  TK_CURRENT }, . 
54f0: 20 20 20 20 20 20 20 7b 20 64 65 6e 73 65 5f 72         { dense_r
5500: 61 6e 6b 4e 61 6d 65 2c 20 20 20 54 4b 5f 52 41  ankName,   TK_RA
5510: 4e 47 45 2c 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  NGE,  TK_UNBOUND
5520: 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d  ED, TK_CURRENT }
5530: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 72 61 6e  , .        { ran
5540: 6b 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 54  kName,         T
5550: 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55 4e 42  K_RANGE,  TK_UNB
5560: 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45  OUNDED, TK_CURRE
5570: 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b  NT }, .        {
5580: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d   percent_rankNam
5590: 65 2c 20 54 4b 5f 47 52 4f 55 50 53 2c 20 54 4b  e, TK_GROUPS, TK
55a0: 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b 5f 55  _CURRENT,   TK_U
55b0: 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20  NBOUNDED }, .   
55c0: 20 20 20 20 20 7b 20 63 75 6d 65 5f 64 69 73 74       { cume_dist
55d0: 4e 61 6d 65 2c 20 20 20 20 54 4b 5f 47 52 4f 55  Name,    TK_GROU
55e0: 50 53 2c 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  PS, TK_FOLLOWING
55f0: 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d  , TK_UNBOUNDED }
5600: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6e 74 69  , .        { nti
5610: 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 54  leName,        T
5620: 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 43 55 52  K_ROWS,   TK_CUR
5630: 52 45 4e 54 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  RENT,   TK_UNBOU
5640: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
5650: 20 7b 20 6c 65 61 64 4e 61 6d 65 2c 20 20 20 20   { leadName,    
5660: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
5670: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5680: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
5690: 20 20 20 20 20 20 20 7b 20 6c 61 67 4e 61 6d 65         { lagName
56a0: 2c 20 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  ,          TK_RO
56b0: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
56c0: 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d  ED, TK_CURRENT }
56d0: 2c 20 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  , .      };.    
56e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
56f0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5700: 69 7a 65 28 61 55 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aUp); i++){.
5710: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e          if( pFun
5720: 63 2d 3e 7a 4e 61 6d 65 3d 3d 61 55 70 5b 69 5d  c->zName==aUp[i]
5730: 2e 7a 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  .zFunc ){.      
5740: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5750: 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e  elete(db, pWin->
5760: 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  pStart);.       
5770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5780: 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70  lete(db, pWin->p
5790: 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
57a0: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 57 69  pWin->pEnd = pWi
57b0: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 30 3b 0a 20  n->pStart = 0;. 
57c0: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65           pWin->e
57d0: 54 79 70 65 20 3d 20 61 55 70 5b 69 5d 2e 65 54  Type = aUp[i].eT
57e0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ype;.          p
57f0: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 61 55  Win->eStart = aU
5800: 70 5b 69 5d 2e 65 53 74 61 72 74 3b 0a 20 20 20  p[i].eStart;.   
5810: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e         pWin->eEn
5820: 64 20 3d 20 61 55 70 5b 69 5d 2e 65 45 6e 64 3b  d = aUp[i].eEnd;
5830: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5840: 3e 65 45 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20  >eExclude = 0;. 
5850: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57 69           if( pWi
5860: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
5870: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20  LLOWING ){.     
5880: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74         pWin->pSt
5890: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
58a0: 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
58b0: 2c 20 22 31 22 29 3b 0a 20 20 20 20 20 20 20 20  , "1");.        
58c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
58d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
58e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
58f0: 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63 20 3d  .  pWin->pFunc =
5900: 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pFunc;.}../*.**
5910: 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
5920: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 73  passed through s
5930: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
5940: 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c 65 63  st() to.** selec
5950: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78  tWindowRewriteEx
5960: 70 72 43 62 28 29 20 62 79 20 73 65 6c 65 63 74  prCb() by select
5970: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
5980: 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  st()..*/.typedef
5990: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
59a0: 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65 77 72  write WindowRewr
59b0: 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69 6e 64  ite;.struct Wind
59c0: 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20 57 69  owRewrite {.  Wi
59d0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 53 72  ndow *pWin;.  Sr
59e0: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
59f0: 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b 0a 20  xprList *pSub;. 
5a00: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53 65 6c   Select *pSubSel
5a10: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ect;            
5a20: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75 62 2d   /* Current sub-
5a30: 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79 20 2a  select, if any *
5a40: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  /.};../*.** Call
5a50: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 75 73  back function us
5a60: 65 64 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  ed by selectWind
5a70: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a80: 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a  . If necessary,.
5a90: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
5aa0: 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68 65 20   appends to the 
5ab0: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
5ac0: 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64 61 74  n-list and updat
5ad0: 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  es .** expressio
5ae0: 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e 20 70  n (*ppExpr) in p
5af0: 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lace..*/.static 
5b00: 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
5b10: 52 65 77 72 69 74 65 45 78 70 72 43 62 28 57 61  RewriteExprCb(Wa
5b20: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
5b30: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
5b40: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
5b50: 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  ite *p = pWalker
5b60: 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20  ->u.pRewrite;.  
5b70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
5b80: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
5b90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66  ..  /* If this f
5ba0: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
5bb0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
5bc0: 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73 75 62  hin a scalar sub
5bd0: 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74 68 61  -select.  ** tha
5be0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45  t used by the SE
5bf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
5c00: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
5c10: 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20 20 2a  only process.  *
5c20: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78 70 72  * TK_COLUMN expr
5c30: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 66  essions that ref
5c40: 65 72 20 74 6f 20 69 74 20 28 74 68 65 20 6f 75  er to it (the ou
5c50: 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44 6f 0a  ter SELECT). Do.
5c60: 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65 73 73    ** not process
5c70: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 77   aggregates or w
5c80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
5c90: 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65 79 20  at all, as they 
5ca0: 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  belong.  ** to t
5cb0: 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65  he scalar sub-se
5cc0: 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lect.  */.  if( 
5cd0: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 29 7b  p->pSubSelect ){
5ce0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
5cf0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
5d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
5d10: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5d30: 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 2d   nSrc = p->pSrc-
5d40: 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69 6e 74  >nSrc;.      int
5d50: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5d60: 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
5d70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
5d80: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d 3e 70  pr->iTable==p->p
5d90: 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
5da0: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
5db0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
5dc0: 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20 57 52  nSrc ) return WR
5dd0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5de0: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
5df0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20   pExpr->op ){.. 
5e00: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
5e10: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 21  ION:.      if( !
5e20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5e30: 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
5e40: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  c) ){.        br
5e50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
5e60: 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77  {.        Window
5e70: 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20   *pWin;.        
5e80: 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e  for(pWin=p->pWin
5e90: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
5ea0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
5eb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
5ec0: 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69 6e 20  r->y.pWin==pWin 
5ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
5ee0: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 77  ssert( pWin->pOw
5ef0: 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a 20 20  ner==pExpr );.  
5f00: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5f10: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5f40: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e  /* Fall through.
5f50: 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 54    */..    case T
5f60: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
5f70: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
5f80: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  MN: {.      Expr
5f90: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5fa0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5fb0: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
5fc0: 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d 20 73       p->pSub = s
5fd0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
5fe0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  pend(pParse, p->
5ff0: 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  pSub, pDup);.   
6000: 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62 20 29     if( p->pSub )
6010: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6020: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6030: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
6040: 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ic)==0 );.      
6050: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
6060: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
6070: 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ic);.        sql
6080: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6090: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
60a0: 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 43  );.        ExprC
60b0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 45 78  learProperty(pEx
60c0: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a  pr, EP_Static);.
60d0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
60e0: 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Expr, 0, sizeof(
60f0: 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  Expr));..       
6100: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
6110: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
6120: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6130: 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d   p->pSub->nExpr-
6140: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  1;.        pExpr
6150: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57  ->iTable = p->pW
6160: 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 20  in->iEphCsr;.   
6170: 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
6180: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
6190: 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20  fault: /* no-op 
61a0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
61b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52    }..  return WR
61c0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
61d0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57  atic int selectW
61e0: 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65  indowRewriteSele
61f0: 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61  ctCb(Walker *pWa
6200: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
6210: 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75 63 74  elect){.  struct
6220: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
6230: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
6240: 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c 65 63  Rewrite;.  Selec
6250: 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e 70 53  t *pSave = p->pS
6260: 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  ubSelect;.  if( 
6270: 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74 20 29  pSave==pSelect )
6280: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
6290: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 65 6c  _Continue;.  }el
62a0: 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  se{.    p->pSubS
62b0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
62c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
62d0: 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
62e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d  pSelect);.    p-
62f0: 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70 53  >pSubSelect = pS
6300: 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave;.  }.  retur
6310: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
6320: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 74  ./*.** Iterate t
6330: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
6340: 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73  ession in expres
6350: 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69 73 74  sion-list pEList
6360: 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a  . For each:.**.*
6370: 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  *   * TK_COLUMN,
6380: 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67 61 74  .**   * aggregat
6390: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a  e function, or.*
63a0: 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66 75 6e  *   * window fun
63b0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57 69 6e  ction with a Win
63c0: 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61 74 20  dow object that 
63d0: 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65 72 20  is not a member 
63e0: 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 57  of the .**     W
63f0: 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73 73 65  indow list passe
6400: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
6410: 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e 29 2e  argument (pWin).
6420: 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  .**.** Append th
6430: 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70 75 74  e node to output
6440: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
6450: 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64 20 72   (*ppSub). And r
6460: 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74  eplace it.** wit
6470: 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68  h a TK_COLUMN th
6480: 61 74 20 72 65 61 64 73 20 74 68 65 20 28 4e 2d  at reads the (N-
6490: 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  1)th element of 
64a0: 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e  table .** pWin->
64b0: 69 45 70 68 43 73 72 2c 20 77 68 65 72 65 20 4e  iEphCsr, where N
64c0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
64d0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 28 2a  f elements in (*
64e0: 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a 2a 20  ppSub) after.** 
64f0: 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20 6e 65  appending the ne
6500: 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  w one..*/.static
6510: 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69 6e 64   void selectWind
6520: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 0a  owRewriteEList(.
6530: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6540: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e   .  Window *pWin
6550: 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ,.  SrcList *pSr
6560: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
6570: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  EList,          
6580: 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65 20       /* Rewrite 
6590: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
65a0: 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78  his list */.  Ex
65b0: 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62 20 20  prList **ppSub  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
65d0: 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65 6c   IN/OUT: Sub-sel
65e0: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  ect expression-l
65f0: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  ist */.){.  Walk
6600: 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57 69  er sWalker;.  Wi
6610: 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52 65 77  ndowRewrite sRew
6620: 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  rite;..  memset(
6630: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
6640: 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20  eof(Walker));.  
6650: 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69 74 65  memset(&sRewrite
6660: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
6670: 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a 20 20  owRewrite));..  
6680: 73 52 65 77 72 69 74 65 2e 70 53 75 62 20 3d 20  sRewrite.pSub = 
6690: 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77 72 69  *ppSub;.  sRewri
66a0: 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a  te.pWin = pWin;.
66b0: 20 20 73 52 65 77 72 69 74 65 2e 70 53 72 63 20    sRewrite.pSrc 
66c0: 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61 6c 6b  = pSrc;..  sWalk
66d0: 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
66e0: 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
66f0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  xprCallback = se
6700: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
6710: 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
6720: 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
6730: 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f  ck = selectWindo
6740: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6750: 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52  ;.  sWalker.u.pR
6760: 65 77 72 69 74 65 20 3d 20 26 73 52 65 77 72 69  ewrite = &sRewri
6770: 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c  te;..  (void)sql
6780: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
6790: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73  (&sWalker, pELis
67a0: 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20  t);..  *ppSub = 
67b0: 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a 7d  sRewrite.pSub;.}
67c0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
67d0: 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20 65 78   copy of each ex
67e0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
67f0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70  ession-list pApp
6800: 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73  end to.** expres
6810: 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e  sion list pList.
6820: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6830: 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  r to the result 
6840: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6850: 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c 69  ExprList *exprLi
6860: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20 20  stAppendList(.  
6870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6880: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
6890: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
68a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
68b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
68c0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
68d0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
68e0: 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
68f0: 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20 20 2f  *pAppend       /
6900: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
6910: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
6920: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6930: 20 20 69 66 28 20 70 41 70 70 65 6e 64 20 29 7b    if( pAppend ){
6940: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6950: 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73  int nInit = pLis
6960: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
6970: 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
6980: 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45  0; i<pAppend->nE
6990: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
69a0: 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
69b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
69c0: 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64  rse->db, pAppend
69d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
69e0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
69f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6a00: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
6a10: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
6a20: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 4c    if( pList ) pL
6a30: 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e  ist->a[nInit+i].
6a40: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70 70  sortOrder = pApp
6a50: 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  end->a[i].sortOr
6a60: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
6a70: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
6a80: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
6a90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6aa0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6ab0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f  cond argument do
6ac0: 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a  es not invoke.**
6ad0: 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77 20   any SQL window 
6ae0: 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20  functions, this 
6af0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
6b00: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
6b10: 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73 20  it .** rewrites 
6b20: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6b30: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69 6e  ment so that win
6b40: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53 74  dow function xSt
6b50: 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ep functions.** 
6b60: 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74  are invoked in t
6b70: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
6b80: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 75 6e   as described un
6b90: 64 65 72 20 22 53 45 4c 45 43 54 20 52 45 57 52  der "SELECT REWR
6ba0: 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65  ITING".** at the
6bb0: 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
6bc0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6bd0: 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50  3WindowRewrite(P
6be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
6bf0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
6c00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6c10: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26    if( p->pWin &&
6c20: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
6c30: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
6c40: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
6c50: 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  arse);.    sqlit
6c60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6c70: 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  >db;.    Select 
6c80: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
6c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
6ca0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72  bquery */.    Sr
6cb0: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
6cc0: 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20  >pSrc;.    Expr 
6cd0: 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68  *pWhere = p->pWh
6ce0: 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ere;.    ExprLis
6cf0: 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  t *pGroupBy = p-
6d00: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45  >pGroupBy;.    E
6d10: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70  xpr *pHaving = p
6d20: 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45  ->pHaving;.    E
6d30: 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d  xprList *pSort =
6d40: 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73   0;..    ExprLis
6d50: 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b  t *pSublist = 0;
6d60: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6d70: 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75  sion list for su
6d80: 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57  b-query */.    W
6d90: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
6da0: 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20  ->pWin;      /* 
6db0: 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62  Master window ob
6dc0: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64  ject */.    Wind
6dd0: 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20 20  ow *pWin;       
6de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
6df0: 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72 61  dow object itera
6e00: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70  tor */..    p->p
6e10: 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
6e20: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
6e30: 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  p->pGroupBy = 0;
6e40: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
6e50: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  = 0;..    /* Cre
6e60: 61 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ate the ORDER BY
6e70: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
6e80: 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73  sub-select. This
6e90: 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e   is the concaten
6ea0: 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20  ation.    ** of 
6eb0: 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49  the window PARTI
6ec0: 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42  TION and ORDER B
6ed0: 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65 6e 2c  Y clauses. Then,
6ee0: 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73 20 69   if this makes i
6ef0: 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e 64 61  t.    ** redunda
6f00: 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 4f  nt, remove the O
6f10: 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74 68 65  RDER BY from the
6f20: 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 20   parent SELECT. 
6f30: 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20   */.    pSort = 
6f40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6f50: 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50  up(db, pMWin->pP
6f60: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
6f70: 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c 69    pSort = exprLi
6f80: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
6f90: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69  rse, pSort, pMWi
6fa0: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  n->pOrderBy);.  
6fb0: 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70    if( pSort && p
6fc0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
6fd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6fe0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
6ff0: 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Sort, p->pOrderB
7000: 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
7010: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7020: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7030: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
7040: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
7050: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
7060: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73 69    }..    /* Assi
7070: 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  gn a cursor numb
7080: 65 72 20 66 6f 72 20 74 68 65 20 65 70 68 65 6d  er for the ephem
7090: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
70a0: 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73 2e 0a  to buffer rows..
70b0: 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65 6e 45      ** The OpenE
70c0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
70d0: 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20 6c 61  tion is coded la
70e0: 74 65 72 2c 20 61 66 74 65 72 20 69 74 20 69 73  ter, after it is
70f0: 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20 20 2a   known how.    *
7100: 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  * many columns t
7110: 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 68 61  he table will ha
7120: 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d 57 69  ve.  */.    pMWi
7130: 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70 50 61  n->iEphCsr = pPa
7140: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
7150: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
7160: 20 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63 74 57   3;..    selectW
7170: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
7180: 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  t(pParse, pMWin,
7190: 20 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74   pSrc, p->pEList
71a0: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
71b0: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
71c0: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
71d0: 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20  e, pMWin, pSrc, 
71e0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53  p->pOrderBy, &pS
71f0: 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57  ublist);.    pMW
7200: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d  in->nBufferCol =
7210: 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75   (pSublist ? pSu
7220: 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  blist->nExpr : 0
7230: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
7240: 64 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20  d the PARTITION 
7250: 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
7260: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74  expressions to t
7270: 68 65 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  he to the .    *
7280: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70  * sub-select exp
7290: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68  ression list. Th
72a0: 65 79 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ey are required 
72b0: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  to figure out wh
72c0: 65 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e  ere .    ** boun
72d0: 64 61 72 69 65 73 20 66 6f 72 20 70 61 72 74 69  daries for parti
72e0: 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f  tions and sets o
72f0: 66 20 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e  f peer rows lie.
7300: 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73    */.    pSublis
7310: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
7320: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
7330: 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e  Sublist, pMWin->
7340: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
7350: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
7360: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
7370: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
7380: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
7390: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
73a0: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  d the arguments 
73b0: 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77  passed to each w
73c0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
73d0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62  o the.    ** sub
73e0: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
73f0: 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c  on list. Also al
7400: 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73  locate two regis
7410: 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20  ters for each.  
7420: 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
7430: 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74  tion - one for t
7440: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20  he accumulator, 
7450: 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65  another for inte
7460: 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  rim.    ** resul
7470: 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ts.  */.    for(
7480: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
7490: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
74a0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57  xtWin){.      pW
74b0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70  in->iArgCol = (p
74c0: 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69  Sublist ? pSubli
74d0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
74e0: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
74f0: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
7500: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ist(pParse, pSub
7510: 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e  list, pWin->pOwn
7520: 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  er->x.pList);.  
7530: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
7540: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  ilter ){.       
7550: 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d   Expr *pFilter =
7560: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7570: 64 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  db, pWin->pFilte
7580: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
7590: 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Sublist = sqlite
75a0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
75b0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75c0: 2c 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  , pFilter);.    
75d0: 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e    }.      pWin->
75e0: 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61  regAccum = ++pPa
75f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
7600: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
7610: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7620: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
7630: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7640: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
7650: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d  regAccum);.    }
7660: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
7670: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
7680: 20 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59   or PARTITION BY
7690: 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
76a0: 20 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66   window.    ** f
76b0: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20  unction accepts 
76c0: 7a 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  zero arguments, 
76d0: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
76e0: 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20   other columns. 
76f0: 20 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28     ** selected (
7700: 65 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77  e.g. "SELECT row
7710: 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28  _number() OVER (
7720: 29 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20  ) FROM t1"), it 
7730: 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  is possible.    
7740: 2a 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74  ** that pSublist
7750: 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68   is still NULL h
7760: 65 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74  ere. Add a const
7770: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68  ant expression h
7780: 65 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b  ere to .    ** k
7790: 65 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c  eep everything l
77a0: 65 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73  egal in this cas
77b0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e. .    */.    i
77c0: 66 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29  f( pSublist==0 )
77d0: 7b 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74  {.      pSublist
77e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
77f0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
7800: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73   0, .          s
7810: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7820: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
7830: 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
7840: 73 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29  s[0], 0).      )
7850: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75  ;.    }..    pSu
7860: 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  b = sqlite3Selec
7870: 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50  tNew(.        pP
7880: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
7890: 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47  pSrc, pWhere, pG
78a0: 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c  roupBy, pHaving,
78b0: 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20   pSort, 0, 0.   
78c0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   );.    p->pSrc 
78d0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
78e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
78f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
7900: 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
7910: 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
7920: 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a  pSelect = pSub;.
7930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
7940: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
7950: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
7960: 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  c);.      if( sq
7970: 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
7980: 65 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e  ery(pParse, &p->
7990: 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20  pSrc->a[0]) ){. 
79a0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
79b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
79c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
79d0: 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sub->selFlags |=
79e0: 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
79f0: 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
7a00: 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
7a10: 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
7a20: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
7a30: 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a  arse, pSub, 0);.
7a40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
7a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7a60: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
7a70: 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  eral, pMWin->iEp
7a80: 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e  hCsr, pSublist->
7a90: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
7aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ab0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7ac0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 31 2c  MWin->iEphCsr+1,
7ad0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7ae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7af0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7b00: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
7b10: 69 45 70 68 43 73 72 2b 32 2c 20 70 4d 57 69 6e  iEphCsr+2, pMWin
7b20: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
7b30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7b40: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
7b50: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
7b60: 72 2b 33 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+3, pMWin->iEph
7b70: 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Csr);.    }else{
7b80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7b90: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
7ba0: 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sub);.    }.    
7bb0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7bc0: 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49  iled ) rc = SQLI
7bd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
7be0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7bf0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 57 69  *.** Free the Wi
7c00: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61 73 73  ndow object pass
7c10: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7c20: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
7c30: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
7c40: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
7c50: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
7c60: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
7c70: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7c80: 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29  (db, p->pFilter)
7c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7ca0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7cb0: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a  p->pPartition);.
7cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
7cd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
7ce0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7cf0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7d00: 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a  e(db, p->pEnd);.
7d10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7d20: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74  elete(db, p->pSt
7d30: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
7d40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
7d50: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
7d60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7d70: 7a 42 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  zBase);.    sqli
7d80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
7d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
7da0: 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  ree the linked l
7db0: 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
7dc0: 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67 20 61  jects starting a
7dd0: 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  t the second arg
7de0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7df0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
7e00: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
7e10: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
7e20: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
7e30: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78 74 20    Window *pNext 
7e40: 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20  = p->pNextWin;. 
7e50: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
7e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
7e70: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
7e80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  }.}../*.** The a
7e90: 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73 73 69  rgument expressi
7ea0: 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45 44 49  on is an PRECEDI
7eb0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
7ec0: 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a 2a 20  offset.  The.** 
7ed0: 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62 65 20  value should be 
7ee0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
7ef0: 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 20  nteger.  If the 
7f00: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 0a 2a  value is not a.*
7f10: 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68 61 6e  * constant, chan
7f20: 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  ge it to NULL.  
7f30: 54 68 65 20 66 61 63 74 20 74 68 61 74 20 69 74  The fact that it
7f40: 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e   is then a non-n
7f50: 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74 65 67  egative.** integ
7f60: 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  er will be caugh
7f70: 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20 69 74  t later.  But it
7f80: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 6e 6f   is important no
7f90: 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20 76 61  t to leave.** va
7fa0: 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20 69 6e  riable values in
7fb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7fc0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
7fd0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57 69 6e  Expr *sqlite3Win
7fe0: 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28 50 61  dowOffsetExpr(Pa
7ff0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8000: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
8010: 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49   0==sqlite3ExprI
8020: 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
8030: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52   ){.    if( IN_R
8040: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73  ENAME_OBJECT ) s
8050: 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72  qlite3RenameExpr
8060: 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45  Unmap(pParse, pE
8070: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8080: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
8090: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
80a0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
80b0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
80c0: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
80d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
80e0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
80f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
8100: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
8110: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64 65  Window object de
8120: 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64 6f  scribing a Windo
8130: 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  w Definition..*/
8140: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
8150: 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50  WindowAlloc(.  P
8160: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8170: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8180: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ext */.  int eTy
8190: 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 72  pe,        /* Fr
81a0: 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e  ame type. TK_RAN
81b0: 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a 2f  GE or TK_ROWS */
81c0: 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 20  .  int eStart,  
81d0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 79       /* Start ty
81e0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52 45  pe: CURRENT, PRE
81f0: 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e  CEDING, FOLLOWIN
8200: 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a  G, UNBOUNDED */.
8210: 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c 20    Expr *pStart, 
8220: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69 6e      /* Start win
8230: 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 50  dow size if TK_P
8240: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
8250: 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 65  OWING */.  int e
8260: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  End,         /* 
8270: 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45 4e  End type: CURREN
8280: 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b  T, FOLLOWING, TK
8290: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45 43  _UNBOUNDED, PREC
82a0: 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20  EDING */.  Expr 
82b0: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
82c0: 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  End window size 
82d0: 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  if TK_FOLLOWING 
82e0: 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  or PRECEDING */.
82f0: 20 20 75 38 20 65 45 78 63 6c 75 64 65 20 20 20    u8 eExclude   
8300: 20 20 20 20 2f 2a 20 45 58 43 4c 55 44 45 20 63      /* EXCLUDE c
8310: 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 57 69  lause */.){.  Wi
8320: 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b 0a  ndow *pWin = 0;.
8330: 20 20 69 6e 74 20 62 49 6d 70 6c 69 63 69 74 46    int bImplicitF
8340: 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rame = 0;..  /* 
8350: 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20 74  Parser assures t
8360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f  he following: */
8370: 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
8380: 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  ==0 || eType==TK
8390: 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65 3d  _RANGE || eType=
83a0: 3d 54 4b 5f 52 4f 57 53 20 7c 7c 20 65 54 79 70  =TK_ROWS || eTyp
83b0: 65 3d 3d 54 4b 5f 47 52 4f 55 50 53 20 29 3b 0a  e==TK_GROUPS );.
83c0: 20 20 61 73 73 65 72 74 28 20 65 53 74 61 72 74    assert( eStart
83d0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20  ==TK_CURRENT || 
83e0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
83f0: 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20  DING.           
8400: 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  || eStart==TK_UN
8410: 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53 74 61 72  BOUNDED || eStar
8420: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
8430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 45 6e  );.  assert( eEn
8440: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c  d==TK_CURRENT ||
8450: 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57   eEnd==TK_FOLLOW
8460: 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ING.           |
8470: 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  | eEnd==TK_UNBOU
8480: 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  NDED || eEnd==TK
8490: 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a 20 20  _PRECEDING );.  
84a0: 61 73 73 65 72 74 28 20 28 65 53 74 61 72 74 3d  assert( (eStart=
84b0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
84c0: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c   eStart==TK_FOLL
84d0: 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61 72 74 21  OWING)==(pStart!
84e0: 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
84f0: 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f   (eEnd==TK_FOLLO
8500: 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  WING || eEnd==TK
8510: 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d 28 70 45  _PRECEDING)==(pE
8520: 6e 64 21 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28  nd!=0) );..  if(
8530: 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
8540: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
8550: 3d 20 31 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 1;.    eType =
8560: 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 0a   TK_RANGE;.  }..
8570: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c    /* Additionall
8580: 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  y, the.  ** star
8590: 74 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79  ting boundary ty
85a0: 70 65 20 6d 61 79 20 6e 6f 74 20 6f 63 63 75 72  pe may not occur
85b0: 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
85c0: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20 74  following list t
85d0: 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64  han.  ** the end
85e0: 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79 70  ing boundary typ
85f0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 55  e:.  **.  **   U
8600: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8610: 4e 47 0a 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e  NG.  **   <expr>
8620: 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20   PRECEDING.  ** 
8630: 20 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20    CURRENT ROW.  
8640: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  **   <expr> FOLL
8650: 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 55 4e 42  OWING.  **   UNB
8660: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
8670: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  **.  ** The p
8680: 61 72 73 65 72 20 65 6e 73 75 72 65 73 20 74 68  arser ensures th
8690: 61 74 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52  at "UNBOUNDED PR
86a0: 45 43 45 44 49 4e 47 22 20 63 61 6e 6e 6f 74 20  ECEDING" cannot 
86b0: 62 65 20 75 73 65 64 20 61 73 20 61 6e 20 65 6e  be used as an en
86c0: 64 69 6e 67 0a 20 20 2a 2a 20 62 6f 75 6e 64 61  ding.  ** bounda
86d0: 72 79 2c 20 61 6e 64 20 74 68 61 6e 20 22 55 4e  ry, and than "UN
86e0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
86f0: 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  G" cannot be use
8700: 64 20 61 73 20 61 20 73 74 61 72 74 69 6e 67 0a  d as a starting.
8710: 20 20 2a 2a 20 66 72 61 6d 65 20 62 6f 75 6e 64    ** frame bound
8720: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
8730: 28 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  (eStart==TK_CURR
8740: 45 4e 54 20 26 26 20 65 45 6e 64 3d 3d 54 4b 5f  ENT && eEnd==TK_
8750: 50 52 45 43 45 44 49 4e 47 29 0a 20 20 20 7c 7c  PRECEDING).   ||
8760: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c   (eStart==TK_FOL
8770: 4c 4f 57 49 4e 47 20 26 26 20 28 65 45 6e 64 3d  LOWING && (eEnd=
8780: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
8790: 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e   eEnd==TK_CURREN
87a0: 54 29 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  T)).  ){.    sql
87b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
87c0: 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
87d0: 64 20 66 72 61 6d 65 20 73 70 65 63 69 66 69 63  d frame specific
87e0: 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ation");.    got
87f0: 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  o windowAllocErr
8800: 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d 20  ;.  }..  pWin = 
8810: 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33  (Window*)sqlite3
8820: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
8830: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
8840: 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28 20  Window));.  if( 
8850: 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 77  pWin==0 ) goto w
8860: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20  indowAllocErr;. 
8870: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65   pWin->eType = e
8880: 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53  Type;.  pWin->eS
8890: 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20  tart = eStart;. 
88a0: 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45   pWin->eEnd = eE
88b0: 6e 64 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75  nd;.  if( eExclu
88c0: 64 65 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a  de==0 && Optimiz
88d0: 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
88e0: 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
88f0: 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
8900: 20 29 7b 0a 20 20 20 20 65 45 78 63 6c 75 64 65   ){.    eExclude
8910: 20 3d 20 54 4b 5f 4e 4f 3b 0a 20 20 7d 0a 20 20   = TK_NO;.  }.  
8920: 70 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 3d  pWin->eExclude =
8930: 20 65 45 78 63 6c 75 64 65 3b 0a 20 20 70 57 69   eExclude;.  pWi
8940: 6e 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  n->bImplicitFram
8950: 65 20 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61  e = bImplicitFra
8960: 6d 65 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64  me;.  pWin->pEnd
8970: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
8980: 4f 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73  OffsetExpr(pPars
8990: 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e  e, pEnd);.  pWin
89a0: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
89b0: 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78  e3WindowOffsetEx
89c0: 70 72 28 70 50 61 72 73 65 2c 20 70 53 74 61 72  pr(pParse, pStar
89d0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69  t);.  return pWi
89e0: 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  n;..windowAllocE
89f0: 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  rr:.  sqlite3Exp
8a00: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8a10: 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c  db, pEnd);.  sql
8a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8a30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72  Parse->db, pStar
8a40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
8a60: 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52  PARTITION and OR
8a70: 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 70  DER BY clauses p
8a80: 50 61 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f  Partition and pO
8a90: 72 64 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77  rderBy to window
8aa0: 0a 2a 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20  .** pWin. Also, 
8ab0: 69 66 20 70 61 72 61 6d 65 74 65 72 20 70 42 61  if parameter pBa
8ac0: 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
8ad0: 73 65 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20  set pWin->zBase 
8ae0: 74 6f 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61  to the.** equiva
8af0: 6c 65 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  lent nul-termina
8b00: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57  ted string..*/.W
8b10: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
8b20: 6e 64 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20  ndowAssemble(.  
8b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
8b40: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20    Window *pWin, 
8b50: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
8b60: 72 74 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72  rtition, .  Expr
8b70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8b80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a  .  Token *pBase.
8b90: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b  ){.  if( pWin ){
8ba0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
8bb0: 69 74 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69  ition = pPartiti
8bc0: 6f 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f  on;.    pWin->pO
8bd0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
8be0: 79 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65  y;.    if( pBase
8bf0: 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   ){.      pWin->
8c00: 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  zBase = sqlite3D
8c10: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
8c20: 3e 64 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70  >db, pBase->z, p
8c30: 42 61 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a  Base->n);.    }.
8c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8c50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8c60: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8c70: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
8c80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8c90: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8ca0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  , pOrderBy);.  }
8cb0: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
8cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20  }../*.** Window 
8cd0: 2a 70 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62  *pWin has just b
8ce0: 65 65 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d  een created from
8cf0: 20 61 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65   a WINDOW clause
8d00: 2e 20 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a  . Tokne pBase.**
8d10: 20 69 73 20 74 68 65 20 62 61 73 65 20 77 69 6e   is the base win
8d20: 64 6f 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e  dow. Earlier win
8d30: 64 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61  dows from the sa
8d40: 6d 65 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65  me WINDOW clause
8d50: 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69   are.** stored i
8d60: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
8d70: 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 57  t starting at pW
8d80: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68  in->pNextWin. Th
8d90: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65  is function.** e
8da0: 69 74 68 65 72 20 75 70 64 61 74 65 73 20 2a 70  ither updates *p
8db0: 57 69 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  Win according to
8dc0: 20 74 68 65 20 62 61 73 65 20 73 70 65 63 69 66   the base specif
8dd0: 69 63 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65  ication, or else
8de0: 0a 2a 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72  .** leaves an er
8df0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
8e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
8e10: 6e 64 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20  ndowChain(Parse 
8e20: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
8e30: 2a 70 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70  *pWin, Window *p
8e40: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69  List){.  if( pWi
8e50: 6e 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20  n->zBase ){.    
8e60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69  arse->db;.    Wi
8e80: 6e 64 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77  ndow *pExist = w
8e90: 69 6e 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65  indowFind(pParse
8ea0: 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a  , pList, pWin->z
8eb0: 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Base);.    if( p
8ec0: 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63  Exist ){.      c
8ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
8ee0: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  = 0;.      /* Ch
8ef0: 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a  eck for errors *
8f00: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  /.      if( pWin
8f10: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
8f20: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22          zErr = "
8f30: 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65  PARTITION clause
8f40: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
8f50: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
8f60: 72 42 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72  rBy && pWin->pOr
8f70: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
8f80: 20 7a 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42   zErr = "ORDER B
8f90: 59 20 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20  Y clause";.     
8fa0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 69 73   }else if( pExis
8fb0: 74 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  t->bImplicitFram
8fc0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
8fd0: 7a 45 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70  zErr = "frame sp
8fe0: 65 63 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20  ecification";.  
8ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9000: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
9010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9020: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
9030: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65       "cannot ove
9040: 72 72 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64  rride %s of wind
9050: 6f 77 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70  ow: %s", zErr, p
9060: 57 69 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20  Win->zBase.     
9070: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
9080: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d  e{.        pWin-
9090: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
90a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
90b0: 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61  (db, pExist->pPa
90c0: 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
90d0: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 2d       if( pExist-
90e0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
90f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9100: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  Win->pOrderBy==0
9110: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57   );.          pW
9120: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
9130: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
9140: 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f  p(db, pExist->pO
9150: 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
9160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9170: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9180: 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20  pWin->zBase);.  
9190: 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73        pWin->zBas
91a0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
91b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
91c0: 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20  * Attach window 
91d0: 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65  object pWin to e
91e0: 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a  xpression p..*/.
91f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
9200: 6f 77 41 74 74 61 63 68 28 50 61 72 73 65 20 2a  owAttach(Parse *
9210: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
9220: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a   Window *pWin){.
9230: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9240: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
9250: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
9260: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
9270: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
9280: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 2e 20  for the parser. 
9290: 20 49 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74   If pWin was not
92a0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  .    ** allocate
92b0: 64 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c  d due to an OOM,
92c0: 20 74 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   then the parser
92d0: 20 77 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f   would fail befo
92e0: 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69  re ever.    ** i
92f0: 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
9300: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  tine */.    if( 
9310: 41 4c 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a  ALWAYS(pWin) ){.
9320: 20 20 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20        p->y.pWin 
9330: 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78  = pWin;.      Ex
9340: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
9350: 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20   EP_WinFunc);.  
9360: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72      pWin->pOwner
9370: 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20   = p;.      if( 
9380: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  p->flags & EP_Di
9390: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
93a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
93b0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
93c0: 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 20 69       "DISTINCT i
93d0: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
93e0: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
93f0: 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ions");.      }.
9400: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9410: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
9420: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9430: 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a  b, pWin);.  }.}.
9440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  ./*.** Return 0 
9450: 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f  if the two windo
9460: 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64  w objects are id
9470: 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d  entical, or non-
9480: 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a  zero otherwise..
9490: 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e  ** Identical win
94a0: 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20  dow objects can 
94b0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20  be processed in 
94c0: 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a  a single scan..*
94d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
94e0: 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65  dowCompare(Parse
94f0: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
9500: 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32   *p1, Window *p2
9510: 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 54 79  ){.  if( p1->eTy
9520: 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20 29 20  pe!=p2->eType ) 
9530: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9540: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
9550: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
9560: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
9570: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
9580: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
9590: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 70 32 2d 3e  ->eExclude!=p2->
95a0: 65 45 78 63 6c 75 64 65 20 29 20 72 65 74 75 72  eExclude ) retur
95b0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
95c0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
95d0: 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74  arse, p1->pStart
95e0: 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31  , p2->pStart, -1
95f0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
9600: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
9610: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
9620: 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e  1->pEnd, p2->pEn
9630: 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  d, -1) ) return 
9640: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9650: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
9660: 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p1->pPartition, 
9670: 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p2->pPartition, 
9680: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9690: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
96a0: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
96b0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70  >pOrderBy, p2->p
96c0: 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72  OrderBy, -1) ) r
96d0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
96e0: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
96f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79  his is called by
9700: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
9710: 63 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c  c before it call
9720: 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  s sqlite3WhereBe
9730: 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69  gin().** to begi
9740: 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
9750: 75 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72  ugh the sub-quer
9760: 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73  y results. It is
9770: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
9780: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
9790: 69 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ize registers an
97a0: 64 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62  d cursors used b
97b0: 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  y sqlite3WindowC
97c0: 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  odeStep()..*/.vo
97d0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
97e0: 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a  CodeInit(Parse *
97f0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
9800: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
9810: 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a   *pWin;.  Vdbe *
9820: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9830: 62 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  be(pParse);..  /
9840: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
9850: 74 65 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ters to use for 
9860: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 76 61 6c  PARTITION BY val
9870: 75 65 73 2c 20 69 66 20 61 6e 79 2e 20 49 6e 69  ues, if any. Ini
9880: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 73 61 69  tialize.  ** sai
9890: 64 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 4e  d registers to N
98a0: 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
98b0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
98c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70   ){.    int nExp
98d0: 72 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  r = pMWin->pPart
98e0: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
98f0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74    pMWin->regPart
9900: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9910: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
9920: 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 3b 0a 20 20  Mem += nExpr;.  
9930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9940: 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
9950: 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  0, pMWin->regPar
9960: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
9970: 74 2b 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a  t+nExpr-1);.  }.
9980: 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65  .  pMWin->regOne
9990: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
99a0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
99b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
99c0: 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e  eger, 1, pMWin->
99d0: 72 65 67 4f 6e 65 29 3b 0a 0a 20 20 69 66 28 20  regOne);..  if( 
99e0: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20  pMWin->eExclude 
99f0: 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65  ){.    pMWin->re
9a00: 67 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b  gStartRowid = ++
9a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9a20: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52    pMWin->regEndR
9a30: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
9a40: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e  >nMem;.    pMWin
9a50: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
9a60: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
9a70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9a80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9a90: 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
9aa0: 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  rtRowid);.    sq
9ab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9ac0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
9ad0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
9ae0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
9af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9b00: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69  OP_OpenDup, pMWi
9b10: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9b20: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9b30: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
9b40: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
9b50: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
9b60: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
9b70: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
9b80: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
9b90: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
9ba0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9bb0: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
9bc0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
9bd0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ED ){.      /* T
9be0: 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f  he inline versio
9bf0: 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20  ns of min() and 
9c00: 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20  max() require a 
9c10: 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c  single ephemeral
9c20: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
9c30: 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e  and 3 registers.
9c40: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
9c50: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
9c60: 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
9c70: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30     **   regApp+0
9c80: 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d  : slot to copy m
9c90: 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d  in()/max() argum
9ca0: 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52  ent to for MakeR
9cb0: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20  ecord.      **  
9cc0: 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67   regApp+1: integ
9cd0: 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f  er value used to
9ce0: 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65   ensure keys are
9cf0: 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a   unique.      **
9d00: 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74     regApp+2: out
9d10: 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72  put of MakeRecor
9d20: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  d.      */.     
9d30: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9d40: 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d   = pWin->pOwner-
9d50: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
9d60: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
9d70: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9d80: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
9d90: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c  Parse, pList, 0,
9da0: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d   0);.      pWin-
9db0: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
9dc0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
9dd0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
9de0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9df0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9e00: 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66  m += 3;.      if
9e10: 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57  ( pKeyInfo && pW
9e20: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9e30: 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  [1]=='i' ){.    
9e40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
9e50: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9e60: 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
9e70: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
9e80: 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20  tOrder[0] = 1;. 
9e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9ea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9eb0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
9ec0: 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  al, pWin->csrApp
9ed0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
9ee0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
9ef0: 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  v, pKeyInfo, P4_
9f00: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
9f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f20: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9f30: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
9f40: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  +1);.    }.    e
9f50: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
9f60: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20  ==nth_valueName 
9f70: 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  || p->zName==fir
9f80: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  st_valueName ){.
9f90: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
9fa0: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
9fb0: 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e  at pWin->regApp.
9fc0: 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75   These will be u
9fd0: 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  sed to.      ** 
9fe0: 73 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20  store the start 
9ff0: 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66  and end index of
a000: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
a010: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  me.  */.      as
a020: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70  sert( pMWin->iEp
a030: 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57  hCsr );.      pW
a040: 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61  in->regApp = pPa
a050: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a060: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
a070: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a080: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a090: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
a0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0b0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
a0c0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a0d0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
a0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
a0f0: 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  if( p->zName==le
a100: 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61  adName || p->zNa
a110: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20  me==lagName ){. 
a120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
a130: 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20  in->iEphCsr );. 
a140: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
a150: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a160: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
a170: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a180: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d  P_OpenDup, pWin-
a190: 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e  >csrApp, pMWin->
a1a0: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a  iEphCsr);.    }.
a1b0: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    }.}..#define W
a1c0: 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49  INDOW_STARTING_I
a1d0: 4e 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49  NT  0.#define WI
a1e0: 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20  NDOW_ENDING_INT 
a1f0: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e     1.#define WIN
a200: 44 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e  DOW_NTH_VALUE_IN
a210: 54 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  T 2.#define WIND
a220: 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20  OW_STARTING_NUM 
a230: 20 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   3.#define WINDO
a240: 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20  W_ENDING_NUM    
a250: 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  4../*.** A "PREC
a260: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  EDING <expr>" (e
a270: 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c  Cond==0) or "FOL
a280: 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  LOWING <expr>" (
a290: 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65  eCond==1) or the
a2a0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
a2b0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a2c0: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20   to nth_value() 
a2d0: 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a  (eCond==2) has j
a2e0: 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c  ust been.** eval
a2f0: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
a300: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
a310: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
a320: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
a330: 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f  es VM.** code to
a340: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
a350: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
a360: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
a370: 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a  and throws an.**
a380: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
a390: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
a3a0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
a3b0: 65 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a  eckValue(Parse *
a3c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c  pParse, int reg,
a3d0: 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73   int eCond){.  s
a3e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a3f0: 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20   *azErr[] = {.  
a400: 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e    "frame startin
a410: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
a420: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
a430: 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66  integer",.    "f
a440: 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73  rame ending offs
a450: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
a460: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
a470: 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20  r",.    "second 
a480: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f  argument to nth_
a490: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20  value must be a 
a4a0: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
a4b0: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74  ",.    "frame st
a4c0: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  arting offset mu
a4d0: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
a4e0: 74 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20  tive number",.  
a4f0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a500: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a510: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75   non-negative nu
a520: 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74  mber",.  };.  st
a530: 61 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d  atic int aOp[] =
a540: 20 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c   { OP_Ge, OP_Ge,
a550: 20 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f   OP_Gt, OP_Ge, O
a560: 50 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a  P_Ge };.  Vdbe *
a570: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a580: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a590: 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69  t regZero = sqli
a5a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a5b0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
a5c0: 20 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f   eCond>=0 && eCo
a5d0: 6e 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45  nd<ArraySize(azE
a5e0: 72 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  rr) );.  sqlite3
a5f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a600: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
a610: 5a 65 72 6f 29 3b 0a 20 20 69 66 28 20 65 43 6f  Zero);.  if( eCo
a620: 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53 54 41 52 54  nd>=WINDOW_START
a630: 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 69  ING_NUM ){.    i
a640: 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20 73  nt regString = s
a650: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a660: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
a670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a680: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a690: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
a6a0: 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  "", P4_STATIC);.
a6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a6c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
a6d0: 72 65 67 53 74 72 69 6e 67 2c 20 73 71 6c 69 74  regString, sqlit
a6e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a6f0: 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20  r(v)+2, reg);.  
a700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a710: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
a720: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
a730: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
a740: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a750: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65  OP_MustBeInt, re
a760: 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  g, sqlite3VdbeCu
a770: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
a780: 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 76 65 72  .  }.  VdbeCover
a790: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
a7a0: 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  0);.  VdbeCovera
a7b0: 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31  geIf(v, eCond==1
a7c0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
a7d0: 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29  eIf(v, eCond==2)
a7e0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
a7f0: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b  If(v, eCond==3);
a800: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  .  VdbeCoverageI
a810: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 0a  f(v, eCond==4);.
a820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a830: 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64  Op3(v, aOp[eCond
a840: 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69  ], regZero, sqli
a850: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
a860: 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20  dr(v)+2, reg);. 
a870: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
a880: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
a890: 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==0);.  VdbeCov
a8a0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
a8b0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20  (v, eCond==1);. 
a8c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
a8d0: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
a8e0: 64 3d 3d 32 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==2);.  VdbeCov
a8f0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
a900: 28 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 0a 20  (v, eCond==3);. 
a910: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
a920: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
a930: 64 3d 3d 34 29 3b 0a 20 20 73 71 6c 69 74 65 33  d==4);.  sqlite3
a940: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
a950: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a960: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
a970: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
a980: 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c  OE_Abort);.  sql
a990: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
a9a0: 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72  (v, (void*)azErr
a9b0: 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54  [eCond], P4_STAT
a9c0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  IC);.  sqlite3Re
a9d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a9e0: 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d  rse, regZero);.}
a9f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
aa00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
aa10: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
aa20: 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63   the window-func
aa30: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a  tion associated.
aa40: 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65  ** with the obje
aa50: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
aa60: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
aa70: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
aa80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
aa90: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69  indowArgCount(Wi
aaa0: 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45  ndow *pWin){.  E
aab0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
aac0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
aad0: 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  .pList;.  return
aae0: 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d   (pList ? pList-
aaf0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a  >nExpr : 0);.}..
ab00: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
ab10: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
ab20: 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20   either xStep() 
ab30: 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20  (if bInverse is 
ab40: 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72  0) or .** xInver
ab50: 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20  se (if bInverse 
ab60: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72  is non-zero) for
ab70: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
ab80: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a  ction in the .**
ab90: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
aba0: 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20  rting at pMWin. 
abb0: 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  Or, for built-in
abc0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
abd0: 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74  s.** that do not
abe0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
abf0: 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20  d function API, 
ac00: 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71  generate the req
ac10: 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20  uired.** inline 
ac20: 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  VM code..**.** I
ac30: 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69  f argument csr i
ac40: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
ac50: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68  r equal to 0, th
ac60: 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20  en argument reg 
ac70: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
ac80: 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61  register in an a
ac90: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
aca0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
acb0: 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
acc0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  gh to hold the a
acd0: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
ace0: 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74  s for each funct
acf0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
ad00: 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  e.** the argumen
ad10: 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ts are extracted
ad20: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
ad30: 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74  t row of csr int
ad40: 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f  o the.** array o
ad50: 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  f registers befo
ad60: 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41  re invoking OP_A
ad70: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67  ggStep or OP_Agg
ad80: 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72  Inverse.**.** Or
ad90: 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73  , if csr is less
ada0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
adb0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
adc0: 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69  gisters at reg i
add0: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70  s.** already pop
ade0: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
adf0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
ae00: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
ae10: 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
ae20: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
ae30: 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20   regPartSize is 
ae40: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
ae50: 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  t is a register 
ae60: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
ae70: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
ae80: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
ae90: 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  partition..*/.st
aea0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
aeb0: 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65  AggStep(.  Parse
aec0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
aed0: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20  dow *pMWin,     
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aef0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77  Linked list of w
af00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
af10: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20  */.  int csr,   
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67       /* Read arg
af40: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73  uments from this
af50: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
af60: 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20   bInverse,      
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af80: 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  True to invoke x
af90: 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20  Inverse instead 
afa0: 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e  of xStep */.  in
afb0: 74 20 72 65 67 20 20 20 20 20 20 20 20 20 20 20  t reg           
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
afd0: 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   Array of regist
afe0: 65 72 73 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ers */.){.  Vdbe
aff0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
b000: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b010: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
b020: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
b030: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
b040: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
b050: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
b060: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
b070: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
b080: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e    int nArg = win
b090: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
b0a0: 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  );.    int i;.. 
b0b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
b0c0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
b0d0: 69 66 28 20 69 21 3d 31 20 7c 7c 20 70 46 75 6e  if( i!=1 || pFun
b0e0: 63 2d 3e 7a 4e 61 6d 65 21 3d 6e 74 68 5f 76 61  c->zName!=nth_va
b0f0: 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lueName ){.     
b100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b110: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b120: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
b130: 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b  rgCol+i, reg+i);
b140: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b160: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
b170: 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  lumn, pMWin->iEp
b180: 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67  hCsr, pWin->iArg
b190: 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Col+i, reg+i);. 
b1a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b1b0: 20 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a   regArg = reg;..
b1c0: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72      if( pMWin->r
b1d0: 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a  egStartRowid==0.
b1e0: 20 20 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e       && (pFunc->
b1f0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
b200: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
b210: 0a 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e  .     && (pWin->
b220: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
b230: 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20  NDED).    ){.   
b240: 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c     int addrIsNul
b250: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  l = sqlite3VdbeA
b260: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
b270: 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20  ll, regArg);.   
b280: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
b290: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  v);.      if( bI
b2a0: 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  nverse==0 ){.   
b2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
b2d0: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
b2e0: 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  p+1, 1);.       
b2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b300: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
b310: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
b320: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73  gApp);.        s
b330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b340: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b350: 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c  d, pWin->regApp,
b360: 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   2, pWin->regApp
b370: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2);.        sql
b380: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b390: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b3a0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57  pWin->csrApp, pW
b3b0: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
b3c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3e0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
b3f0: 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72  eekGE, pWin->csr
b400: 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  App, 0, regArg, 
b410: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
b420: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
b430: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
b440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b450: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
b460: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b480: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c  eJumpHere(v, sql
b490: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b4a0: 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20  ddr(v)-2);.     
b4b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b4c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b4d0: 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20  addrIsNull);.   
b4e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d   }else if( pWin-
b4f0: 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20  >regApp ){.     
b500: 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
b510: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
b520: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  Name.           
b530: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
b540: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
b550: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
b560: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
b570: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
b580: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
b590: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b5a0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
b5b0: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
b5c0: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
b5d0: 73 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53  se if( pFunc->xS
b5e0: 46 75 6e 63 21 3d 6e 6f 6f 70 53 74 65 70 46 75  Func!=noopStepFu
b5f0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nc ){.      int 
b600: 61 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20  addrIf = 0;.    
b610: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
b620: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ter ){.        i
b630: 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20  nt regTmp;.     
b640: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
b650: 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e  =0 || nArg==pWin
b660: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
b670: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
b680: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
b690: 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72   || pWin->pOwner
b6a0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  ->x.pList==0 );.
b6b0: 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d          regTmp =
b6c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b6d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b700: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
b710: 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54  ArgCol+nArg,regT
b720: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  mp);.        add
b730: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
b740: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
b750: 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20  Not, regTmp, 0, 
b760: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
b770: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b780: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
b790: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
b7a0: 65 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20  e, regTmp);.    
b7b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
b7c0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
b7d0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
b7e0: 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
b7f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
b800: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b810: 20 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20   nArg>0 );.     
b820: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
b830: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
b840: 70 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f  pParse, pWin->pO
b850: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  wner->x.pList->a
b860: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
b870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b880: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
b890: 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e  Seq, 0,0,0, (con
b8a0: 73 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20  st char*)pColl, 
b8b0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
b8c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b8d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b8e0: 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67  bInverse? OP_Agg
b8f0: 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67  Inverse : OP_Agg
b900: 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20  Step, .         
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
b920: 49 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c  Inverse, regArg,
b930: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
b940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b950: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
b960: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
b970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b980: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b990: 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20  (u8)nArg);.     
b9a0: 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71   if( addrIf ) sq
b9b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b9c0: 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20  e(v, addrIf);.  
b9d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64    }.  }.}..typed
b9e0: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
b9f0: 43 6f 64 65 41 72 67 20 57 69 6e 64 6f 77 43 6f  CodeArg WindowCo
ba00: 64 65 41 72 67 3b 0a 74 79 70 65 64 65 66 20 73  deArg;.typedef s
ba10: 74 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41  truct WindowCsrA
ba20: 6e 64 52 65 67 20 57 69 6e 64 6f 77 43 73 72 41  ndReg WindowCsrA
ba30: 6e 64 52 65 67 3b 0a 73 74 72 75 63 74 20 57 69  ndReg;.struct Wi
ba40: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 7b 0a  ndowCsrAndReg {.
ba50: 20 20 69 6e 74 20 63 73 72 3b 0a 20 20 69 6e 74    int csr;.  int
ba60: 20 72 65 67 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74   reg;.};..struct
ba70: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 7b   WindowCodeArg {
ba80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ba90: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ;.  Window *pMWi
baa0: 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  n;.  Vdbe *pVdbe
bab0: 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ;.  int regGosub
bac0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  ;.  int addrGosu
bad0: 62 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b  b;.  int regArg;
bae0: 0a 20 20 69 6e 74 20 65 44 65 6c 65 74 65 3b 0a  .  int eDelete;.
baf0: 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52  .  WindowCsrAndR
bb00: 65 67 20 73 74 61 72 74 3b 0a 20 20 57 69 6e 64  eg start;.  Wind
bb10: 6f 77 43 73 72 41 6e 64 52 65 67 20 63 75 72 72  owCsrAndReg curr
bb20: 65 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72  ent;.  WindowCsr
bb30: 41 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b 0a 0a  AndReg end;.};..
bb40: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68 61  /*.** Values tha
bb50: 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  t may be passed 
bb60: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
bb70: 67 75 6d 65 6e 74 20 74 6f 20 77 69 6e 64 6f 77  gument to window
bb80: 43 6f 64 65 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65  CodeOp()..*/.#de
bb90: 66 69 6e 65 20 57 49 4e 44 4f 57 5f 52 45 54 55  fine WINDOW_RETU
bba0: 52 4e 5f 52 4f 57 20 31 0a 23 64 65 66 69 6e 65  RN_ROW 1.#define
bbb0: 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
bbc0: 53 45 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e  SE 2.#define WIN
bbd0: 44 4f 57 5f 41 47 47 53 54 45 50 20 20 20 20 33  DOW_AGGSTEP    3
bbe0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bbf0: 20 56 4d 20 63 6f 64 65 20 74 6f 20 72 65 61 64   VM code to read
bc00: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
bc10: 65 73 20 70 65 65 72 20 76 61 6c 75 65 73 20 66  es peer values f
bc20: 72 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 20 69  rom cursor csr i
bc30: 6e 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20  nto.** an array 
bc40: 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61  of registers sta
bc50: 72 74 69 6e 67 20 61 74 20 72 65 67 2e 0a 2a 2f  rting at reg..*/
bc60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
bc70: 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65  dowReadPeerValue
bc80: 73 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  s(.  WindowCodeA
bc90: 72 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63 73 72  rg *p,.  int csr
bca0: 2c 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b 0a 20  ,.  int reg.){. 
bcb0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
bcc0: 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45 78 70   p->pMWin;.  Exp
bcd0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
bce0: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
bcf0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
bd00: 79 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  y ){.    Vdbe *v
bd10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
bd20: 65 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20  e(p->pParse);.  
bd30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
bd40: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
bd50: 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  ition;.    int i
bd60: 43 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e  ColOff = pMWin->
bd70: 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50  nBufferCol + (pP
bd80: 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78  art ? pPart->nEx
bd90: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  pr : 0);.    int
bda0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
bdb0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
bdc0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
bdd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bde0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bdf0: 63 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69 2c 20  csr, iColOff+i, 
be00: 72 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  reg+i);.    }.  
be10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
be20: 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69  ate VM code to i
be30: 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61  nvoke either xVa
be40: 6c 75 65 28 29 20 28 62 46 69 6e 3d 3d 30 29 20  lue() (bFin==0) 
be50: 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a  or xFinalize().*
be60: 2a 20 28 62 46 69 6e 3d 3d 31 29 20 66 6f 72 20  * (bFin==1) for 
be70: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
be80: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b  tion in the link
be90: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
bea0: 20 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72   at.** pMWin. Or
beb0: 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77  , for built-in w
bec0: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20  indow-functions 
bed0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20  that do not use 
bee0: 74 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20  the standard.** 
bef0: 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68  API, generate th
bf00: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20  e equivalent VM 
bf10: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
bf20: 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69  void windowAggFi
bf30: 6e 61 6c 28 57 69 6e 64 6f 77 43 6f 64 65 41 72  nal(WindowCodeAr
bf40: 67 20 2a 70 2c 20 69 6e 74 20 62 46 69 6e 29 7b  g *p, int bFin){
bf50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bf60: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
bf70: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
bf80: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65  p->pMWin;.  Vdbe
bf90: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
bfa0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
bfb0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20  Window *pWin;.. 
bfc0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
bfd0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
bfe0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
bff0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
c000: 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20  tartRowid==0.   
c010: 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 46 75 6e    && (pWin->pFun
c020: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
c030: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
c040: 58 29 20 0a 20 20 20 20 20 26 26 20 28 70 57 69  X) .     && (pWi
c050: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
c060: 42 4f 55 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a  BOUNDED).    ){.
c070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c080: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
c090: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
c0a0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73  Result);.      s
c0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c0c0: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69  (v, OP_Last, pWi
c0d0: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
c0e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
c0f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c100: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c110: 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63  _Column, pWin->c
c120: 73 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e  srApp, 0, pWin->
c130: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
c140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c150: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
c160: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
c170: 76 29 2d 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v)-2);.    }else
c180: 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70   if( pWin->regAp
c190: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
c1a0: 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  t( pMWin->regSta
c1b0: 72 74 52 6f 77 69 64 3d 3d 30 20 29 3b 0a 20 20  rtRowid==0 );.  
c1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
c1d0: 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77  nt nArg = window
c1e0: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a  ArgCount(pWin);.
c1f0: 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 20 29        if( bFin )
c200: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c210: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c220: 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e  P_AggFinal, pWin
c230: 2d 3e 72 65 67 41 63 63 75 6d 2c 20 6e 41 72 67  ->regAccum, nArg
c240: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c250: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
c260: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
c270: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
c280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c290: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
c2a0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
c2b0: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
c2c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
c2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c2e0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
c2f0: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
c300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c320: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56 61  dOp3(v, OP_AggVa
c330: 6c 75 65 2c 70 57 69 6e 2d 3e 72 65 67 41 63 63  lue,pWin->regAcc
c340: 75 6d 2c 6e 41 72 67 2c 70 57 69 6e 2d 3e 72 65  um,nArg,pWin->re
c350: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
c360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
c370: 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70  endP4(v, pWin->p
c380: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
c390: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c3a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
c3b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
c3c0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 75 72  alculate the cur
c3d0: 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 61  rent values of a
c3e0: 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ll window functi
c3f0: 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d  ons in the.** p-
c400: 3e 70 4d 57 69 6e 20 6c 69 73 74 20 62 79 20 64  >pMWin list by d
c410: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e  oing a full scan
c420: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
c430: 77 69 6e 64 6f 77 20 66 72 61 6d 65 2e 20 53 74  window frame. St
c440: 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
c450: 74 73 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  ts in the Window
c460: 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73  .regResult regis
c470: 74 65 72 73 2c 20 72 65 61 64 79 20 74 6f 20 72  ters, ready to r
c480: 65 74 75 72 6e 20 74 68 65 20 75 70 70 65 72 0a  eturn the upper.
c490: 2a 2a 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ** layer..*/.sta
c4a0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 46  tic void windowF
c4b0: 75 6c 6c 53 63 61 6e 28 57 69 6e 64 6f 77 43 6f  ullScan(WindowCo
c4c0: 64 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e  deArg *p){.  Win
c4d0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 50 61 72  dow *pWin;.  Par
c4e0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
c4f0: 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77  pParse;.  Window
c500: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57   *pMWin = p->pMW
c510: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
c520: 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 6e 74  p->pVdbe;..  int
c530: 20 72 65 67 43 52 6f 77 69 64 20 3d 20 30 3b 20   regCRowid = 0; 
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c550: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61  Current rowid va
c560: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lue */.  int reg
c570: 43 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20  CPeer = 0;      
c580: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
c590: 65 6e 74 20 70 65 65 72 20 76 61 6c 75 65 73 20  ent peer values 
c5a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  */.  int regRowi
c5b0: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
c5c0: 20 20 20 20 20 2f 2a 20 41 67 67 53 74 65 70 20       /* AggStep 
c5d0: 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  rowid value */. 
c5e0: 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30   int regPeer = 0
c5f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c600: 20 2f 2a 20 41 67 67 53 74 65 70 20 70 65 65 72   /* AggStep peer
c610: 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 69 6e   values */..  in
c620: 74 20 6e 50 65 65 72 3b 0a 20 20 69 6e 74 20 6c  t nPeer;.  int l
c630: 62 6c 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6c 62  blNext;.  int lb
c640: 6c 42 72 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72  lBrk;.  int addr
c650: 4e 65 78 74 3b 0a 20 20 69 6e 74 20 63 73 72 20  Next;.  int csr 
c660: 3d 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 3b  = pMWin->csrApp;
c670: 0a 0a 20 20 6e 50 65 65 72 20 3d 20 28 70 4d 57  ..  nPeer = (pMW
c680: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70  in->pOrderBy ? p
c690: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  MWin->pOrderBy->
c6a0: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 6c  nExpr : 0);..  l
c6b0: 62 6c 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  blNext = sqlite3
c6c0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
c6d0: 61 72 73 65 29 3b 0a 20 20 6c 62 6c 42 72 6b 20  arse);.  lblBrk 
c6e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
c6f0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
c700: 0a 20 20 72 65 67 43 52 6f 77 69 64 20 3d 20 73  .  regCRowid = s
c710: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
c720: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52  (pParse);.  regR
c730: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
c740: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
c750: 3b 0a 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b  ;.  if( nPeer ){
c760: 0a 20 20 20 20 72 65 67 43 50 65 65 72 20 3d 20  .    regCPeer = 
c770: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
c780: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65 65  nge(pParse, nPee
c790: 72 29 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20  r);.    regPeer 
c7a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c7b0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
c7c0: 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  eer);.  }..  sql
c7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c7e0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 4d 57 69  , OP_Rowid, pMWi
c7f0: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 43  n->iEphCsr, regC
c800: 52 6f 77 69 64 29 3b 0a 20 20 77 69 6e 64 6f 77  Rowid);.  window
c810: 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
c820: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
c830: 2c 20 72 65 67 43 50 65 65 72 29 3b 0a 0a 20 20  , regCPeer);..  
c840: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c850: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c860: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c880: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
c890: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
c8a0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
c8b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c8c0: 5f 53 65 65 6b 47 45 2c 20 63 73 72 2c 20 6c 62  _SeekGE, csr, lb
c8d0: 6c 42 72 6b 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  lBrk, pMWin->reg
c8e0: 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 56  StartRowid);.  V
c8f0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c900: 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
c910: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
c920: 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ddr(v);.  sqlite
c930: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c940: 50 5f 52 6f 77 69 64 2c 20 63 73 72 2c 20 72 65  P_Rowid, csr, re
c950: 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  gRowid);.  sqlit
c960: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c970: 4f 50 5f 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  OP_Gt, pMWin->re
c980: 67 45 6e 64 52 6f 77 69 64 2c 20 6c 62 6c 42 72  gEndRowid, lblBr
c990: 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  k, regRowid);.  
c9a0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
c9b0: 72 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 69 66 28  rNull(v);..  if(
c9c0: 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
c9d0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 29 7b 0a  ==TK_CURRENT ){.
c9e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c9f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
ca00: 72 65 67 43 52 6f 77 69 64 2c 20 6c 62 6c 4e 65  regCRowid, lblNe
ca10: 78 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  xt, regRowid);. 
ca20: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 57 69 6e   }else if( pMWin
ca30: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 54 4b 5f 4e  ->eExclude!=TK_N
ca40: 4f 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  O ){.    int add
ca50: 72 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  r;.    int addrE
ca60: 71 20 3d 20 30 3b 0a 20 20 20 20 4b 65 79 49 6e  q = 0;.    KeyIn
ca70: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20  fo *pKeyInfo;.. 
ca80: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
ca90: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
caa0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
cab0: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
cac0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
cad0: 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
cae0: 3d 3d 54 4b 5f 54 49 45 53 20 29 7b 0a 20 20 20  ==TK_TIES ){.   
caf0: 20 20 20 61 64 64 72 45 71 20 3d 20 73 71 6c 69     addrEq = sqli
cb00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cb10: 20 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69   OP_Eq, regCRowi
cb20: 64 2c 20 6c 62 6c 4e 65 78 74 2c 20 72 65 67 52  d, lblNext, regR
cb30: 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
cb40: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
cb50: 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65  alues(p, csr, re
cb60: 67 50 65 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  gPeer);.    sqli
cb70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cb80: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
cb90: 50 65 65 72 2c 20 72 65 67 43 50 65 65 72 2c 20  Peer, regCPeer, 
cba0: 6e 50 65 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  nPeer);.    sqli
cbb0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
cbc0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
cbd0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
cbe0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
cbf0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
cc00: 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 73 71 6c  dr(v)+1;.    sql
cc10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
cc20: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2c  , OP_Jump, addr,
cc30: 20 6c 62 6c 4e 65 78 74 2c 20 61 64 64 72 29 3b   lblNext, addr);
cc40: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
cc50: 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 69 66  eEqNe(v);.    if
cc60: 28 20 61 64 64 72 45 71 20 29 20 73 71 6c 69 74  ( addrEq ) sqlit
cc70: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
cc80: 2c 20 61 64 64 72 45 71 29 3b 0a 20 20 7d 0a 0a  , addrEq);.  }..
cc90: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
cca0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
ccb0: 73 72 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67  sr, 0, p->regArg
ccc0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
ccd0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
cce0: 20 6c 62 6c 4e 65 78 74 29 3b 0a 20 20 73 71 6c   lblNext);.  sql
ccf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cd00: 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20  , OP_Next, csr, 
cd10: 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 56 64 62  addrNext);.  Vdb
cd20: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cd30: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cd40: 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2d  ere(v, addrNext-
cd50: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
cd60: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
cd70: 72 4e 65 78 74 2b 31 29 3b 0a 20 20 73 71 6c 69  rNext+1);.  sqli
cd80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
cd90: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
cda0: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  id);.  sqlite3Re
cdb0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
cdc0: 72 73 65 2c 20 72 65 67 43 52 6f 77 69 64 29 3b  rse, regCRowid);
cdd0: 0a 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a  .  if( nPeer ){.
cde0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
cdf0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
ce00: 73 65 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  se, regPeer, nPe
ce10: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
ce20: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
ce30: 28 70 50 61 72 73 65 2c 20 72 65 67 43 50 65 65  (pParse, regCPee
ce40: 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 7d 0a 0a  r, nPeer);.  }..
ce50: 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
ce60: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
ce70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   Invoke the sub-
ce80: 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67 47 6f  routine at regGo
ce90: 73 75 62 20 28 67 65 6e 65 72 61 74 65 64 20 62  sub (generated b
cea0: 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74  y code in select
ceb0: 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e  .c) to.** return
cec0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
ced0: 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70 68 43   of Window.iEphC
cee0: 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64 6f  sr. If all windo
cef0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a  w functions are.
cf00: 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77 69 6e  ** aggregate win
cf10: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
cf20: 61 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64  at use the stand
cf30: 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e 67 6c  ard API, a singl
cf40: 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69 6e  e.** OP_Gosub in
cf50: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 6c  struction is all
cf60: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
cf70: 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20 45 78  ne generates. Ex
cf80: 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 66  tra VM code.** f
cf90: 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f 63 65  or per-row proce
cfa0: 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67 65  ssing is only ge
cfb0: 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 65 20  nerated for the 
cfc0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
cfd0: 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e  in window.** fun
cfe0: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ctions:.**.**   
cff0: 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20  nth_value().**  
d000: 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29 0a 2a   first_value().*
d010: 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20 6c  *   lag().**   l
d020: 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ead().*/.static 
d030: 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72  void windowRetur
d040: 6e 4f 6e 65 52 6f 77 28 57 69 6e 64 6f 77 43 6f  nOneRow(WindowCo
d050: 64 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e  deArg *p){.  Win
d060: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
d070: 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  pMWin;.  Vdbe *v
d080: 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20   = p->pVdbe;..  
d090: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
d0a0: 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  artRowid ){.    
d0b0: 77 69 6e 64 6f 77 46 75 6c 6c 53 63 61 6e 28 70  windowFullScan(p
d0c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d0d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
d0e0: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 57  p->pParse;.    W
d0f0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20  indow *pWin;..  
d100: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
d110: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
d120: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
d130: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
d140: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
d150: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  ;.      if( pFun
d160: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
d170: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 7c  lueName.       |
d180: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
d190: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
d1a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
d1b0: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
d1c0: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20  >csrApp;.       
d1d0: 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
d1e0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d1f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d200: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
d210: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
d220: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d240: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
d250: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
d260: 74 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69  t);.  .        i
d270: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
d280: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
d290: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d2a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d2b0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e   OP_Column,pMWin
d2c0: 2d 3e 69 45 70 68 43 73 72 2c 70 57 69 6e 2d 3e  ->iEphCsr,pWin->
d2d0: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
d2e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e  );.          win
d2f0: 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50  dowCheckValue(pP
d300: 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29  arse, tmpReg, 2)
d310: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d320: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d330: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d340: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
d350: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
d360: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
d370: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d380: 50 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70  P_Add, tmpReg, p
d390: 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70  Win->regApp, tmp
d3a0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Reg);.        sq
d3b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d3c0: 76 2c 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e  v, OP_Gt, pWin->
d3d0: 72 65 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74  regApp+1, lbl, t
d3e0: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
d3f0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
d400: 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20 20  rNull(v);.      
d410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d420: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
d430: 77 69 64 2c 20 63 73 72 2c 20 30 2c 20 74 6d 70  wid, csr, 0, tmp
d440: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Reg);.        Vd
d450: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
d460: 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20  aken(v);.       
d470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d480: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d490: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
d4a0: 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  Col, pWin->regRe
d4b0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73  sult);.        s
d4c0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d4d0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
d4e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
d4f0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d500: 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20  arse, tmpReg);. 
d510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
d520: 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61  e if( pFunc->zNa
d530: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20  me==leadName || 
d540: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61  pFunc->zName==la
d550: 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  gName ){.       
d560: 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e   int nArg = pWin
d570: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
d580: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
d590: 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e    int csr = pWin
d5a0: 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20  ->csrApp;.      
d5b0: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
d5c0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d5d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d5e0: 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73    int tmpReg = s
d5f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
d600: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d610: 20 20 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57    int iEph = pMW
d620: 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 0a  in->iEphCsr;.  .
d630: 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
d640: 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <3 ){.          
d650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d660: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d670: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
d680: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d690: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d6b0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68   OP_Column, iEph
d6c0: 2c 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32  ,pWin->iArgCol+2
d6d0: 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74  ,pWin->regResult
d6e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
d710: 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67  id, iEph, tmpReg
d720: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
d730: 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  Arg<2 ){.       
d740: 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46     int val = (pF
d750: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
d760: 4e 61 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a  Name ? 1 : -1);.
d770: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d780: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d790: 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67  P_AddImm, tmpReg
d7a0: 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  , val);.        
d7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d7c0: 20 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63   int op = (pFunc
d7d0: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
d7e0: 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f  e ? OP_Add : OP_
d7f0: 53 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20  Subtract);.     
d800: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32       int tmpReg2
d810: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
d820: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
d830: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d840: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d850: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
d860: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74  in->iArgCol+1, t
d870: 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20  mpReg2);.       
d880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d890: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52  dOp3(v, op, tmpR
d8a0: 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70  eg2, tmpReg, tmp
d8b0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Reg);.          
d8c0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d8d0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d  mpReg(pParse, tm
d8e0: 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20  pReg2);.        
d8f0: 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 73 71 6c  }.  .        sql
d900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d910: 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
d920: 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67  csr, lbl, tmpReg
d930: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
d940: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d960: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
d970: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
d980: 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65  ArgCol, pWin->re
d990: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
d9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d9b0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
d9c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d9d0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
d9e0: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29  (pParse, tmpReg)
d9f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
da00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
da10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
da20: 73 75 62 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62  sub, p->regGosub
da30: 2c 20 70 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b  , p->addrGosub);
da40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
da50: 74 65 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74  te code to set t
da60: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
da70: 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
da80: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
da90: 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  .** in the linke
daa0: 64 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  d list passed as
dab0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
dac0: 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e  ment to NULL. An
dad0: 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79  d perform.** any
dae0: 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74   equivalent init
daf0: 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69  ialization requi
db00: 72 65 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74  red by any built
db10: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
db20: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c  ions.** in the l
db30: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
db40: 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63  nt windowInitAcc
db50: 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  um(Parse *pParse
db60: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29  , Window *pMWin)
db70: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
db80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
db90: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41  rse);.  int regA
dba0: 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d  rg;.  int nArg =
dbb0: 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57   0;.  Window *pW
dbc0: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
dbd0: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
dbe0: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
dbf0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
dc00: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
dc10: 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nc;.    sqlite3V
dc20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dc30: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
dc40: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41  egAccum);.    nA
dc50: 72 67 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77  rg = MAX(nArg, w
dc60: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57  indowArgCount(pW
dc70: 69 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  in));.    if( pM
dc80: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
dc90: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  id==0 ){.      i
dca0: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
dcb0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c  =nth_valueName |
dcc0: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
dcd0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20  first_valueName 
dce0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dcf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dd00: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
dd10: 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20  Win->regApp);.  
dd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
dd40: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
dd50: 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 20  regApp+1);.     
dd60: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70   }..      if( (p
dd70: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
dd80: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
dd90: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
dda0: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 20  srApp ){.       
ddb0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65   assert( pWin->e
ddc0: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
ddd0: 44 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 73  DED );.        s
dde0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ddf0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
de00: 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  er, pWin->csrApp
de10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
de20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
de30: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
de40: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
de50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
de60: 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50 61  }.  regArg = pPa
de70: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70  rse->nMem+1;.  p
de80: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
de90: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  Arg;.  return re
dea0: 67 41 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  gArg;.}../* .** 
deb0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
dec0: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
ded0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65   should be cache
dee0: 64 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  d in the ephemer
def0: 61 6c 20 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65  al table,.** eve
df00: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
df10: 6f 20 78 49 6e 76 65 72 73 65 28 29 20 63 61 6c  o xInverse() cal
df20: 6c 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  ls required..*/.
df30: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
df40: 77 43 61 63 68 65 46 72 61 6d 65 28 57 69 6e 64  wCacheFrame(Wind
df50: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69  ow *pMWin){.  Wi
df60: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 66  ndow *pWin;.  if
df70: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
df80: 74 52 6f 77 69 64 20 29 20 72 65 74 75 72 6e 20  tRowid ) return 
df90: 31 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  1;.  for(pWin=pM
dfa0: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
dfb0: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
dfc0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46  .    FuncDef *pF
dfd0: 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e  unc = pWin->pFun
dfe0: 63 3b 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e  c;.    if( (pFun
dff0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
e000: 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c  lueName).     ||
e010: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
e020: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29  first_valueName)
e030: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
e040: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
e050: 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63  ).     || (pFunc
e060: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65  ->zName==lagName
e070: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
e080: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
e090: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e0a0: 0a 0a 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61  ../*.** regOld a
e0b0: 6e 64 20 72 65 67 4e 65 77 20 61 72 65 20 65 61  nd regNew are ea
e0c0: 63 68 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ch the first reg
e0d0: 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61  ister in an arra
e0e0: 79 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72  y of size.** pOr
e0f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68  derBy->nExpr. Th
e100: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
e110: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 63 6f  rates code to co
e120: 6d 70 61 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a  mpare the two.**
e130: 20 61 72 72 61 79 73 20 6f 66 20 72 65 67 69 73   arrays of regis
e140: 74 65 72 73 20 75 73 69 6e 67 20 74 68 65 20 63  ters using the c
e150: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e160: 65 73 20 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d  es and other com
e170: 70 61 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d  parison.** param
e180: 65 74 65 72 73 20 73 70 65 63 69 66 69 65 64 20  eters specified 
e190: 62 79 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a  by pOrderBy. .**
e1a0: 0a 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20 61  .** If the two a
e1b0: 72 72 61 79 73 20 61 72 65 20 6e 6f 74 20 65 71  rrays are not eq
e1c0: 75 61 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ual, the content
e1d0: 73 20 6f 66 20 72 65 67 4e 65 77 20 69 73 20 63  s of regNew is c
e1e0: 6f 70 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67  opied to .** reg
e1f0: 4f 6c 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  Old and control 
e200: 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f  falls through. O
e210: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
e220: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
e230: 20 61 72 72 61 79 73 0a 2a 2a 20 61 72 65 20 65   arrays.** are e
e240: 71 75 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f  qual, an OP_Goto
e250: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 54 68   is executed. Th
e260: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
e270: 20 4f 50 5f 47 6f 74 6f 20 69 73 20 72 65 74 75   OP_Goto is retu
e280: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
e290: 76 6f 69 64 20 77 69 6e 64 6f 77 49 66 4e 65 77  void windowIfNew
e2a0: 50 65 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Peer(.  Parse *p
e2b0: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
e2c0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69  t *pOrderBy,.  i
e2d0: 6e 74 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20  nt regNew,      
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e2f0: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
e300: 20 6f 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a   of new values *
e310: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 2c 20  /.  int regOld, 
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
e340: 61 72 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c  array of old val
e350: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ues */.  int add
e360: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
e370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
e380: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
e390: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
e3a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e3b0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
e3c0: 7b 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d  {.    int nVal =
e3d0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
e3e0: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
e3f0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
e400: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
e410: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
e420: 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
e430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e440: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
e450: 65 2c 20 72 65 67 4f 6c 64 2c 20 72 65 67 4e 65  e, regOld, regNe
e460: 77 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 73 71  w, nVal);.    sq
e470: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
e480: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
e490: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
e4a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e4b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
e4c0: 75 6d 70 2c 20 0a 20 20 20 20 20 20 73 71 6c 69  ump, .      sqli
e4d0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e4e0: 64 72 28 76 29 2b 31 2c 20 61 64 64 72 2c 20 73  dr(v)+1, addr, s
e4f0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e500: 74 41 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29  tAddr(v)+1.    )
e510: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
e520: 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73  geEqNe(v);.    s
e530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e540: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
e550: 4e 65 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61  New, regOld, nVa
e560: 6c 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l-1);.  }else{. 
e570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e580: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
e590: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d   0, addr);.  }.}
e5a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e5b0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
e5c0: 61 73 20 70 61 72 74 20 6f 66 20 67 65 6e 65 72  as part of gener
e5d0: 61 74 69 6e 67 20 56 4d 20 70 72 6f 67 72 61 6d  ating VM program
e5e0: 73 20 66 6f 72 20 52 41 4e 47 45 0a 2a 2a 20 6f  s for RANGE.** o
e5f0: 66 66 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f  ffset PRECEDING/
e600: 46 4f 4c 4c 4f 57 49 4e 47 20 66 72 61 6d 65 20  FOLLOWING frame 
e610: 62 6f 75 6e 64 61 72 69 65 73 2e 20 41 73 73 75  boundaries. Assu
e620: 6d 69 6e 67 20 22 41 53 43 22 20 6f 72 64 65 72  ming "ASC" order
e630: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 4f 52 44 45   for.** the ORDE
e640: 52 20 42 59 20 74 65 72 6d 20 69 6e 20 74 68 65  R BY term in the
e650: 20 77 69 6e 64 6f 77 2c 20 69 74 20 67 65 6e 65   window, it gene
e660: 72 61 74 65 73 20 63 6f 64 65 20 65 71 75 69 76  rates code equiv
e670: 61 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  alent to:.**.** 
e680: 20 20 69 66 28 20 63 73 72 31 2e 70 65 65 72 56    if( csr1.peerV
e690: 61 6c 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63  al + regVal >= c
e6a0: 73 72 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f  sr2.peerVal ) go
e6b0: 74 6f 20 6c 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20  to lbl;.**.** A 
e6c0: 73 70 65 63 69 61 6c 20 74 79 70 65 20 6f 66 20  special type of 
e6d0: 61 72 69 74 68 6d 65 74 69 63 20 69 73 20 75 73  arithmetic is us
e6e0: 65 64 20 73 75 63 68 20 74 68 61 74 20 69 66 20  ed such that if 
e6f0: 63 73 72 2e 70 65 65 72 56 61 6c 20 69 73 20 6e  csr.peerVal is n
e700: 6f 74 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20  ot.** a numeric 
e710: 74 79 70 65 20 28 72 65 61 6c 20 6f 72 20 69 6e  type (real or in
e720: 74 65 67 65 72 29 2c 20 74 68 65 6e 20 74 68 65  teger), then the
e730: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61   result of the a
e740: 64 64 69 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  ddition is.** a 
e750: 63 6f 70 79 20 6f 66 20 63 73 72 31 2e 70 65 65  copy of csr1.pee
e760: 72 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rVal..*/.static 
e770: 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52  void windowCodeR
e780: 61 6e 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64  angeTest(.  Wind
e790: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20  owCodeArg *p, . 
e7a0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50    /* OP_Ge or OP
e7d0: 5f 47 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  _Gt */.  int csr
e7e0: 31 2c 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c  1, .  int regVal
e7f0: 2c 20 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20  , .  int csr2,. 
e800: 20 69 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61   int lbl.){.  Pa
e810: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
e820: 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
e830: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
e840: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
e850: 6e 74 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65  nt reg1 = sqlite
e860: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
e870: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20  se);.  int reg2 
e880: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e890: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
e8a0: 6e 74 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64  nt arith = OP_Ad
e8b0: 64 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 65 3b  d;.  int addrGe;
e8c0: 0a 0a 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e  ..  int regStrin
e8d0: 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
e8e0: 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f  em;..  assert( o
e8f0: 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d  p==OP_Ge || op==
e900: 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  OP_Gt || op==OP_
e910: 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
e920: 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  p->pMWin->pOrder
e930: 42 79 20 26 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e  By && p->pMWin->
e940: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
e950: 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =1 );.  if( p->p
e960: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  MWin->pOrderBy->
e970: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[0].sortOrder )
e980: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  {.    switch( op
e990: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
e9a0: 50 5f 47 65 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65  P_Ge: op = OP_Le
e9b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
e9c0: 61 73 65 20 4f 50 5f 47 74 3a 20 6f 70 20 3d 20  ase OP_Gt: op = 
e9d0: 4f 50 5f 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20  OP_Lt; break;.  
e9e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
e9f0: 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  ert( op==OP_Le )
ea00: 3b 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 62 72  ; op = OP_Ge; br
ea10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
ea20: 72 69 74 68 20 3d 20 4f 50 5f 53 75 62 74 72 61  rith = OP_Subtra
ea30: 63 74 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f  ct;.  }..  windo
ea40: 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28  wReadPeerValues(
ea50: 70 2c 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a  p, csr1, reg1);.
ea60: 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72    windowReadPeer
ea70: 56 61 6c 75 65 73 28 70 2c 20 63 73 72 32 2c 20  Values(p, csr2, 
ea80: 72 65 67 32 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  reg2);..  /* Che
ea90: 63 6b 20 69 66 20 74 68 65 20 70 65 65 72 20 76  ck if the peer v
eaa0: 61 6c 75 65 20 66 6f 72 20 63 73 72 31 20 76 61  alue for csr1 va
eab0: 6c 75 65 20 69 73 20 61 20 74 65 78 74 20 6f 72  lue is a text or
eac0: 20 62 6c 6f 62 20 62 79 20 63 6f 6d 70 61 72 69   blob by compari
ead0: 6e 67 0a 20 20 2a 2a 20 69 74 20 74 6f 20 74 68  ng.  ** it to th
eae0: 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  e smallest possi
eaf0: 62 6c 65 20 73 74 72 69 6e 67 20 2d 20 27 27 2e  ble string - ''.
eb00: 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
eb10: 6f 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 4f 50  over the.  ** OP
eb20: 5f 41 64 64 20 6f 72 20 4f 50 5f 53 75 62 74 72  _Add or OP_Subtr
eb30: 61 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  act operation an
eb40: 64 20 70 72 6f 63 65 65 64 20 64 69 72 65 63 74  d proceed direct
eb50: 6c 79 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ly to the compar
eb60: 69 73 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ison. */.  sqlit
eb70: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
eb80: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72  OP_String8, 0, r
eb90: 65 67 53 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c  egString, 0, "",
eba0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 61   P4_STATIC);.  a
ebb0: 64 64 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56  ddrGe = sqlite3V
ebc0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ebd0: 47 65 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30  Ge, regString, 0
ebe0: 2c 20 72 65 67 31 29 3b 0a 20 20 56 64 62 65 43  , reg1);.  VdbeC
ebf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
ec00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ec10: 76 2c 20 61 72 69 74 68 2c 20 72 65 67 56 61 6c  v, arith, regVal
ec20: 2c 20 72 65 67 31 2c 20 72 65 67 31 29 3b 0a 20  , reg1, reg1);. 
ec30: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ec40: 48 65 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b  Here(v, addrGe);
ec50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ec60: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 32  dOp3(v, op, reg2
ec70: 2c 20 6c 62 6c 2c 20 72 65 67 31 29 3b 0a 20 20  , lbl, reg1);.  
ec80: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ec90: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
eca0: 4c 4c 45 51 29 3b 0a 20 20 56 64 62 65 43 6f 76  LLEQ);.  VdbeCov
ecb0: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 73 71 6c  erage(v);..  sql
ecc0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ecd0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 31 29  eg(pParse, reg1)
ece0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
ecf0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ed00: 2c 20 72 65 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , reg2);.}../*.*
ed10: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
ed20: 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 57 69 6e  n for sqlite3Win
ed30: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 20 45  dowCodeStep(). E
ed40: 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
ed50: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e   function.** gen
ed60: 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20 66  erates VM code f
ed70: 6f 72 20 61 20 73 69 6e 67 6c 65 20 52 45 54 55  or a single RETU
ed80: 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20  RN_ROW, AGGSTEP 
ed90: 6f 72 20 41 47 47 49 4e 56 45 52 53 45 20 0a 2a  or AGGINVERSE .*
eda0: 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 52 65 66  * operation. Ref
edb0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 65 72  er to the header
edc0: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 73 71 6c   comment for sql
edd0: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
ede0: 65 70 28 29 20 66 6f 72 0a 2a 2a 20 64 65 74 61  ep() for.** deta
edf0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
ee00: 6e 74 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28  nt windowCodeOp(
ee10: 0a 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20  . WindowCodeArg 
ee20: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ee30: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62     /* Context ob
ee40: 6a 65 63 74 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c  ject */. int op,
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 4e            /* WIN
ee70: 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
ee80: 41 47 47 53 54 45 50 20 6f 72 20 41 47 47 49 4e  AGGSTEP or AGGIN
ee90: 56 45 52 53 45 20 2a 2f 0a 20 69 6e 74 20 72 65  VERSE */. int re
eea0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 20 20 20 20  gCountdown,     
eeb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
eec0: 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 49 66  gister for OP_If
eed0: 50 6f 73 20 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f  Pos countdown */
eee0: 0a 20 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 20  . int jumpOnEof 
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
ef10: 69 66 20 73 74 65 70 70 65 64 20 63 75 72 73 6f  if stepped curso
ef20: 72 20 72 65 61 63 68 65 73 20 45 4f 46 20 2a 2f  r reaches EOF */
ef30: 0a 29 7b 0a 20 20 69 6e 74 20 63 73 72 2c 20 72  .){.  int csr, r
ef40: 65 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eg;.  Parse *pPa
ef50: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
ef60: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
ef70: 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69   = p->pMWin;.  i
ef80: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 56 64  nt ret = 0;.  Vd
ef90: 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65  be *v = p->pVdbe
efa0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d  ;.  int addrIf =
efb0: 20 30 3b 20 0a 20 20 69 6e 74 20 61 64 64 72 43   0; .  int addrC
efc0: 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69  ontinue = 0;.  i
efd0: 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b  nt addrGoto = 0;
efe0: 0a 20 20 69 6e 74 20 62 50 65 65 72 20 3d 20 28  .  int bPeer = (
eff0: 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b  pMWin->eType!=TK
f000: 5f 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74 20 6c  _ROWS);..  int l
f010: 62 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33  blDone = sqlite3
f020: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
f030: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 64 64  arse);.  int add
f040: 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 30 3b 0a  rNextRange = 0;.
f050: 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
f060: 73 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47 47 49  se - WINDOW_AGGI
f070: 4e 56 45 52 53 45 20 69 73 20 61 6c 77 61 79 73  NVERSE is always
f080: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
f090: 66 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61 72 74  frame.  ** start
f0a0: 73 20 77 69 74 68 20 55 4e 42 4f 55 4e 44 45 44  s with UNBOUNDED
f0b0: 20 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f 0a 20   PRECEDING. */. 
f0c0: 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f   if( op==WINDOW_
f0d0: 41 47 47 49 4e 56 45 52 53 45 20 26 26 20 70 4d  AGGINVERSE && pM
f0e0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f0f0: 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
f100: 20 61 73 73 65 72 74 28 20 72 65 67 43 6f 75 6e   assert( regCoun
f110: 74 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75 6d 70  tdown==0 && jump
f120: 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20  OnEof==0 );.    
f130: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
f140: 20 69 66 28 20 72 65 67 43 6f 75 6e 74 64 6f 77   if( regCountdow
f150: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n>0 ){.    if( p
f160: 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f  MWin->eType==TK_
f170: 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 61  RANGE ){.      a
f180: 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 73  ddrNextRange = s
f190: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f1a0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
f1b0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44  assert( op==WIND
f1c0: 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 7c 7c  OW_AGGINVERSE ||
f1d0: 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 53   op==WINDOW_AGGS
f1e0: 54 45 50 20 29 3b 0a 20 20 20 20 20 20 69 66 28  TEP );.      if(
f1f0: 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49   op==WINDOW_AGGI
f200: 4e 56 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20  NVERSE ){.      
f210: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
f220: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
f230: 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  G ){.          w
f240: 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65  indowCodeRangeTe
f250: 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
f260: 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d 3e 63    p, OP_Le, p->c
f270: 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 43  urrent.csr, regC
f280: 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73 74 61  ountdown, p->sta
f290: 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a  rt.csr, lblDone.
f2a0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
f2b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f2c0: 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
f2d0: 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20  RangeTest(.     
f2e0: 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47           p, OP_G
f2f0: 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c  e, p->start.csr,
f300: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70   regCountdown, p
f310: 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c  ->current.csr, l
f320: 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  blDone.         
f330: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
f340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f350: 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e     windowCodeRan
f360: 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20 20  geTest(.        
f370: 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c 20 70 2d      p, OP_Gt, p-
f380: 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67 43 6f 75  >end.csr, regCou
f390: 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72 72 65  ntdown, p->curre
f3a0: 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a  nt.csr, lblDone.
f3b0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f3c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
f3d0: 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c      addrIf = sql
f3e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f3f0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43  , OP_IfPos, regC
f400: 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31 29 3b  ountdown, 0, 1);
f410: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
f420: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
f430: 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e  }..  if( op==WIN
f440: 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 26  DOW_RETURN_ROW &
f450: 26 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  & pMWin->regStar
f460: 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20  tRowid==0 ){.   
f470: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
f480: 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 64 64  p, 0);.  }.  add
f490: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
f4a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f4b0: 64 72 28 76 29 3b 0a 20 20 73 77 69 74 63 68 28  dr(v);.  switch(
f4c0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
f4d0: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
f4e0: 57 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70  W:.      csr = p
f4f0: 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 3b 0a 20  ->current.csr;. 
f500: 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 63 75       reg = p->cu
f510: 72 72 65 6e 74 2e 72 65 67 3b 0a 20 20 20 20 20  rrent.reg;.     
f520: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
f530: 52 6f 77 28 70 29 3b 0a 20 20 20 20 20 20 62 72  Row(p);.      br
f540: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 57  eak;..    case W
f550: 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
f560: 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d  :.      csr = p-
f570: 3e 73 74 61 72 74 2e 63 73 72 3b 0a 20 20 20 20  >start.csr;.    
f580: 20 20 72 65 67 20 3d 20 70 2d 3e 73 74 61 72 74    reg = p->start
f590: 2e 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  .reg;.      if( 
f5a0: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
f5b0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
f5c0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 72  assert( pMWin->r
f5d0: 65 67 45 6e 64 52 6f 77 69 64 20 29 3b 0a 20 20  egEndRowid );.  
f5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f5f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
f600: 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  dImm, pMWin->reg
f610: 53 74 61 72 74 52 6f 77 69 64 2c 20 31 29 3b 0a  StartRowid, 1);.
f620: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f630: 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74       windowAggSt
f640: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
f650: 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e 72 65 67  , csr, 1, p->reg
f660: 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Arg);.      }.  
f670: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
f680: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
f690: 73 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44 4f  ssert( op==WINDO
f6a0: 57 5f 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20  W_AGGSTEP );.   
f6b0: 20 20 20 63 73 72 20 3d 20 70 2d 3e 65 6e 64 2e     csr = p->end.
f6c0: 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d  csr;.      reg =
f6d0: 20 70 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20 20 20   p->end.reg;.   
f6e0: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65     if( pMWin->re
f6f0: 67 53 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20  gStartRowid ){. 
f700: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f710: 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69  MWin->regEndRowi
f720: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
f730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f740: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57  , OP_AddImm, pMW
f750: 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 2c  in->regEndRowid,
f760: 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
f770: 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  {.        window
f780: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
f790: 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30 2c 20 70  pMWin, csr, 0, p
f7a0: 2d 3e 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20  ->regArg);.     
f7b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f7c0: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 70    }..  if( op==p
f7d0: 2d 3e 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->eDelete ){.   
f7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f7f0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
f800: 20 63 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74   csr);.    sqlit
f810: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
f820: 2c 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  , OPFLAG_SAVEPOS
f830: 49 54 49 4f 4e 29 3b 0a 20 20 7d 0a 0a 20 20 69  ITION);.  }..  i
f840: 66 28 20 6a 75 6d 70 4f 6e 45 6f 66 20 29 7b 0a  f( jumpOnEof ){.
f850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f860: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
f870: 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64  , csr, sqlite3Vd
f880: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f890: 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  +2);.    VdbeCov
f8a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 72 65  erage(v);.    re
f8b0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
f8c0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
f8d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f8e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8f0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
f900: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
f910: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2b 62  rrentAddr(v)+1+b
f920: 50 65 65 72 29 3b 0a 20 20 20 20 56 64 62 65 43  Peer);.    VdbeC
f930: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f940: 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20  if( bPeer ){.   
f950: 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71     addrGoto = sq
f960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
f970: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
f980: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50   }.  }..  if( bP
f990: 65 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  eer ){.    int n
f9a0: 52 65 67 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f  Reg = (pMWin->pO
f9b0: 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e  rderBy ? pMWin->
f9c0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
f9d0: 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 65  : 0);.    int re
f9e0: 67 54 6d 70 20 3d 20 28 6e 52 65 67 20 3f 20 73  gTmp = (nReg ? s
f9f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
fa00: 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 67 29  ge(pParse, nReg)
fa10: 20 3a 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f   : 0);.    windo
fa20: 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28  wReadPeerValues(
fa30: 70 2c 20 63 73 72 2c 20 72 65 67 54 6d 70 29 3b  p, csr, regTmp);
fa40: 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65 77  .    windowIfNew
fa50: 50 65 65 72 28 70 50 61 72 73 65 2c 20 70 4d 57  Peer(pParse, pMW
fa60: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  in->pOrderBy, re
fa70: 67 54 6d 70 2c 20 72 65 67 2c 20 61 64 64 72 43  gTmp, reg, addrC
fa80: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
fa90: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
faa0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
fab0: 67 54 6d 70 2c 20 6e 52 65 67 29 3b 0a 20 20 7d  gTmp, nReg);.  }
fac0: 0a 0a 20 20 69 66 28 20 61 64 64 72 4e 65 78 74  ..  if( addrNext
fad0: 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  Range ){.    sql
fae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
faf0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
fb00: 64 72 4e 65 78 74 52 61 6e 67 65 29 3b 0a 20 20  drNextRange);.  
fb10: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
fb20: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
fb30: 62 6c 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 61  blDone);.  if( a
fb40: 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69 74 65  ddrGoto ) sqlite
fb50: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fb60: 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20 69 66   addrGoto);.  if
fb70: 28 20 61 64 64 72 49 66 20 29 20 73 71 6c 69 74  ( addrIf ) sqlit
fb80: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
fb90: 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 72 65 74  , addrIf);.  ret
fba0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn ret;.}.../*.
fbb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
fbc0: 72 65 74 75 72 6e 20 61 20 64 75 70 6c 69 63 61  return a duplica
fbd0: 74 65 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77  te of the Window
fbe0: 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65   object indicate
fbf0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 74 68 69 72  d by the.** thir
fc00: 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 65 74 20  d argument. Set 
fc10: 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f 77 6e 65  the Window.pOwne
fc20: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e  r field of the n
fc30: 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  ew object to.** 
fc40: 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e 64 6f  pOwner..*/.Windo
fc50: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
fc60: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
fc70: 20 45 78 70 72 20 2a 70 4f 77 6e 65 72 2c 20 57   Expr *pOwner, W
fc80: 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e  indow *p){.  Win
fc90: 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  dow *pNew = 0;. 
fca0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 29 20 29   if( ALWAYS(p) )
fcb0: 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  {.    pNew = sql
fcc0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
fcd0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  (db, sizeof(Wind
fce0: 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ow));.    if( pN
fcf0: 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ew ){.      pNew
fd00: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
fd10: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d  3DbStrDup(db, p-
fd20: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
fd30: 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73  New->pFilter = s
fd40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
fd50: 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29  , p->pFilter, 0)
fd60: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46  ;.      pNew->pF
fd70: 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e 63 3b 0a  unc = p->pFunc;.
fd80: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72        pNew->pPar
fd90: 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  tition = sqlite3
fda0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
fdb0: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30  p->pPartition, 0
fdc0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
fdd0: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
fde0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
fdf0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29   p->pOrderBy, 0)
fe00: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 54  ;.      pNew->eT
fe10: 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a  ype = p->eType;.
fe20: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e 64        pNew->eEnd
fe30: 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20   = p->eEnd;.    
fe40: 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74 20 3d    pNew->eStart =
fe50: 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20   p->eStart;.    
fe60: 20 20 70 4e 65 77 2d 3e 65 45 78 63 6c 75 64 65    pNew->eExclude
fe70: 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64 65 3b 0a   = p->eExclude;.
fe80: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 74 61        pNew->pSta
fe90: 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rt = sqlite3Expr
fea0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 74 61 72  Dup(db, p->pStar
feb0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
fec0: 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  w->pEnd = sqlite
fed0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
fee0: 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  pEnd, 0);.      
fef0: 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pNew->pOwner = p
ff00: 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Owner;.    }.  }
ff10: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
ff20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ff30: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 69  a copy of the li
ff40: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69 6e  nked list of Win
ff50: 64 6f 77 20 6f 62 6a 65 63 74 73 20 70 61 73 73  dow objects pass
ff60: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63  ed as the.** sec
ff70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
ff80: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
ff90: 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 73 71  WindowListDup(sq
ffa0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
ffb0: 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  w *p){.  Window 
ffc0: 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20  *pWin;.  Window 
ffd0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 57 69 6e  *pRet = 0;.  Win
ffe0: 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  dow **pp = &pRet
fff0: 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 3b  ;..  for(pWin=p;
10000 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
10010 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
10020 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 57 69   *pp = sqlite3Wi
10030 6e 64 6f 77 44 75 70 28 64 62 2c 20 30 2c 20 70  ndowDup(db, 0, p
10040 57 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  Win);.    if( *p
10050 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
10060 20 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e    pp = &((*pp)->
10070 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a  pNextWin);.  }..
10080 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
10090 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57  ../*.** sqlite3W
100a0 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73 20  hereBegin() has 
100b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
100c0 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c 45  led for the SELE
100d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
100e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
100f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77  econd argument w
10100 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
10110 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74  n is invoked. It
10120 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f   generates.** co
10130 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  de to populate t
10140 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73  he Window.regRes
10150 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  ult register for
10160 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
10170 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69 6e  ction .** and in
10180 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75  voke the sub-rou
10190 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63 74  tine at instruct
101a0 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f 6e  ion addrGosub on
101b0 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2e  ce for each row.
101c0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
101d0 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73 20  End() is always 
101e0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
101f0 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a 20  turning. .**.** 
10200 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  This function ha
10210 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64 69  ndles several di
10220 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
10230 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20   window frames, 
10240 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72 65  which.** require
10250 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
10260 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ent processing. 
10270 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73  The following ps
10280 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a 20  eudo code is.** 
10290 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
102a0 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20  t window frames 
102b0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
102c0 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
102d0 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44  N <expr1> PRECED
102e0 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
102f0 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
10300 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72 61  Other window fra
10310 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61 72  me types use var
10320 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 6c  iants of the fol
10330 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
10340 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74    ... loop start
10350 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
10360 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a  reBegin() ....**
10370 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
10380 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
10390 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
103a0 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  sh.**       }.**
103b0 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
103c0 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
103d0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 0a  able..**       .
103e0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
103f0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
10400 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
10410 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72 65    // Rewind thre
10420 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20 6f  e cursors, all o
10430 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20 74  pen on the eph t
10440 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
10450 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 3b   Rewind(csrEnd);
10460 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
10470 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a 2a  nd(csrStart);.**
10480 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
10490 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a 20  csrCurrent);.** 
104a0 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20 20        .**       
104b0 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
104c0 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46  2>          // F
104d0 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73  OLLOWING express
104e0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  ion.**         r
104f0 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
10500 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45 43  >        // PREC
10510 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  EDING expression
10520 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
10530 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 46  .**         // F
10540 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 62  irst time this b
10550 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c 20  ranch is taken, 
10560 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63 6f  the eph table co
10570 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20 20  ntains two .**  
10580 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e 20         // rows. 
10590 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e  The first row in
105a0 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c 20   the partition, 
105b0 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65 20  which all three 
105c0 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20  cursors.**      
105d0 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79 20     // currently 
105e0 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74 68  point to, and th
105f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77 2e  e following row.
10600 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
10610 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  TEP.**         i
10620 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
10630 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
10640 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
10650 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
10660 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
10670 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41  **             A
10680 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
10690 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
106a0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
106b0 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
106c0 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20   flush:.**      
106d0 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
106e0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
106f0 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 20           RETURN 
10700 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ROW.**         i
10710 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69 73  f( csrCurrent is
10720 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a 2a   EOF ) break;.**
10730 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
10740 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
10750 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
10760 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72 74  Inverse(csrStart
10770 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  ).**           N
10780 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
10790 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
107a0 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20      }.**.** The 
107b0 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f 76  pseudo-code abov
107c0 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c 6f  e uses the follo
107d0 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a 0a  wing shorthand:.
107e0 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50 3a  **.**   AGGSTEP:
107f0 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20 61      invoke the a
10800 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28 29  ggregate xStep()
10810 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
10820 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
10830 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  on.**           
10840 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65 6e      with argumen
10850 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ts read from the
10860 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
10870 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20 74  cursor csrEnd, t
10880 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hen.**          
10890 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f 72       step cursor
108a0 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64 20   csrEnd forward 
108b0 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73 71  one row (i.e. sq
108c0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
108d0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55 52  )..**.**   RETUR
108e0 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61 20  N_ROW: return a 
108f0 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  row to the calle
10900 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  r based on the c
10910 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
10920 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10930 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
10940 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20 74  csrCurrent and t
10950 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
10960 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 20   of all .**     
10970 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65 67            aggreg
10980 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70 20  ates. Then step 
10990 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65 6e  cursor csrCurren
109a0 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f  t forward one ro
109b0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49 4e  w..**.**   AGGIN
109c0 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74 68  VERSE: invoke th
109d0 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e 76  e aggregate xInv
109e0 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  erse() function 
109f0 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
10a00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10a10 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68    functions with
10a20 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64 20   arguments read 
10a30 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
10a40 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a 2a   row of cursor.*
10a50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10a60 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20 73  csrStart. Then s
10a70 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f 72  tep csrStart for
10a80 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a  ward one row..**
10a90 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77  .** There are tw
10aa0 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69 6e  o other ROWS win
10ab0 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74 20  dow frames that 
10ac0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67 6e  are handled sign
10ad0 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69 66  ificantly.** dif
10ae0 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
10af0 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57 45  e above - "BETWE
10b00 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  EN <expr> PRECED
10b10 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20 50  ING AND <expr> P
10b20 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e 64  RECEDING".** and
10b30 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e   "BETWEEN <expr>
10b40 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c   FOLLOWING AND <
10b50 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  expr> FOLLOWING"
10b60 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65 63  . These are spec
10b70 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62 65  ial .** cases be
10b80 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e 67  cause they chang
10b90 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  e the order in w
10ba0 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20 63  hich the three c
10bb0 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72 74  ursors (csrStart
10bc0 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74 20  ,.** csrCurrent 
10bd0 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65 72  and csrEnd) iter
10be0 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
10bf0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
10c00 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 75   Cases that.** u
10c10 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20  se UNBOUNDED or 
10c20 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65 20  CURRENT ROW are 
10c30 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61 72  much simpler var
10c40 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20 6f  iations on one o
10c50 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65 65  f these.** three
10c60 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42  ..**.**   ROWS B
10c70 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
10c80 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
10c90 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a  pr2> PRECEDING.*
10ca0 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f  *.**     ... loo
10cb0 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c  p started by sql
10cc0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10cd0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
10ce0 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
10cf0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
10d00 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
10d10 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e     }.**       In
10d20 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
10d30 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
10d40 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
10d50 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
10d60 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52   ){.**         R
10d70 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20  ewind(csrEnd) ; 
10d80 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
10d90 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72   ; Rewind(csrCur
10da0 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  rent).**        
10db0 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
10dc0 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67  >.**         reg
10dd0 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a  Start = <expr1>.
10de0 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  **       }else{.
10df0 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28  **         if( (
10e00 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
10e10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
10e20 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
10e30 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  }.**         RET
10e40 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
10e50 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
10e60 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
10e70 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
10e80 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  E.**         }.*
10e90 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
10ea0 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
10eb0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72  .**       if( (r
10ec0 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  egEnd--)<=0 ){.*
10ed0 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45  *         AGGSTE
10ee0 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  P.**       }.** 
10ef0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
10f00 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  .**.**.**   ROWS
10f10 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
10f20 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c   FOLLOWING AND <
10f30 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
10f40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
10f50 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
10f60 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10f70 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66  () ....**     if
10f80 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
10f90 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  ){.**       Gosu
10fa0 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 7d  b flush.**     }
10fb0 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20 6e  .**     Insert n
10fc0 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
10fd0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69 66  table..**     if
10fe0 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
10ff0 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
11000 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45       Rewind(csrE
11010 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  nd) ; Rewind(csr
11020 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28  Start) ; Rewind(
11030 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20  csrCurrent).**  
11040 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
11050 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 72  xpr2>.**       r
11060 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e 64  egStart = regEnd
11070 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   - <expr1>.**   
11080 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
11090 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
110a0 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
110b0 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
110c0 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
110d0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
110e0 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
110f0 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11100 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
11110 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
11120 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
11130 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
11140 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
11150 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
11160 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c   if( (regEnd--)<
11170 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
11180 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
11190 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
111a0 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20   break;.**      
111b0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20   }.**       if( 
111c0 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
111d0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  ){.**         AG
111e0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
111f0 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62 72      if( eof ) br
11200 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  eak.**       }.*
11210 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77  *     }.**     w
11220 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75  hile( !eof csrCu
11230 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20  rrent ){.**     
11240 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
11250 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72 20      }.**.** For 
11260 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20 74  the most part, t
11270 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f 76  he patterns abov
11280 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74 6f  e are adapted to
11290 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e 44   support UNBOUND
112a0 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69 6e  ED by.** assumin
112b0 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  g that it is equ
112c0 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66 69  ivalent to "infi
112d0 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f 46  nity PRECEDING/F
112e0 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a 2a  OLLOWING" and.**
112f0 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79 20   CURRENT ROW by 
11300 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 74  assuming that it
11310 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20 74   is equivilent t
11320 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f 46  o "0 PRECEDING/F
11330 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54 68  OLLOWING"..** Th
11340 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  is is optimized 
11350 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61 6e  of course - bran
11360 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ches that will n
11370 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61 6e  ever be taken an
11380 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
11390 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20  that are always 
113a0 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65 64  true are omitted
113b0 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f 64   from the VM cod
113c0 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20 65  e. The only.** e
113d0 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20  xceptional case 
113e0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  is:.**.**   ROWS
113f0 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
11400 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 55   FOLLOWING AND U
11410 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
11420 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  NG.**.**     ...
11430 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79   loop started by
11440 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
11450 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  in() ....**     
11460 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
11470 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f  n ){.**       Go
11480 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
11490 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74   }.**     Insert
114a0 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
114b0 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
114c0 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66  if( first row of
114d0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
114e0 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73         Rewind(cs
114f0 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63  rEnd) ; Rewind(c
11500 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e  srStart) ; Rewin
11510 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a  d(csrCurrent).**
11520 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
11530 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
11540 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
11550 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
11560 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c  }.**   }.**   fl
11570 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47 53  ush:.**     AGGS
11580 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65  TEP.**     while
11590 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
115a0 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
115b0 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
115c0 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
115d0 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
115e0 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20  ) break.**      
115f0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55   }.**       RETU
11600 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a  RN_ROW.**     }.
11610 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21 65  **     while( !e
11620 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29 7b  of csrCurrent ){
11630 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e  .**       RETURN
11640 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  _ROW.**     }.**
11650 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72 69  .** Also requiri
11660 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  ng special handl
11670 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73 65  ing are the case
11680 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  s:.**.**   ROWS 
11690 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
116a0 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
116b0 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
116c0 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
116d0 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57  N <expr1> FOLLOW
116e0 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
116f0 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
11700 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65 78  when (expr1 < ex
11710 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64 65  pr2). This is de
11720 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69 6d  tected at runtim
11730 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20 66  e, not by this f
11740 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20 68  unction..** To h
11750 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2c  andle this case,
11760 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65   the pseudo-code
11770 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63 74   programs depict
11780 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f 64  ed above are mod
11790 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74 6c  ified.** slightl
117a0 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  y to be:.**.**  
117b0 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
117c0 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
117d0 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
117e0 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61  *     if( new pa
117f0 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
11800 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
11810 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
11820 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
11830 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
11840 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20  *     if( first 
11850 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
11860 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65 77   ){.**       Rew
11870 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65  ind(csrEnd) ; Re
11880 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b  wind(csrStart) ;
11890 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65   Rewind(csrCurre
118a0 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65 67  nt).**       reg
118b0 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a  End = <expr2>.**
118c0 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
118d0 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
118e0 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c 20     if( regEnd < 
118f0 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20 20  regStart ){.**  
11900 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
11910 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 6c  W.**         del
11920 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63 6f  ete eph table co
11930 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 20  ntents.**       
11940 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20 20    continue.**   
11950 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e 2e      }.**     ...
11960 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 22  .**.** The new "
11970 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65 6d  continue" statem
11980 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ent in the above
11990 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e 65   jumps to the ne
119a0 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a 20  xt iteration.** 
119b0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
119c0 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61 72  p - the one star
119d0 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
119e0 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a 2a  ereBegin()..**.*
119f0 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47 52  * The various GR
11a00 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20 69  OUPS cases are i
11a10 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
11a20 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65 72   the same patter
11a30 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20 54  ns as.** ROWS. T
11a40 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d 6f  he VM code is mo
11a50 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79 20  dified slightly 
11a60 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  so that:.**.**  
11a70 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72 61   1. The else bra
11a80 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  nch in the main 
11a90 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61 6b  loop is only tak
11aa0 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a 75  en if the row ju
11ab0 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65 64  st.**      added
11ac0 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
11ad0 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 73  l table is the s
11ae0 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67 72  tart of a new gr
11af0 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20 20  oup. In.**      
11b00 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
11b10 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  becomes:.**.**  
11b20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20         ... loop 
11b30 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74  started by sqlit
11b40 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e  e3WhereBegin() .
11b50 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  ...**         if
11b60 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
11b70 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11b80 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
11b90 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
11ba0 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72      Insert new r
11bb0 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c  ow into eph tabl
11bc0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e..**         if
11bd0 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
11be0 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
11bf0 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
11c00 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64  csrEnd) ; Rewind
11c10 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77  (csrStart) ; Rew
11c20 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a  ind(csrCurrent).
11c30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67  **           reg
11c40 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a  End = <expr2>.**
11c50 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53 74             regSt
11c60 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a  art = <expr1>.**
11c70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
11c80 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b 0a  f( new group ){.
11c90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  **           ...
11ca0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a   .**         }.*
11cb0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  *       }.**.** 
11cc0 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66 20    2. Instead of 
11cd0 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69 6e  processing a sin
11ce0 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52 45  gle row, each RE
11cf0 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45  TURN_ROW, AGGSTE
11d00 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41 47  P or .**      AG
11d10 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70 72  GINVERSE step pr
11d20 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72 72  ocesses the curr
11d30 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ent row of the r
11d40 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20 61  elevant cursor a
11d50 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20 73  nd.**      all s
11d60 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20 62  ubsequent rows b
11d70 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
11d80 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a 2a  same group..**.*
11d90 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20 66  * RANGE window f
11da0 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74 74  rames are a litt
11db0 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67 61  le different aga
11dc0 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55 50  in. As for GROUP
11dd0 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  S, the .** main 
11de0 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 70  loop runs once p
11df0 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20 41  er group only. A
11e00 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41  nd RETURN_ROW, A
11e10 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49 4e  GGSTEP and AGGIN
11e20 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69 6e  VERSE.** deal in
11e30 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64 20   groups instead 
11e40 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72 20  of rows. As for 
11e50 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53 2c  ROWS and GROUPS,
11e60 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
11e70 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73 3a  .** basic cases:
11e80 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
11e90 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
11ea0 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
11eb0 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  pr2> FOLLOWING.*
11ec0 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f  *.**     ... loo
11ed0 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c  p started by sql
11ee0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
11ef0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
11f00 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
11f10 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
11f20 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
11f30 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e     }.**       In
11f40 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
11f50 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
11f60 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
11f70 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
11f80 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52   ){.**         R
11f90 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20  ewind(csrEnd) ; 
11fa0 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
11fb0 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72   ; Rewind(csrCur
11fc0 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  rent).**        
11fd0 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
11fe0 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67  >.**         reg
11ff0 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a  Start = <expr1>.
12000 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  **       }else{.
12010 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
12020 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68  EP.**         wh
12030 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74  ile( (csrCurrent
12040 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c  .key + regEnd) <
12050 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a   csrEnd.key ){.*
12060 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54 55  *           RETU
12070 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN_ROW.**       
12080 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
12090 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
120a0 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
120b0 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
120c0 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
120d0 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
120e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
120f0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12100 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a  }.**     flush:.
12110 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45 50  **       AGGSTEP
12120 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
12130 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20   1 ){.**        
12140 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20 20   RETURN ROW.**  
12150 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43 75         if( csrCu
12160 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20 62  rrent is EOF ) b
12170 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 20  reak;.**        
12180 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74 61     while( csrSta
12190 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72  rt.key + regStar
121a0 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e  t) < csrCurrent.
121b0 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
121c0 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45        AGGINVERSE
121d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  .**           }.
121e0 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
121f0 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 6e        }.**.** In
12200 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61 74   the above notat
12210 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20 6d  ion, "csr.key" m
12220 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  eans the current
12230 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52   value of the OR
12240 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72 65  DER BY .** expre
12250 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73 20  ssion (there is 
12260 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72 20  only ever 1 for 
12270 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73 65  a RANGE that use
12280 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  s an <expr> FOLL
12290 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78 70  OWING.** or <exp
122a0 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65 61  r PRECEDING) rea
122b0 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63 73  d from cursor cs
122c0 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45  r..**.**   RANGE
122d0 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
122e0 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
122f0 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
12300 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
12310 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
12320 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12330 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20  () ....**       
12340 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
12350 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
12360 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
12370 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
12380 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
12390 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
123a0 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73  *       if( firs
123b0 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69  t row of partiti
123c0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
123d0 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20   Rewind(csrEnd) 
123e0 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72  ; Rewind(csrStar
123f0 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43  t) ; Rewind(csrC
12400 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20  urrent).**      
12410 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
12420 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  r2>.**         r
12430 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
12440 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  >.**       }else
12450 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69  {.**         whi
12460 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20  le( (csrEnd.key 
12470 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72  + regEnd) <= csr
12480 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
12490 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 53  *           AGGS
124a0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  TEP.**         }
124b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
124c0 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN_ROW.**       
124d0 20 20 77 68 69 6c 65 28 20 28 63 73 72 53 74 61    while( (csrSta
124e0 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72  rt.key + regStar
124f0 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e  t) < csrCurrent.
12500 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
12510 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
12520 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12530 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
12540 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
12550 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
12560 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45  srEnd.key + regE
12570 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e  nd) <= csrCurren
12580 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
12590 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
125a0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
125b0 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a  RETURN_ROW.**.**
125c0 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
125d0 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49   <expr1> FOLLOWI
125e0 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46  NG AND <expr2> F
125f0 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
12600 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
12610 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
12620 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
12630 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
12640 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
12650 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
12660 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
12670 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
12680 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
12690 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
126a0 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66  if( first row of
126b0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
126c0 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
126d0 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64  csrEnd) ; Rewind
126e0 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77  (csrStart) ; Rew
126f0 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a  ind(csrCurrent).
12700 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 45 6e  **         regEn
12710 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20  d = <expr2>.**  
12720 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
12730 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
12740 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
12750 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
12760 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
12770 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b  csrCurrent.key +
12780 20 72 65 67 45 6e 64 29 20 3c 20 63 73 72 45 6e   regEnd) < csrEn
12790 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  d.key ){.**     
127a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73        while( (cs
127b0 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72  rCurrent.key + r
127c0 65 67 53 74 61 72 74 29 20 3e 20 63 73 72 53 74  egStart) > csrSt
127d0 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  art.key ){.**   
127e0 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
127f0 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
12800 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    }.**          
12810 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
12820 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12830 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
12840 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20      flush:.**   
12850 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
12860 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
12870 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c  .**         whil
12880 65 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b  e( (csrCurrent.k
12890 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20 3e  ey + regStart) >
128a0 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29 7b   csrStart.key ){
128b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
128c0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
128d0 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20        if( eof ) 
128e0 62 72 65 61 6b 20 22 77 68 69 6c 65 28 20 31 20  break "while( 1 
128f0 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20 20  )" loop..**     
12900 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
12910 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
12920 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
12930 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43  while( !eof csrC
12940 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20  urrent ){.**    
12950 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
12960 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
12970 20 54 68 65 20 74 65 78 74 20 61 62 6f 76 65 20   The text above 
12980 6c 65 61 76 65 73 20 6f 75 74 20 6d 61 6e 79 20  leaves out many 
12990 64 65 74 61 69 6c 73 2e 20 52 65 66 65 72 20 74  details. Refer t
129a0 6f 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 63  o the code and c
129b0 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f 77  omments.** below
129c0 20 66 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70   for a more comp
129d0 6c 65 74 65 20 70 69 63 74 75 72 65 2e 0a 2a 2f  lete picture..*/
129e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
129f0 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20 50  dowCodeStep(.  P
12a00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a20 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
12a30 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74 65       /* Rewritte
12a60 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
12a70 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  nt */.  WhereInf
12a80 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20  o *pWInfo,      
12a90 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
12aa0 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  xt returned by s
12ab0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12ac0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47  () */.  int regG
12ad0 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20 20  osub,           
12ae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12af0 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62  ter for OP_Gosub
12b00 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
12b10 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20  sub             
12b20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75        /* OP_Gosu
12b30 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72 6e  b here to return
12b40 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a   each row */.){.
12b50 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20    Window *pMWin 
12b60 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78 70  = p->pWin;.  Exp
12b70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
12b80 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
12b90 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  y;.  Vdbe *v = s
12ba0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12bb0 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 63 73 72  arse);.  int csr
12bc0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
12bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
12be0 6f 72 20 75 73 65 64 20 74 6f 20 77 72 69 74 65  or used to write
12bf0 20 74 6f 20 65 70 68 2e 20 74 61 62 6c 65 20 2a   to eph. table *
12c00 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e 70 75 74  /.  int csrInput
12c10 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
12c20 2e 69 43 75 72 73 6f 72 3b 20 20 20 20 20 2f 2a  .iCursor;     /*
12c30 20 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d 73   Cursor of sub-s
12c40 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  elect */.  int n
12c50 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d  Input = p->pSrc-
12c60 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
12c70 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
12c80 66 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64 20  f cols returned 
12c90 62 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20  by sub */.  int 
12ca0 69 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20  iInput;         
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
12cd0 61 74 65 20 74 68 72 6f 75 67 68 20 73 75 62 20  ate through sub 
12ce0 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  cols */.  int ad
12cf0 64 72 4e 65 3b 20 20 20 20 20 20 20 20 20 20 20  drNe;           
12d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
12d10 72 65 73 73 20 6f 66 20 4f 50 5f 4e 65 20 2a 2f  ress of OP_Ne */
12d20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
12d30 46 6c 75 73 68 3b 20 20 20 20 20 20 20 20 20 20  Flush;          
12d40 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12d50 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 66 6c 75   OP_Gosub to flu
12d60 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  sh: */.  int add
12d70 72 49 6e 74 65 67 65 72 3b 20 20 20 20 20 20 20  rInteger;       
12d80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12d90 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74 65 67 65  ess of OP_Intege
12da0 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  r */.  int addrE
12db0 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  mpty;           
12dc0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12dd0 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 69  s of OP_Rewind i
12de0 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e  n flush: */.  in
12df0 74 20 72 65 67 53 74 61 72 74 20 3d 20 30 3b 20  t regStart = 0; 
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e10 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e   Value of <expr>
12e20 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20   PRECEDING */.  
12e30 69 6e 74 20 72 65 67 45 6e 64 20 3d 20 30 3b 20  int regEnd = 0; 
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70  /* Value of <exp
12e60 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a  r> FOLLOWING */.
12e70 20 20 69 6e 74 20 72 65 67 4e 65 77 3b 20 20 20    int regNew;   
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
12ea0 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20  gisters holding 
12eb0 6e 65 77 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f  new input row */
12ec0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
12ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ee0 20 20 20 2f 2a 20 72 65 67 4e 65 77 20 61 72 72     /* regNew arr
12ef0 61 79 20 69 6e 20 72 65 63 6f 72 64 20 66 6f 72  ay in record for
12f00 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f  m */.  int regRo
12f10 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
12f20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
12f30 66 6f 72 20 72 65 67 52 65 63 6f 72 64 20 69 6e  for regRecord in
12f40 20 65 70 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20   eph table */.  
12f50 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d  int regNewPeer =
12f60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12f70 2f 2a 20 50 65 65 72 20 76 61 6c 75 65 73 20 66  /* Peer values f
12f80 6f 72 20 6e 65 77 20 72 6f 77 20 28 70 61 72 74  or new row (part
12f90 20 6f 66 20 72 65 67 4e 65 77 29 20 2a 2f 0a 20   of regNew) */. 
12fa0 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30   int regPeer = 0
12fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12fc0 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65 73 20   /* Peer values 
12fd0 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20  for current row 
12fe0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73  */.  int regFlus
12ff0 68 50 61 72 74 20 3d 20 30 3b 20 20 20 20 20 20  hPart = 0;      
13000 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13010 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73   for "Gosub flus
13020 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a  h_partition" */.
13030 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20    WindowCodeArg 
13040 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
13050 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a    /* Context obj
13060 65 63 74 20 66 6f 72 20 73 75 62 2d 72 6f 75 74  ect for sub-rout
13070 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 62  ines */.  int lb
13080 6c 57 68 65 72 65 45 6e 64 3b 20 20 20 20 20 20  lWhereEnd;      
13090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
130a0 65 6c 20 6a 75 73 74 20 62 65 66 6f 72 65 20 73  el just before s
130b0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
130c0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
130d0 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  rt( pMWin->eStar
130e0 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
130f0 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
13100 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
13110 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
13120 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
13130 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  ING || pMWin->eS
13140 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
13150 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ED .  );.  asser
13160 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  t( pMWin->eEnd==
13170 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20  TK_FOLLOWING || 
13180 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
13190 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20  CURRENT .       
131a0 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
131b0 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20  TK_UNBOUNDED || 
131c0 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
131d0 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a  PRECEDING .  );.
131e0 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
131f0 3e 65 45 78 63 6c 75 64 65 3d 3d 30 20 7c 7c 20  >eExclude==0 || 
13200 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d  pMWin->eExclude=
13210 3d 54 4b 5f 43 55 52 52 45 4e 54 0a 20 20 20 20  =TK_CURRENT.    
13220 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78     || pMWin->eEx
13230 63 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f 55 50 20  clude==TK_GROUP 
13240 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13250 64 65 3d 3d 54 4b 5f 54 49 45 53 0a 20 20 20 20  de==TK_TIES.    
13260 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78     || pMWin->eEx
13270 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a 20 20 29  clude==TK_NO.  )
13280 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65 45 6e 64  ;..  lblWhereEnd
13290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
132a0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
132b0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
132c0 68 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63  he context objec
132d0 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73  t */.  memset(&s
132e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
132f0 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a 20 20 73  owCodeArg));.  s
13300 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
13310 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70 4d  ;.  s.pMWin = pM
13320 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20 3d  Win;.  s.pVdbe =
13330 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75 62   v;.  s.regGosub
13340 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 73   = regGosub;.  s
13350 2e 61 64 64 72 47 6f 73 75 62 20 3d 20 61 64 64  .addrGosub = add
13360 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72 72  rGosub;.  s.curr
13370 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e 2d  ent.csr = pMWin-
13380 3e 69 45 70 68 43 73 72 3b 0a 20 20 63 73 72 57  >iEphCsr;.  csrW
13390 72 69 74 65 20 3d 20 73 2e 63 75 72 72 65 6e 74  rite = s.current
133a0 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73 74 61 72  .csr+1;.  s.star
133b0 74 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e  t.csr = s.curren
133c0 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65 6e 64  t.csr+2;.  s.end
133d0 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74  .csr = s.current
133e0 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a 20 46 69  .csr+3;..  /* Fi
133f0 67 75 72 65 20 6f 75 74 20 77 68 65 6e 20 72 6f  gure out when ro
13400 77 73 20 6d 61 79 20 62 65 20 64 65 6c 65 74 65  ws may be delete
13410 64 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65 6d  d from the ephem
13420 65 72 61 6c 20 74 61 62 6c 65 2e 20 54 68 65 72  eral table. Ther
13430 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f 75 72 20  e.  ** are four 
13440 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65 79 20 6d  options - they m
13450 61 79 20 6e 65 76 65 72 20 62 65 20 64 65 6c 65  ay never be dele
13460 74 65 64 20 28 65 44 65 6c 65 74 65 3d 3d 30 29  ted (eDelete==0)
13470 2c 20 74 68 65 79 20 6d 61 79 20 0a 20 20 2a 2a  , they may .  **
13480 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73   be deleted as s
13490 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65 20  oon as they are 
134a0 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72 74 20 6f  no longer part o
134b0 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  f the window fra
134c0 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c 65 74 65  me.  ** (eDelete
134d0 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  ==WINDOW_AGGINVE
134e0 52 53 45 29 2c 20 74 68 65 79 20 6d 61 79 20 62  RSE), they may b
134f0 65 20 64 65 6c 65 74 65 64 20 61 73 20 61 66 74  e deleted as aft
13500 65 72 20 74 68 65 20 72 6f 77 20 0a 20 20 2a 2a  er the row .  **
13510 20 68 61 73 20 62 65 65 6e 20 72 65 74 75 72 6e   has been return
13520 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
13530 20 28 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f   (WINDOW_RETURN_
13540 52 4f 57 29 2c 20 6f 72 20 74 68 65 79 20 6d 61  ROW), or they ma
13550 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c 65 74 65  y.  ** be delete
13560 64 20 61 66 74 65 72 20 74 68 65 79 20 65 6e 74  d after they ent
13570 65 72 20 74 68 65 20 66 72 61 6d 65 20 28 57 49  er the frame (WI
13580 4e 44 4f 57 5f 41 47 47 53 54 45 50 29 2e 20 2a  NDOW_AGGSTEP). *
13590 2f 0a 20 20 73 77 69 74 63 68 28 20 70 4d 57 69  /.  switch( pMWi
135a0 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a 20 20 20  n->eStart ){.   
135b0 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57 49   case TK_FOLLOWI
135c0 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
135d0 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b  pMWin->eType!=TK
135e0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
135f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13600 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
13610 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
13620 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20  e *pVal = 0;.   
13630 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
13640 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 70 4d 57  eFromExpr(db,pMW
13650 69 6e 2d 3e 70 53 74 61 72 74 2c 64 62 2d 3e 65  in->pStart,db->e
13660 6e 63 2c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  nc,SQLITE_AFF_NU
13670 4d 45 52 49 43 2c 26 70 56 61 6c 29 3b 0a 20 20  MERIC,&pVal);.  
13680 20 20 20 20 20 20 69 66 28 20 70 56 61 6c 20 26        if( pVal &
13690 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
136a0 69 6e 74 28 70 56 61 6c 29 3e 30 20 29 7b 0a 20  int(pVal)>0 ){. 
136b0 20 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65           s.eDele
136c0 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54 55  te = WINDOW_RETU
136d0 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  RN_ROW;.        
136e0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
136f0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
13700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13720 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55 4e 44   case TK_UNBOUND
13730 45 44 3a 0a 20 20 20 20 20 20 69 66 28 20 77 69  ED:.      if( wi
13740 6e 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28 70  ndowCacheFrame(p
13750 4d 57 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MWin)==0 ){.    
13760 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
13770 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
13780 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  G ){.          s
13790 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f  .eDelete = WINDO
137a0 57 5f 41 47 47 53 54 45 50 3b 0a 20 20 20 20 20  W_AGGSTEP;.     
137b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
137c0 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20 3d 20      s.eDelete = 
137d0 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
137e0 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  W;.        }.   
137f0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13800 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
13810 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20 3d       s.eDelete =
13820 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
13830 53 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  SE;.      break;
13840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
13850 61 74 65 20 72 65 67 69 73 74 65 72 73 20 66 6f  ate registers fo
13860 72 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 76  r the array of v
13870 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73  alues from the s
13880 75 62 2d 71 75 65 72 79 2c 20 74 68 65 0a 20 20  ub-query, the.  
13890 2a 2a 20 73 61 6d 76 65 20 76 61 6c 75 65 73 20  ** samve values 
138a0 69 6e 20 72 65 63 6f 72 64 20 66 6f 72 6d 2c 20  in record form, 
138b0 61 6e 64 20 74 68 65 20 72 6f 77 69 64 20 75 73  and the rowid us
138c0 65 64 20 74 6f 20 69 6e 73 65 72 74 20 73 61 69  ed to insert sai
138d0 64 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 69 6e  d record.  ** in
138e0 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
138f0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 72 65   table.  */.  re
13900 67 4e 65 77 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gNew = pParse->n
13910 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d  Mem+1;.  pParse-
13920 3e 6e 4d 65 6d 20 2b 3d 20 6e 49 6e 70 75 74 3b  >nMem += nInput;
13930 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b  .  regRecord = +
13940 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13950 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
13960 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f  arse->nMem;..  /
13970 2a 20 49 66 20 74 68 65 20 77 69 6e 64 6f 77 20  * If the window 
13980 66 72 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 61  frame contains a
13990 6e 20 22 3c 65 78 70 72 3e 20 50 52 45 43 45 44  n "<expr> PRECED
139a0 49 4e 47 22 20 6f 72 20 22 3c 65 78 70 72 3e 20  ING" or "<expr> 
139b0 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20 20 2a 2a 20  FOLLOWING".  ** 
139c0 63 6c 61 75 73 65 2c 20 61 6c 6c 6f 63 61 74 65  clause, allocate
139d0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
139e0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
139f0 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 65 61  of evaluating ea
13a00 63 68 0a 20 20 2a 2a 20 3c 65 78 70 72 3e 2e 20  ch.  ** <expr>. 
13a10 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
13a20 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  >eStart==TK_PREC
13a30 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e  EDING || pMWin->
13a40 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
13a50 57 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67 53  WING ){.    regS
13a60 74 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tart = ++pParse-
13a70 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  >nMem;.  }.  if(
13a80 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
13a90 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d  _PRECEDING || pM
13aa0 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
13ab0 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 72  LLOWING ){.    r
13ac0 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  egEnd = ++pParse
13ad0 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ->nMem;.  }..  /
13ae0 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
13af0 20 61 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e   a "ROWS BETWEEN
13b00 20 2e 2e 2e 22 20 66 72 61 6d 65 2c 20 74 68 65   ..." frame, the
13b10 6e 20 61 6c 6c 6f 63 61 74 65 20 61 72 72 61 79  n allocate array
13b20 73 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73 74  s of.  ** regist
13b30 65 72 73 20 74 6f 20 73 74 6f 72 65 20 63 6f 70  ers to store cop
13b40 69 65 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ies of the ORDER
13b50 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20   BY expressions 
13b60 28 70 65 65 72 20 76 61 6c 75 65 73 29 20 0a 20  (peer values) . 
13b70 20 2a 2a 20 66 6f 72 20 74 68 65 20 6d 61 69 6e   ** for the main
13b80 20 6c 6f 6f 70 2c 20 61 6e 64 20 66 6f 72 20 65   loop, and for e
13b90 61 63 68 20 63 75 72 73 6f 72 20 28 73 74 61 72  ach cursor (star
13ba0 74 2c 20 63 75 72 72 65 6e 74 20 61 6e 64 20 65  t, current and e
13bb0 6e 64 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d  nd). */.  if( pM
13bc0 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52  Win->eType!=TK_R
13bd0 4f 57 53 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  OWS ){.    int n
13be0 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79  Peer = (pOrderBy
13bf0 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   ? pOrderBy->nEx
13c00 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 72 65 67  pr : 0);.    reg
13c10 4e 65 77 50 65 65 72 20 3d 20 72 65 67 4e 65 77  NewPeer = regNew
13c20 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65   + pMWin->nBuffe
13c30 72 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 4d  rCol;.    if( pM
13c40 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
13c50 29 20 72 65 67 4e 65 77 50 65 65 72 20 2b 3d 20  ) regNewPeer += 
13c60 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
13c70 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 72 65  n->nExpr;.    re
13c80 67 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  gPeer = pParse->
13c90 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 20 20 70 50  nMem+1;       pP
13ca0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
13cb0 65 65 72 3b 0a 20 20 20 20 73 2e 73 74 61 72 74  eer;.    s.start
13cc0 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .reg = pParse->n
13cd0 4d 65 6d 2b 31 3b 20 20 20 70 50 61 72 73 65 2d  Mem+1;   pParse-
13ce0 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
13cf0 20 20 20 20 73 2e 63 75 72 72 65 6e 74 2e 72 65      s.current.re
13d00 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
13d10 2b 31 3b 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  +1; pParse->nMem
13d20 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73   += nPeer;.    s
13d30 2e 65 6e 64 2e 72 65 67 20 3d 20 70 50 61 72 73  .end.reg = pPars
13d40 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 70  e->nMem+1;     p
13d50 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
13d60 50 65 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Peer;.  }..  /* 
13d70 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Load the column 
13d80 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 72  values for the r
13d90 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ow returned by t
13da0 68 65 20 73 75 62 2d 73 65 6c 65 63 74 0a 20 20  he sub-select.  
13db0 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ** into an array
13dc0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
13dd0 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77  arting at regNew
13de0 2e 20 41 73 73 65 6d 62 6c 65 20 74 68 65 6d 20  . Assemble them 
13df0 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65 63 6f  into.  ** a reco
13e00 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72  rd in register r
13e10 65 67 52 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 66  egRecord. */.  f
13e20 6f 72 28 69 49 6e 70 75 74 3d 30 3b 20 69 49 6e  or(iInput=0; iIn
13e30 70 75 74 3c 6e 49 6e 70 75 74 3b 20 69 49 6e 70  put<nInput; iInp
13e40 75 74 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ut++){.    sqlit
13e50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13e60 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 49 6e  OP_Column, csrIn
13e70 70 75 74 2c 20 69 49 6e 70 75 74 2c 20 72 65 67  put, iInput, reg
13e80 4e 65 77 2b 69 49 6e 70 75 74 29 3b 0a 20 20 7d  New+iInput);.  }
13e90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13ea0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
13eb0 65 63 6f 72 64 2c 20 72 65 67 4e 65 77 2c 20 6e  ecord, regNew, n
13ec0 49 6e 70 75 74 2c 20 72 65 67 52 65 63 6f 72 64  Input, regRecord
13ed0 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70 75  );..  /* An inpu
13ee0 74 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20 62  t row has just b
13ef0 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61 6e  een read into an
13f00 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
13f10 65 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ers starting.  *
13f20 2a 20 61 74 20 72 65 67 4e 65 77 2e 20 49 66 20  * at regNew. If 
13f30 74 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20 61  the window has a
13f40 20 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73   PARTITION claus
13f50 65 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67 65  e, this block ge
13f60 6e 65 72 61 74 65 73 20 0a 20 20 2a 2a 20 56 4d  nerates .  ** VM
13f70 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 69   code to check i
13f80 66 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77 20  f the input row 
13f90 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  is the start of 
13fa0 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e  a new partition.
13fb0 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74 20  .  ** If so, it 
13fc0 64 6f 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75 62  does an OP_Gosub
13fd0 20 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20 74   to an address t
13fe0 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 6c  o be filled in l
13ff0 61 74 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20 61  ater. The.  ** a
14000 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
14010 5f 47 6f 73 75 62 20 69 73 20 73 74 6f 72 65 64  _Gosub is stored
14020 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
14030 6c 65 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73  le addrGosubFlus
14040 68 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  h. */.  if( pMWi
14050 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b  n->pPartition ){
14060 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
14070 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61     ExprList *pPa
14080 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
14090 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  tition;.    int 
140a0 6e 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e  nPart = pPart->n
140b0 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65  Expr;.    int re
140c0 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 4e 65  gNewPart = regNe
140d0 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  w + pMWin->nBuff
140e0 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e  erCol;.    KeyIn
140f0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
14100 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
14110 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
14120 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a  , pPart, 0, 0);.
14130 0a 20 20 20 20 72 65 67 46 6c 75 73 68 50 61 72  .    regFlushPar
14140 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
14150 65 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  em;.    addr = s
14160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14170 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
14180 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
14190 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
141a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
141b0 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
141c0 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
141d0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
141e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
141f0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
14200 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61  ddr+2, addr+4, a
14210 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65  ddr+2);.    Vdbe
14220 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b  CoverageEqNe(v);
14230 0a 20 20 20 20 61 64 64 72 47 6f 73 75 62 46 6c  .    addrGosubFl
14240 75 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ush = sqlite3Vdb
14250 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47 6f  eAddOp1(v, OP_Go
14260 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72  sub, regFlushPar
14270 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
14280 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c  ent((v, "call fl
14290 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29  ush_partition"))
142a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
142b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
142c0 70 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  py, regNewPart, 
142d0 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20  pMWin->regPart, 
142e0 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20  nPart-1);.  }.. 
142f0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
14300 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20  ew row into the 
14310 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
14320 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
14330 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
14340 52 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65 2c  Rowid, csrWrite,
14350 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71   regRowid);.  sq
14360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14370 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 63 73  v, OP_Insert, cs
14380 72 57 72 69 74 65 2c 20 72 65 67 52 65 63 6f 72  rWrite, regRecor
14390 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  d, regRowid);.  
143a0 61 64 64 72 4e 65 20 3d 20 73 71 6c 69 74 65 33  addrNe = sqlite3
143b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
143c0 5f 4e 65 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 4f  _Ne, pMWin->regO
143d0 6e 65 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29  ne, 0, regRowid)
143e0 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
143f0 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  (v);..  /* This 
14400 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f 72  block is run for
14410 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f   the first row o
14420 66 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  f each partition
14430 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67 20 3d   */.  s.regArg =
14440 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
14450 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b  (pParse, pMWin);
14460 0a 0a 20 20 69 66 28 20 72 65 67 53 74 61 72 74  ..  if( regStart
14470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14480 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14490 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72  pMWin->pStart, r
144a0 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69  egStart);.    wi
144b0 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70  ndowCheckValue(p
144c0 50 61 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c  Parse, regStart,
144d0 20 30 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 54 79   0 + (pMWin->eTy
144e0 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f 20 33  pe==TK_RANGE ? 3
144f0 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 20 20 69 66   : 0));.  }.  if
14500 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20  ( regEnd ){.    
14510 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
14520 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70  pParse, pMWin->p
14530 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20  End, regEnd);.  
14540 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c    windowCheckVal
14550 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e  ue(pParse, regEn
14560 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e 2d 3e 65  d, 1 + (pMWin->e
14570 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f  Type==TK_RANGE ?
14580 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 0a 20   3 : 0));.  }.. 
14590 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
145a0 72 74 3d 3d 70 4d 57 69 6e 2d 3e 65 45 6e 64 20  rt==pMWin->eEnd 
145b0 26 26 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20  && regStart ){. 
145c0 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 28 70 4d     int op = ((pM
145d0 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
145e0 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f 20 4f 50 5f  FOLLOWING) ? OP_
145f0 47 65 20 3a 20 4f 50 5f 4c 65 29 3b 0a 20 20 20  Ge : OP_Le);.   
14600 20 69 6e 74 20 61 64 64 72 47 65 20 3d 20 73 71   int addrGe = sq
14610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14620 76 2c 20 6f 70 2c 20 72 65 67 53 74 61 72 74 2c  v, op, regStart,
14630 20 30 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20   0, regEnd);.   
14640 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14650 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46  ;.    windowAggF
14660 69 6e 61 6c 28 26 73 2c 20 30 29 3b 0a 20 20 20  inal(&s, 0);.   
14670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14680 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
14690 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20   s.current.csr, 
146a0 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
146b0 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
146c0 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74  );.    windowRet
146d0 75 72 6e 4f 6e 65 52 6f 77 28 26 73 29 3b 0a 20  urnOneRow(&s);. 
146e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
146f0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
14700 53 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e  Sorter, s.curren
14710 74 2e 63 73 72 29 3b 0a 20 20 20 20 73 71 6c 69  t.csr);.    sqli
14720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14730 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c   OP_Goto, 0, lbl
14740 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 20 20 73  WhereEnd);.    s
14750 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14760 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20  re(v, addrGe);. 
14770 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
14780 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
14790 57 49 4e 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65  WING && pMWin->e
147a0 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45 20 26  Type!=TK_RANGE &
147b0 26 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20  & regEnd ){.    
147c0 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
147d0 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
147e0 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  G );.    sqlite3
147f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14800 5f 53 75 62 74 72 61 63 74 2c 20 72 65 67 53 74  _Subtract, regSt
14810 61 72 74 2c 20 72 65 67 45 6e 64 2c 20 72 65 67  art, regEnd, reg
14820 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  Start);.  }..  i
14830 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
14840 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  !=TK_UNBOUNDED )
14850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14860 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
14870 77 69 6e 64 2c 20 73 2e 73 74 61 72 74 2e 63 73  wind, s.start.cs
14880 72 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43  r, 1);.    VdbeC
14890 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
148a0 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  n(v);.  }.  sqli
148b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
148c0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75   OP_Rewind, s.cu
148d0 72 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20  rrent.csr, 1);. 
148e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
148f0 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71  erTaken(v);.  sq
14900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14910 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e  v, OP_Rewind, s.
14920 65 6e 64 2e 63 73 72 2c 20 31 29 3b 0a 20 20 56  end.csr, 1);.  V
14930 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
14940 54 61 6b 65 6e 28 76 29 3b 0a 20 20 69 66 28 20  Taken(v);.  if( 
14950 72 65 67 50 65 65 72 20 26 26 20 70 4f 72 64 65  regPeer && pOrde
14960 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
14970 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14980 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50  OP_Copy, regNewP
14990 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 70 4f  eer, regPeer, pO
149a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29  rderBy->nExpr-1)
149b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
149c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
149d0 70 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 73  py, regPeer, s.s
149e0 74 61 72 74 2e 72 65 67 2c 20 70 4f 72 64 65 72  tart.reg, pOrder
149f0 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  By->nExpr-1);.  
14a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14a10 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
14a20 72 65 67 50 65 65 72 2c 20 73 2e 63 75 72 72 65  regPeer, s.curre
14a30 6e 74 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79  nt.reg, pOrderBy
14a40 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
14a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a60 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
14a70 67 50 65 65 72 2c 20 73 2e 65 6e 64 2e 72 65 67  gPeer, s.end.reg
14a80 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
14a90 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  r-1);.  }..  sql
14aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ab0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62  , OP_Goto, 0, lb
14ac0 6c 57 68 65 72 65 45 6e 64 29 3b 0a 0a 20 20 73  lWhereEnd);..  s
14ad0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14ae0 72 65 28 76 2c 20 61 64 64 72 4e 65 29 3b 0a 20  re(v, addrNe);. 
14af0 20 69 66 28 20 72 65 67 50 65 65 72 20 29 7b 0a   if( regPeer ){.
14b00 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65 77 50      windowIfNewP
14b10 65 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  eer(pParse, pOrd
14b20 65 72 42 79 2c 20 72 65 67 4e 65 77 50 65 65 72  erBy, regNewPeer
14b30 2c 20 72 65 67 50 65 65 72 2c 20 6c 62 6c 57 68  , regPeer, lblWh
14b40 65 72 65 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 69  ereEnd);.  }.  i
14b50 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
14b60 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
14b70 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  {.    windowCode
14b80 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
14b90 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20  GSTEP, 0, 0);.  
14ba0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
14bb0 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d!=TK_UNBOUNDED 
14bc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  ){.      if( pMW
14bd0 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41  in->eType==TK_RA
14be0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  NGE ){.        i
14bf0 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
14c00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
14c10 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
14c20 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71  nt addrNext = sq
14c30 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
14c40 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
14c50 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
14c60 54 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20  Test(&s, OP_Ge, 
14c70 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72  s.current.csr, r
14c80 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72  egEnd, s.end.csr
14c90 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
14ca0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
14cb0 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
14cc0 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  SE, regStart, 0)
14cd0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
14ce0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
14cf0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
14d00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
14d10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14d20 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
14d30 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  drNext);.       
14d40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
14d50 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
14d60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14d70 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
14d80 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
14d90 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e  ETURN_ROW, regEn
14da0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77  d, 0);.        w
14db0 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
14dc0 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
14dd0 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
14de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14df0 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4d 57   }else.  if( pMW
14e00 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
14e10 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 77 69  CEDING ){.    wi
14e20 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
14e30 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72  INDOW_AGGSTEP, r
14e40 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77  egEnd, 0);.    w
14e50 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
14e60 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
14e70 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 77 69  W, 0, 0);.    wi
14e80 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
14e90 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
14ea0 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
14eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
14ec0 20 61 64 64 72 3b 0a 20 20 20 20 77 69 6e 64 6f   addr;.    windo
14ed0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
14ee0 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30  OW_AGGSTEP, 0, 0
14ef0 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  );.    if( pMWin
14f00 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd!=TK_UNBOU
14f10 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66  NDED ){.      if
14f20 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d  ( pMWin->eType==
14f30 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  TK_RANGE ){.    
14f40 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20      int lbl;.   
14f50 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14f60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14f70 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  dr(v);.        i
14f80 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20  f( regEnd ){.   
14f90 20 20 20 20 20 20 20 6c 62 6c 20 3d 20 73 71 6c         lbl = sql
14fa0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14fb0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
14fc0 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
14fd0 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f 50 5f  angeTest(&s, OP_
14fe0 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  Ge, s.current.cs
14ff0 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64  r, regEnd, s.end
15000 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  .csr, lbl);.    
15010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 69      }.        wi
15020 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15030 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15040 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
15050 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15060 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
15070 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30  RSE, regStart, 0
15080 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15090 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  egEnd ){.       
150a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
150b0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
150c0 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20   0, addr);.     
150d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
150e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
150f0 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lbl);.        }.
15100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15110 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
15120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
15130 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
15140 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
15150 73 2c 20 72 65 67 45 6e 64 2c 20 30 2c 20 31 29  s, regEnd, 0, 1)
15160 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
15170 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
15190 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
151a0 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
151b0 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  W, 0, 0);.      
151c0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
151d0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
151e0 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
151f0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
15200 72 65 67 45 6e 64 20 29 20 73 71 6c 69 74 65 33  regEnd ) sqlite3
15210 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15220 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
15230 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45     }.  }..  /* E
15240 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 69  nd of the main i
15250 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73  nput loop */.  s
15260 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15270 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 57 68 65  eLabel(v, lblWhe
15280 72 65 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65  reEnd);.  sqlite
15290 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
152a0 29 3b 0a 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68  );..  /* Fall th
152b0 72 6f 75 67 68 20 2a 2f 0a 20 20 69 66 28 20 70  rough */.  if( p
152c0 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
152d0 20 29 7b 0a 20 20 20 20 61 64 64 72 49 6e 74 65   ){.    addrInte
152e0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ger = sqlite3Vdb
152f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
15300 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c 75  teger, 0, regFlu
15310 73 68 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  shPart);.    sql
15320 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15330 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46 6c 75  (v, addrGosubFlu
15340 73 68 29 3b 0a 20 20 7d 0a 0a 20 20 61 64 64 72  sh);.  }..  addr
15350 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 56  Empty = sqlite3V
15360 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15370 52 65 77 69 6e 64 2c 20 63 73 72 57 72 69 74 65  Rewind, csrWrite
15380 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
15390 65 28 76 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  e(v);.  if( pMWi
153a0 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
153b0 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e  EDING ){.    win
153c0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
153d0 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72 65  NDOW_AGGSTEP, re
153e0 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77 69  gEnd, 0);.    wi
153f0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15400 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15410 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
15420 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
15430 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
15440 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
15450 53 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 61  Start;.    int a
15460 64 64 72 42 72 65 61 6b 31 3b 0a 20 20 20 20 69  ddrBreak1;.    i
15470 6e 74 20 61 64 64 72 42 72 65 61 6b 32 3b 0a 20  nt addrBreak2;. 
15480 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b     int addrBreak
15490 33 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  3;.    windowCod
154a0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
154b0 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20  GGSTEP, 0, 0);. 
154c0 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54     if( pMWin->eT
154d0 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b  ype==TK_RANGE ){
154e0 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72 74  .      addrStart
154f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15500 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15510 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d      addrBreak2 =
15520 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15530 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
15540 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 31  RSE, regStart, 1
15550 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
15560 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak1 = windowCode
15570 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15580 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b  TURN_ROW, 0, 1);
15590 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 69  .    }else.    i
155a0 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
155b0 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
155c0 20 20 20 20 20 20 61 64 64 72 53 74 61 72 74 20        addrStart 
155d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
155e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
155f0 20 20 20 61 64 64 72 42 72 65 61 6b 31 20 3d 20     addrBreak1 = 
15600 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
15610 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
15620 4f 57 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29  OW, regStart, 1)
15630 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
15640 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k2 = windowCodeO
15650 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15660 49 4e 56 45 52 53 45 2c 20 30 2c 20 31 29 3b 0a  INVERSE, 0, 1);.
15670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15680 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
15690 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
156a0 4e 47 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  NG );.      addr
156b0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
156c0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
156d0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
156e0 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak1 = windowCode
156f0 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15700 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64  TURN_ROW, regEnd
15710 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 1);.      addr
15720 42 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43  Break2 = windowC
15730 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15740 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
15750 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 7d  Start, 1);.    }
15760 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15770 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15780 6f 2c 20 30 2c 20 61 64 64 72 53 74 61 72 74 29  o, 0, addrStart)
15790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
157a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
157b0 72 42 72 65 61 6b 32 29 3b 0a 20 20 20 20 61 64  rBreak2);.    ad
157c0 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  drStart = sqlite
157d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
157e0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65  (v);.    addrBre
157f0 61 6b 33 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak3 = windowCode
15800 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15810 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b  TURN_ROW, 0, 1);
15820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15830 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15840 6f 2c 20 30 2c 20 61 64 64 72 53 74 61 72 74 29  o, 0, addrStart)
15850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15860 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
15870 72 42 72 65 61 6b 31 29 3b 0a 20 20 20 20 73 71  rBreak1);.    sq
15880 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15890 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b 33 29  e(v, addrBreak3)
158a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
158b0 6e 74 20 61 64 64 72 42 72 65 61 6b 3b 0a 20 20  nt addrBreak;.  
158c0 20 20 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b    int addrStart;
158d0 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
158e0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
158f0 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20  STEP, 0, 0);.   
15900 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c   addrStart = sql
15910 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15920 64 64 72 28 76 29 3b 0a 20 20 20 20 61 64 64 72  ddr(v);.    addr
15930 42 72 65 61 6b 20 3d 20 77 69 6e 64 6f 77 43 6f  Break = windowCo
15940 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15950 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31  RETURN_ROW, 0, 1
15960 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  );.    windowCod
15970 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
15980 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
15990 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  art, 0);.    sql
159a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
159b0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
159c0 64 72 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71  drStart);.    sq
159d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
159e0 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  e(v, addrBreak);
159f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
15a00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
15a10 64 72 45 6d 70 74 79 29 3b 0a 0a 20 20 73 71 6c  drEmpty);..  sql
15a20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15a30 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
15a40 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29  , s.current.csr)
15a50 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  ;.  if( pMWin->p
15a60 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20  Partition ){.   
15a70 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
15a80 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  tartRowid ){.   
15a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15aa0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
15ab0 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65  er, 1, pMWin->re
15ac0 67 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20  gStartRowid);.  
15ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ae0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15af0 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72  ger, 0, pMWin->r
15b00 65 67 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20  egEndRowid);.   
15b10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
15b20 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64  beChangeP1(v, ad
15b30 64 72 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74  drInteger, sqlit
15b40 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15b50 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
15b60 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15b70 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c  OP_Return, regFl
15b80 75 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a  ushPart);.  }.}.
15b90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15ba0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
15bb0 43 20 2a 2f 0a                                   C */.