/ Hex Artifact Content
Login

Artifact 76a3a9bea5e1b6823fdcab93601fdb5ec8ccb619cbf3142b9d67a8e3a262dff1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  nArg==0 );.  UNU
2870: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70  SED_PARAMETER(ap
2880: 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72  Arg);.  p = (str
2890: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
28a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28b0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28c0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
28d0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ( p ){.    p->nT
28e0: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
28f0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
2900: 74 5f 72 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20  t_rankInvFunc(. 
2910: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2920: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2930: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2940: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2950: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
2960: 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f  nt *p;.  UNUSED_
2970: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2980: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
2990: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
29a0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
29b0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
29c0: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
29d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
29e0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
29f0: 70 29 29 3b 0a 20 20 70 2d 3e 6e 53 74 65 70 2b  p));.  p->nStep+
2a00: 2b 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  +;.}.static void
2a10: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c   percent_rankVal
2a20: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
2a30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2a40: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2a50: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  t *p;.  p = (str
2a60: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
2a70: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2a80: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2a90: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2aa0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  ( p ){.    p->nV
2ab0: 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b  alue = p->nStep;
2ac0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2ad0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2ae0: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2af0: 29 70 2d 3e 6e 56 61 6c 75 65 20 2f 20 28 64 6f  )p->nValue / (do
2b00: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2b10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b20: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2b30: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2b40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b50: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2b60: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2b70: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2b80: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 46 69 6e   percent_rankFin
2b90: 61 6c 69 7a 65 46 75 6e 63 20 70 65 72 63 65 6e  alizeFunc percen
2ba0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 0a  t_rankValueFunc.
2bb0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2bc0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
2bd0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
2be0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
2bf0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2c00: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2c10: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2c20: 0a 2a 2a 0a 2a 2a 20 20 20 47 52 4f 55 50 53 20  .**.**   GROUPS 
2c30: 42 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57  BETWEEN 1 FOLLOW
2c40: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
2c50: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73  D FOLLOWING.*/.s
2c60: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2c70: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c90: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
2ca0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
2cb0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
2cc0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2cd0: 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t *p;.  UNUSED_P
2ce0: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 20  ARAMETER(nArg); 
2cf0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
2d00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d10: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20  METER(apArg);.  
2d20: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2d30: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2d40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2d50: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2d60: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
2d70: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a     p->nTotal++;.
2d80: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d90: 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75  d cume_distInvFu
2da0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2db0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2dc0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2dd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2de0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2df0: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2e00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2e10: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2e20: 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  rg==0 );.  UNUSE
2e30: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70 41 72  D_PARAMETER(apAr
2e40: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2e50: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2e60: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2e70: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2e80: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e  eof(*p));.  p->n
2e90: 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63  Step++;.}.static
2ea0: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2eb0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2ec0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2ed0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2ee0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2ef0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2f00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
2f30: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28      double r = (
2f40: 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74 65 70  double)(p->nStep
2f50: 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e  ) / (double)(p->
2f60: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73 71 6c  nTotal);.    sql
2f70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
2f80: 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20 7d  le(pCtx, r);.  }
2f90: 0a 7d 0a 23 64 65 66 69 6e 65 20 63 75 6d 65 5f  .}.#define cume_
2fa0: 64 69 73 74 46 69 6e 61 6c 69 7a 65 46 75 6e 63  distFinalizeFunc
2fb0: 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65 46   cume_distValueF
2fc0: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
2fd0: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 74  xt object for nt
2fe0: 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e  ile() window fun
2ff0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ction..*/.struct
3000: 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69 36   NtileCtx {.  i6
3010: 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20 20  4 nTotal;       
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3030: 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20 70   Total rows in p
3040: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36  artition */.  i6
3050: 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20 20  4 nParam;       
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   Parameter passe
3080: 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a 2f  d to ntile(N) */
3090: 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20  .  i64 iRow;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
30c0: 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  w */.};../*.** I
30d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30e0: 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20 61   ntile(). This a
30f0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
3100: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
3110: 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65 64  .** been coerced
3120: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   to:.**.**   ROW
3130: 53 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  S CURRENT ROW AN
3140: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
3150: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
3160: 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46 75  void ntileStepFu
3170: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3180: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
3190: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
31a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
31b0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74  g.){.  struct Nt
31c0: 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73 73  ileCtx *p;.  ass
31d0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20  ert( nArg==1 ); 
31e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31f0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
3200: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29  truct NtileCtx*)
3210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3220: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3230: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3240: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3250: 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a  p->nTotal==0 ){.
3260: 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20        p->nParam 
3270: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3280: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
3290: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
32a0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
32b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
32c0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
32d0: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
32e0: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
32f0: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
3300: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
3310: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
3320: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 54  .    }.    p->nT
3330: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
3340: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49  atic void ntileI
3350: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
3360: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3370: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3380: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3390: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
33a0: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
33b0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
33c0: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
33d0: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55 4e  ETER(nArg);.  UN
33e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
33f0: 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74  pArg);.  p = (st
3400: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
3410: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3420: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
3430: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
3440: 3e 69 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >iRow++;.}.stati
3450: 63 20 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75  c void ntileValu
3460: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3470: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3480: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
3490: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
34a0: 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69  t NtileCtx*)sqli
34b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
34c0: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
34d0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
34e0: 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20   && p->nParam>0 
34f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  ){.    int nSize
3500: 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20   = (p->nTotal / 
3510: 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20  p->nParam);.    
3520: 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  if( nSize==0 ){.
3530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3540: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
3550: 20 70 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20   p->iRow+1);.   
3560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
3570: 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54  4 nLarge = p->nT
3580: 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d  otal - p->nParam
3590: 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36  *nSize;.      i6
35a0: 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67  4 iSmall = nLarg
35b0: 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20  e*(nSize+1);.   
35c0: 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d     i64 iRow = p-
35d0: 3e 69 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73  >iRow;..      as
35e0: 73 65 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e  sert( (nLarge*(n
35f0: 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50  Size+1) + (p->nP
3600: 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69  aram-nLarge)*nSi
3610: 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29  ze)==p->nTotal )
3620: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  ;..      if( iRo
3630: 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20  w<iSmall ){.    
3640: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3650: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31  lt_int64(pCtx, 1
3660: 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31   + iRow/(nSize+1
3670: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
3680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3690: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
36a0: 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b  tx, 1 + nLarge +
36b0: 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e   (iRow-iSmall)/n
36c0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
36d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69     }.  }.}.#defi
36e0: 6e 65 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65  ne ntileFinalize
36f0: 46 75 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46  Func ntileValueF
3700: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
3710: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61  xt object for la
3720: 73 74 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f  st_value() windo
3730: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
3740: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3750: 74 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  tx {.  sqlite3_v
3760: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
3770: 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t nVal;.};../*.*
3780: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3790: 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29   of last_value()
37a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37b0: 20 6c 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46   last_valueStepF
37c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
37d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
37e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
37f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
3800: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c  rg.){.  struct L
3810: 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a  astValueCtx *p;.
3820: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3830: 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20  ER(nArg);.  p = 
3840: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3850: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3860: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3870: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3880: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3890: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
38a0: 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20  free(p->pVal);. 
38b0: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c     p->pVal = sql
38c0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61  ite3_value_dup(a
38d0: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pArg[0]);.    if
38e0: 28 20 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->pVal==0 ){.
38f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3900: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
3910: 28 70 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73  (pCtx);.    }els
3920: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  e{.      p->nVal
3930: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3940: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3950: 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20  _valueInvFunc(. 
3960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3970: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
3980: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
3990: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
39a0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
39b0: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
39c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
39d0: 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g);.  UNUSED_PAR
39e0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
39f0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73   p = (struct Las
3a00: 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74  tValueCtx*)sqlit
3a10: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3a20: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
3a30: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c  f(*p));.  if( AL
3a40: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
3a50: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
3a60: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
3a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3a80: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
3a90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
3aa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
3ab0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3ac0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
3ad0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3ae0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
3af0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
3b00: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
3b10: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
3b20: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3b30: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3b40: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
3b50: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
3b60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
3b70: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
3b80: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
3b90: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46  void last_valueF
3ba0: 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69  inalizeFunc(sqli
3bb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
3bc0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
3bd0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
3be0: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
3bf0: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
3c00: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3c10: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
3c20: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
3c30: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
3c40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3c50: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
3c60: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
3c70: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3c80: 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56  pVal);.    p->pV
3c90: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
3ca0: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e 61 6d 65  *.** Static name
3cb0: 73 20 66 6f 72 20 74 68 65 20 62 75 69 6c 74 2d  s for the built-
3cc0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3cd0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 73 65  on names.  These
3ce0: 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73   static.** names
3cf0: 20 61 72 65 20 75 73 65 64 2c 20 72 61 74 68 65   are used, rathe
3d00: 72 20 74 68 61 6e 20 73 74 72 69 6e 67 20 6c 69  r than string li
3d10: 74 65 72 61 6c 73 2c 20 73 6f 20 74 68 61 74 20  terals, so that 
3d20: 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 74 73 0a  FuncDef objects.
3d30: 2a 2a 20 63 61 6e 20 62 65 20 61 73 73 6f 63 69  ** can be associ
3d40: 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74  ated with a part
3d50: 69 63 75 6c 61 72 20 77 69 6e 64 6f 77 20 66 75  icular window fu
3d60: 6e 63 74 69 6f 6e 20 62 79 20 64 69 72 65 63 74  nction by direct
3d70: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  .** comparison o
3d80: 66 20 74 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e  f the zName poin
3d90: 74 65 72 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ter.  Example:.*
3da0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 70  *.**       if( p
3db0: 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d  FuncDef->zName==
3dc0: 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  row_valueName ){
3dd0: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63   ... }.*/.static
3de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 72 6f 77 5f   const char row_
3df0: 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20  numberName[] =  
3e00: 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73   "row_number";.s
3e10: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3e20: 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b   dense_rankName[
3e30: 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f 72 61 6e  ] =   "dense_ran
3e40: 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  k";.static const
3e50: 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d   char rankName[]
3e60: 20 3d 20 20 20 20 20 20 20 20 20 22 72 61 6e 6b   =         "rank
3e70: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e80: 63 68 61 72 20 70 65 72 63 65 6e 74 5f 72 61 6e  char percent_ran
3e90: 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65  kName[] = "perce
3ea0: 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63  nt_rank";.static
3eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 63 75 6d 65   const char cume
3ec0: 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20  _distName[] =   
3ed0: 20 22 63 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74   "cume_dist";.st
3ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3ef0: 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  ntileName[] =   
3f00: 20 20 20 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74       "ntile";.st
3f10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3f20: 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d  last_valueName[]
3f30: 20 3d 20 20 20 22 6c 61 73 74 5f 76 61 6c 75 65   =   "last_value
3f40: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3f50: 63 68 61 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61  char nth_valueNa
3f60: 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76  me[] =    "nth_v
3f70: 61 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  alue";.static co
3f80: 6e 73 74 20 63 68 61 72 20 66 69 72 73 74 5f 76  nst char first_v
3f90: 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66  alueName[] =  "f
3fa0: 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61  irst_value";.sta
3fb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c  tic const char l
3fc0: 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  eadName[] =     
3fd0: 20 20 20 20 22 6c 65 61 64 22 3b 0a 73 74 61 74      "lead";.stat
3fe0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61  ic const char la
3ff0: 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  gName[] =       
4000: 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a     "lag";../*.**
4010: 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74   No-op implement
4020: 61 74 69 6f 6e 73 20 6f 66 20 78 53 74 65 70 28  ations of xStep(
4030: 29 20 61 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28  ) and xFinalize(
4040: 29 2e 20 20 55 73 65 64 20 61 73 20 70 6c 61 63  ).  Used as plac
4050: 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72  e-holders.** for
4060: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4070: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4080: 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 6f 73 65  never call those
4090: 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a   interfaces..**.
40a0: 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65  ** The noopValue
40b0: 46 75 6e 63 28 29 20 69 73 20 63 61 6c 6c 65 64  Func() is called
40c0: 20 62 75 74 20 69 73 20 65 78 70 65 63 74 65 64   but is expected
40d0: 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20   to do nothing. 
40e0: 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70   The.** noopStep
40f0: 46 75 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Func() is never 
4100: 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69  called, and so i
4110: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
4120: 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c   NO_TEST to.** l
4130: 65 74 20 74 68 65 20 74 65 73 74 20 63 6f 76 65  et the test cove
4140: 72 61 67 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  rage routine kno
4150: 77 20 6e 6f 74 20 74 6f 20 65 78 70 65 63 74 20  w not to expect 
4160: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
4170: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a   be.** invoked..
4180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4190: 6f 6f 70 53 74 65 70 46 75 6e 63 28 20 20 20 20  oopStepFunc(    
41a0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71  /*NO_TEST*/.  sq
41b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
41c0: 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  ,        /*NO_TE
41d0: 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  ST*/.  int n,   
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4210: 61 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f  a          /*NO_
4220: 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20  TEST*/.){       
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
4250: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4260: 45 52 28 70 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(p);       /*N
4270: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
4280: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 20  D_PARAMETER(n); 
4290: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
42a0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
42b0: 45 54 45 52 28 61 29 3b 20 20 20 20 20 20 20 2f  ETER(a);       /
42c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61 73 73  *NO_TEST*/.  ass
42d0: 65 72 74 28 30 29 3b 20 20 20 20 20 20 20 20 20  ert(0);         
42e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
42f0: 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20 20 20  T*/.}           
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73 74 61   /*NO_TEST*/.sta
4320: 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56 61 6c  tic void noopVal
4330: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
4340: 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55 4e 55 53  ontext *p){ UNUS
4350: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
4360: 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a 0a 2f 2a   /*no-op*/ }../*
4370: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
4380: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
4390: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
43a0: 3a 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  : xStep, xFinal,
43b0: 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20  .** xValue, and 
43c0: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66  xInverse */.#def
43d0: 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c  ine WINDOWFUNCAL
43e0: 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72  L(name,nArg,extr
43f0: 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c         \.  nArg,
4420: 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51   (SQLITE_UTF8|SQ
4430: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
4440: 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20  |extra), 0, 0,  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
4470: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
4480: 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20  # FinalizeFunc, 
4490: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
44a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44b0: 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76   \.  name ## Inv
44c0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61  Func, name ## Na
44d0: 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20  me, {0}         
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4500: 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e  }../* Window fun
4510: 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
4520: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
4530: 67 20 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74  g bytecode and t
4540: 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f  hus have.** no-o
4550: 70 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  p routines for t
4560: 68 65 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  heir methods */.
4570: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55  #define WINDOWFU
4580: 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67  NCNOOP(name,nArg
4590: 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20  ,extra) {       
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
45c0: 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46  Arg, (SQLITE_UTF
45d0: 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  8|SQLITE_FUNC_WI
45e0: 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20  NDOW|extra), 0, 
45f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4600: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
4610: 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61  StepFunc, noopVa
4620: 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c  lueFunc, noopVal
4630: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65       \.  noopSte
4660: 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e  pFunc, name ## N
4670: 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20  ame, {0}        
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77    \.}../* Window
46b0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
46c0: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
46d0: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
46e0: 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f  , the.** same ro
46f0: 75 74 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c  utine for xFinal
4700: 69 7a 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61  ize and xValue a
4710: 6e 64 20 77 68 69 63 68 20 6e 65 76 65 72 20 63  nd which never c
4720: 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e  all.** xInverse.
4730: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44   */.#define WIND
4740: 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72  OWFUNCX(name,nAr
4750: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4780: 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45  .  nArg, (SQLITE
4790: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8|SQLITE_FUN
47a0: 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c  C_WINDOW|extra),
47b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
47d0: 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63  name ## StepFunc
47e0: 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46  , name ## ValueF
47f0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
4800: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4810: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f           \.  noo
4820: 70 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20  pStepFunc, name 
4830: 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20  ## Name, {0}    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
4870: 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65  * Register those
4880: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4890: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
48a0: 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67  are not also agg
48b0: 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64  regates..*/.void
48c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75   sqlite3WindowFu
48d0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
48e0: 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20   static FuncDef 
48f0: 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d  aWindowFuncs[] =
4900: 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e   {.    WINDOWFUN
4910: 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  CX(row_number, 0
4920: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4930: 46 55 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b  FUNCX(dense_rank
4940: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
4950: 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30  DOWFUNCX(rank, 0
4960: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4970: 46 55 4e 43 41 4c 4c 28 70 65 72 63 65 6e 74 5f  FUNCALL(percent_
4980: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
4990: 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 63   WINDOWFUNCALL(c
49a0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 30 29 2c  ume_dist, 0, 0),
49b0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49c0: 4c 4c 28 6e 74 69 6c 65 2c 20 31 2c 20 30 29 2c  LL(ntile, 1, 0),
49d0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49e0: 4c 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31  LL(last_value, 1
49f0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4a00: 46 55 4e 43 41 4c 4c 28 6e 74 68 5f 76 61 6c 75  FUNCALL(nth_valu
4a10: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
4a20: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 66 69 72 73  NDOWFUNCALL(firs
4a30: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
4a40: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a50: 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c 0a  OP(lead, 1, 0),.
4a60: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a70: 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 0a  OP(lead, 2, 0),.
4a80: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a90: 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c 0a  OP(lead, 3, 0),.
4aa0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4ab0: 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a 20  OP(lag, 1, 0),. 
4ac0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
4ad0: 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20 20  P(lag, 2, 0),.  
4ae0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50    WINDOWFUNCNOOP
4af0: 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d  (lag, 3, 0),.  }
4b00: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72  ;.  sqlite3Inser
4b10: 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57  tBuiltinFuncs(aW
4b20: 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61  indowFuncs, Arra
4b30: 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e  ySize(aWindowFun
4b40: 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  cs));.}..static 
4b50: 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46 69  Window *windowFi
4b60: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4b70: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c  , Window *pList,
4b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4b90: 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  me){.  Window *p
4ba0: 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
4bb0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69   p; p=p->pNextWi
4bc0: 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  n){.    if( sqli
4bd0: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4be0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
4bf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
4c00: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
4c10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c20: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 77  arse, "no such w
4c30: 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61 6d  indow: %s", zNam
4c40: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4c50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
4c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4c70: 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
4c80: 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   after resolving
4c90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
4ca0: 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64  me.** for a wind
4cb0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
4cc0: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
4cd0: 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20  ement. Argument 
4ce0: 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69  pList is a.** li
4cf0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e  nked list of WIN
4d00: 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  DOW definitions 
4d10: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
4d20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4d30: 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46  ..** Argument pF
4d40: 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63 74  unc is the funct
4d50: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a  ion definition j
4d60: 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64  ust resolved and
4d70: 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20   pWin.** is the 
4d80: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65  Window object re
4d90: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61  presenting the a
4da0: 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63  ssociated OVER c
4db0: 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66  lause. This.** f
4dc0: 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
4dd0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4de0: 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  pWin as follows:
4df0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
4e00: 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65  e OVER clause re
4e10: 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64  fered to a named
4e20: 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22   window (as in "
4e30: 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22  max(x) OVER win"
4e40: 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68  ),.**     search
4e50: 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20   list pList for 
4e60: 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f  a matching WINDO
4e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e  W definition, an
4e80: 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a  d update pWin.**
4e90: 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79       accordingly
4ea0: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e  . If no such WIN
4eb0: 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62  DOW clause can b
4ec0: 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61  e found, leave a
4ed0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69  n error.**     i
4ee0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  n pParse..**.** 
4ef0: 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74    * If the funct
4f00: 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69  ion is a built-i
4f10: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
4f20: 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  n that requires 
4f30: 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  the.**     windo
4f40: 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20  w to be coerced 
4f50: 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57  (see "BUILT-IN W
4f60: 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22  INDOW FUNCTIONS"
4f70: 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20   at the top.**  
4f80: 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29     of this file)
4f90: 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74 65  , pWin is update
4fa0: 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d here..*/.void 
4fb0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64  sqlite3WindowUpd
4fc0: 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ate(.  Parse *pP
4fd0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
4fe0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
5000: 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77   of named window
5010: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
5020: 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70  T */.  Window *p
5030: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
5040: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5050: 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65   frame to update
5060: 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70   */.  FuncDef *p
5070: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Func            
5080: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
5090: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
50a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ion */.){.  if( 
50b0: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70  pWin->zName && p
50c0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 30  Win->eFrmType==0
50d0: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
50e0: 70 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70  p = windowFind(p
50f0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57  Parse, pList, pW
5100: 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  in->zName);.    
5110: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5120: 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  n;.    pWin->pPa
5130: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
5140: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
5150: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72  rse->db, p->pPar
5160: 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
5170: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
5180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5190: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
51a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  p->pOrderBy, 0);
51b0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72  .    pWin->pStar
51c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
51d0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
51e0: 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
51f0: 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73    pWin->pEnd = s
5200: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
5210: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e  arse->db, p->pEn
5220: 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  d, 0);.    pWin-
5230: 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
5240: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
5250: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
5260: 20 20 20 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70     pWin->eFrmTyp
5270: 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79 70 65 3b  e = p->eFrmType;
5280: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5290: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
52a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
52b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
52c0: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
52d0: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
52e0: 66 28 20 28 70 57 69 6e 2d 3e 65 46 72 6d 54 79  f( (pWin->eFrmTy
52f0: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20  pe==TK_RANGE).  
5300: 20 26 26 20 28 70 57 69 6e 2d 3e 70 53 74 61 72   && (pWin->pStar
5310: 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29  t || pWin->pEnd)
5320: 20 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70   .   && (pWin->p
5330: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57  OrderBy==0 || pW
5340: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
5350: 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20  xpr!=1).  ){.   
5360: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5370: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5380: 22 52 41 4e 47 45 20 77 69 74 68 20 6f 66 66 73  "RANGE with offs
5390: 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c  et PRECEDING/FOL
53a0: 4c 4f 57 49 4e 47 20 72 65 71 75 69 72 65 73 20  LOWING requires 
53b0: 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  one ORDER BY exp
53c0: 72 65 73 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a  ression".    );.
53d0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 46    }else.  if( pF
53e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
53f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
5400: 44 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DOW ){.    sqlit
5410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5420: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69  >db;.    if( pWi
5430: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5450: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
5460: 20 20 20 20 20 20 20 22 46 49 4c 54 45 52 20 63         "FILTER c
5470: 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62  lause may only b
5480: 65 20 75 73 65 64 20 77 69 74 68 20 61 67 67 72  e used with aggr
5490: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
54a0: 63 74 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b  ctions".      );
54b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
54c0: 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 55    struct WindowU
54d0: 70 64 61 74 65 20 7b 0a 20 20 20 20 20 20 20 20  pdate {.        
54e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
54f0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
5500: 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 20  FrmType;.       
5510: 20 69 6e 74 20 65 53 74 61 72 74 3b 0a 20 20 20   int eStart;.   
5520: 20 20 20 20 20 69 6e 74 20 65 45 6e 64 3b 0a 20       int eEnd;. 
5530: 20 20 20 20 20 7d 20 61 55 70 5b 5d 20 3d 20 7b       } aUp[] = {
5540: 0a 20 20 20 20 20 20 20 20 7b 20 72 6f 77 5f 6e  .        { row_n
5550: 75 6d 62 65 72 4e 61 6d 65 2c 20 20 20 54 4b 5f  umberName,   TK_
5560: 52 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  ROWS,   TK_UNBOU
5570: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
5580: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 64   }, .        { d
5590: 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 2c 20 20  ense_rankName,  
55a0: 20 54 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55   TK_RANGE,  TK_U
55b0: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
55c0: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20  RENT }, .       
55d0: 20 7b 20 72 61 6e 6b 4e 61 6d 65 2c 20 20 20 20   { rankName,    
55e0: 20 20 20 20 20 54 4b 5f 52 41 4e 47 45 2c 20 20       TK_RANGE,  
55f0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5600: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
5610: 20 20 20 20 20 7b 20 70 65 72 63 65 6e 74 5f 72       { percent_r
5620: 61 6e 6b 4e 61 6d 65 2c 20 54 4b 5f 47 52 4f 55  ankName, TK_GROU
5630: 50 53 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20  PS, TK_CURRENT, 
5640: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d    TK_UNBOUNDED }
5650: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 63 75 6d  , .        { cum
5660: 65 5f 64 69 73 74 4e 61 6d 65 2c 20 20 20 20 54  e_distName,    T
5670: 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 46 4f 4c  K_GROUPS, TK_FOL
5680: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
5690: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
56a0: 20 7b 20 6e 74 69 6c 65 4e 61 6d 65 2c 20 20 20   { ntileName,   
56b0: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
56c0: 54 4b 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b  TK_CURRENT,   TK
56d0: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
56e0: 20 20 20 20 20 20 20 7b 20 6c 65 61 64 4e 61 6d         { leadNam
56f0: 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  e,         TK_RO
5700: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
5710: 45 44 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  ED, TK_UNBOUNDED
5720: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6c   }, .        { l
5730: 61 67 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  agName,         
5740: 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 55   TK_ROWS,   TK_U
5750: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
5760: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 7d  RENT }, .      }
5770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5780: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5790: 41 72 72 61 79 53 69 7a 65 28 61 55 70 29 3b 20  ArraySize(aUp); 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
57b0: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
57c0: 61 55 70 5b 69 5d 2e 7a 46 75 6e 63 20 29 7b 0a  aUp[i].zFunc ){.
57d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
57e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
57f0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
5800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5820: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
5830: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64        pWin->pEnd
5840: 20 3d 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20   = pWin->pStart 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
5860: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20  Win->eFrmType = 
5870: 61 55 70 5b 69 5d 2e 65 46 72 6d 54 79 70 65 3b  aUp[i].eFrmType;
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5890: 3e 65 53 74 61 72 74 20 3d 20 61 55 70 5b 69 5d  >eStart = aUp[i]
58a0: 2e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  .eStart;.       
58b0: 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20     pWin->eEnd = 
58c0: 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20 20 20  aUp[i].eEnd;.   
58d0: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 78         pWin->eEx
58e0: 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
58f0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65       if( pWin->e
5900: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
5910: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
5920: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
5930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
5940: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 31  , TK_INTEGER, "1
5950: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
5960: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5980: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
5990: 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  Win->pFunc = pFu
59a0: 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  nc;.}../*.** Con
59b0: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
59c0: 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74  ed through sqlit
59d0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29  e3WalkExprList()
59e0: 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e   to.** selectWin
59f0: 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62  dowRewriteExprCb
5a00: 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  () by selectWind
5a10: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5a30: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
5a40: 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b  e WindowRewrite;
5a50: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65  .struct WindowRe
5a60: 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77  write {.  Window
5a70: 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73   *pWin;.  SrcLis
5a80: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
5a90: 69 73 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c  ist *pSub;.  Sel
5aa0: 65 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b  ect *pSubSelect;
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 43 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65  Current sub-sele
5ad0: 63 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b  ct, if any */.};
5ae0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
5af0: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
5b00: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
5b10: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66  writeEList(). If
5b20: 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74   necessary,.** t
5b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
5b40: 65 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ends to the outp
5b50: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
5b60: 73 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a  st and updates .
5b70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a  ** expression (*
5b80: 70 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65  ppExpr) in place
5b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ba0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5bb0: 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  iteExprCb(Walker
5bc0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
5bd0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63  *pExpr){.  struc
5be0: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
5bf0: 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
5c00: 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73  pRewrite;.  Pars
5c10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
5c20: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  ker->pParse;..  
5c30: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
5c40: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
5c50: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
5c60: 61 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c  a scalar sub-sel
5c70: 65 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73  ect.  ** that us
5c80: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
5c90: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5ca0: 20 70 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79   processed, only
5cb0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b   process.  ** TK
5cc0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
5cd0: 6f 6e 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ons that refer t
5ce0: 6f 20 69 74 20 28 74 68 65 20 6f 75 74 65 72 20  o it (the outer 
5cf0: 53 45 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a  SELECT). Do.  **
5d00: 20 6e 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67   not process agg
5d10: 72 65 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f  regates or windo
5d20: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61  w functions at a
5d30: 6c 6c 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f  ll, as they belo
5d40: 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ng.  ** to the s
5d50: 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74  calar sub-select
5d60: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5d70: 53 75 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  SubSelect ){.   
5d80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
5d90: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
5da0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
5db0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
5dc0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72  e{.      int nSr
5dd0: 63 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  c = p->pSrc->nSr
5de0: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  c;.      int i;.
5df0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5e00: 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
5e10: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5e20: 69 54 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d  iTable==p->pSrc-
5e30: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
5e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5e50: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63       if( i==nSrc
5e60: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
5e70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5e80: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
5e90: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63  pr->op ){..    c
5ea0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5eb0: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
5ec0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5ed0: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
5ee0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5ef0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f00: 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57        Window *pW
5f10: 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  in;.        for(
5f20: 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57  pWin=p->pWin; pW
5f30: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
5f40: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
5f50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79      if( pExpr->y
5f60: 2e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20  .pWin==pWin ){. 
5f70: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5f80: 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d  t( pWin->pOwner=
5f90: 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  =pExpr );.      
5fa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
5fb0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
5fc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
5fe0: 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f  all through.  */
5ff0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
6000: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
6010: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
6020: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
6030: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
6040: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
6050: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
6060: 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74   p->pSub = sqlit
6070: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6080: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62  (pParse, p->pSub
6090: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
60a0: 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20  f( p->pSub ){.  
60b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
60c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
60d0: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d  xpr, EP_Static)=
60e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  =0 );.        Ex
60f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6100: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
6110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6120: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6130: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
6140: 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
6150: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6160: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
6170: 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72      memset(pExpr
6180: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6190: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ));..        pEx
61a0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
61b0: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  MN;.        pExp
61c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  r->iColumn = p->
61d0: 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  pSub->nExpr-1;. 
61e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
61f0: 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e  able = p->pWin->
6200: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d  iEphCsr;.      }
6210: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
6220: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
6230: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
6240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6250: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
6260: 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
6270: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
6280: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6290: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
62a0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
62b0: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  t){.  struct Win
62c0: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
62d0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
62e0: 69 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ite;.  Select *p
62f0: 53 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65  Save = p->pSubSe
6300: 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76  lect;.  if( pSav
6310: 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e==pSelect ){.  
6320: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6330: 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tinue;.  }else{.
6340: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
6350: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
6360: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
6370: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
6380: 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75  ect);.    p->pSu
6390: 62 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b  bSelect = pSave;
63a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
63b0: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
63c0: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
63d0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
63e0: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
63f0: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
6400: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
6410: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
6420: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
6430: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
6440: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
6450: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
6460: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
6470: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
6480: 68 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f  he .**     Windo
6490: 77 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  w list passed as
64a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
64b0: 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a  ment (pWin)..**.
64c0: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f  ** Append the no
64d0: 64 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70  de to output exp
64e0: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70  ression-list (*p
64f0: 70 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61  pSub). And repla
6500: 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20  ce it.** with a 
6510: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
6520: 65 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68  eads the (N-1)th
6530: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c   element of tabl
6540: 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68  e .** pWin->iEph
6550: 43 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  Csr, where N is 
6560: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
6570: 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75  ements in (*ppSu
6580: 62 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65  b) after.** appe
6590: 6e 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  nding the new on
65a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
65b0: 64 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  d selectWindowRe
65c0: 77 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61  writeEList(.  Pa
65d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
65e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20  Window *pWin,.  
65f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20  SrcList *pSrc,. 
6600: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6610: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
6620: 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72   /* Rewrite expr
6630: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
6640: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  list */.  ExprLi
6650: 73 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20  st **ppSub      
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
6670: 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20  OUT: Sub-select 
6680: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
6690: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73  */.){.  Walker s
66a0: 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77  Walker;.  Window
66b0: 52 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65  Rewrite sRewrite
66c0: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  ;..  memset(&sWa
66d0: 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
66e0: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Walker));.  mems
66f0: 65 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c  et(&sRewrite, 0,
6700: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65   sizeof(WindowRe
6710: 77 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77  write));..  sRew
6720: 72 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53  rite.pSub = *ppS
6730: 75 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70  ub;.  sRewrite.p
6740: 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52  Win = pWin;.  sR
6750: 65 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53  ewrite.pSrc = pS
6760: 72 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70  rc;..  sWalker.p
6770: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
6780: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
6790: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
67a0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
67b0: 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rCb;.  sWalker.x
67c0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
67d0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
67e0: 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20  riteSelectCb;.  
67f0: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69  sWalker.u.pRewri
6800: 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a  te = &sRewrite;.
6810: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
6820: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57  WalkExprList(&sW
6830: 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a  alker, pEList);.
6840: 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77  .  *ppSub = sRew
6850: 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a  rite.pSub;.}../*
6860: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70  .** Append a cop
6870: 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73  y of each expres
6880: 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69  sion in expressi
6890: 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20  on-list pAppend 
68a0: 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  to.** expression
68b0: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74   list pList. Ret
68c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
68d0: 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74   the result list
68e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
68f0: 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70  List *exprListAp
6900: 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73  pendList(.  Pars
6910: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6920: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6930: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
6940: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
6950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
6960: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
6970: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6980: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70  .  ExprList *pAp
6990: 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69  pend       /* Li
69a0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  st of values to 
69b0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
69c0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
69d0: 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20  ( pAppend ){.   
69e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
69f0: 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20  nInit = pList ? 
6a00: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
6a10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6a20: 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b  <pAppend->nExpr;
6a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
6a40: 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65  r *pDup = sqlite
6a50: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
6a60: 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b  >db, pAppend->a[
6a70: 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
6a80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6a90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6aa0: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
6ab0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
6ac0: 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d  ( pList ) pList-
6ad0: 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74  >a[nInit+i].sort
6ae0: 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d  Order = pAppend-
6af0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
6b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6b10: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
6b20: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
6b30: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
6b40: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6b50: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
6b60: 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79  ot invoke.** any
6b70: 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63   SQL window func
6b80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63  tions, this func
6b90: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6ba0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a   Otherwise, it .
6bb0: 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20  ** rewrites the 
6bc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6bd0: 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20   so that window 
6be0: 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66  function xStep f
6bf0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
6c00: 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63  invoked in the c
6c10: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20  orrect order as 
6c20: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20  described under 
6c30: 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e  "SELECT REWRITIN
6c40: 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70  G".** at the top
6c50: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
6c60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
6c70: 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65  dowRewrite(Parse
6c80: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6c90: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
6ca0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
6cb0: 28 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e  ( p->pWin && p->
6cc0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
6cd0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6ce0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  );.    sqlite3 *
6d00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6d10: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
6d20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
6d30: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
6d40: 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ry */.    SrcLis
6d50: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
6d60: 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68  c;.    Expr *pWh
6d70: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
6d80: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6d90: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
6da0: 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20  oupBy;.    Expr 
6db0: 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48  *pHaving = p->pH
6dc0: 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c  aving;.    ExprL
6dd0: 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a  ist *pSort = 0;.
6de0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6df0: 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Sublist = 0;    
6e00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6e10: 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75   list for sub-qu
6e20: 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ery */.    Windo
6e30: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
6e40: 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74  in;      /* Mast
6e50: 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  er window object
6e60: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
6e70: 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  pWin;           
6e80: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
6e90: 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
6ea0: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  */..    p->pSrc 
6eb0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  = 0;.    p->pWhe
6ec0: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  re = 0;.    p->p
6ed0: 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20  GroupBy = 0;.   
6ee0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b   p->pHaving = 0;
6ef0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6f00: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6f10: 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d  use for the sub-
6f20: 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
6f30: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
6f40: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
6f50: 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e  window PARTITION
6f60: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
6f70: 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20  auses. Then, if 
6f80: 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20  this makes it.  
6f90: 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20    ** redundant, 
6fa0: 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52  remove the ORDER
6fb0: 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72   BY from the par
6fc0: 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a  ent SELECT.  */.
6fd0: 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69      pSort = sqli
6fe0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6ff0: 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  b, pMWin->pParti
7000: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53  tion, 0);.    pS
7010: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
7020: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
7030: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
7040: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
7050: 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f  ( pSort && p->pO
7060: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
7070: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
7080: 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74  istCompare(pSort
7090: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d  , p->pOrderBy, -
70a0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
70b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
70c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
70d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
70e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
70f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7100: 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  .    /* Assign a
7110: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
7120: 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  or the ephemeral
7130: 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62   table used to b
7140: 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20  uffer rows..    
7150: 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d  ** The OpenEphem
7160: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
7170: 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c   is coded later,
7180: 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f   after it is kno
7190: 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61  wn how.    ** ma
71a0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74  ny columns the t
71b0: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20  able will have. 
71c0: 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69   */.    pMWin->i
71d0: 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d  EphCsr = pParse-
71e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61  >nTab++;.    pPa
71f0: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a  rse->nTab += 3;.
7200: 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f  .    selectWindo
7210: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50  wRewriteEList(pP
7220: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72  arse, pMWin, pSr
7230: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  c, p->pEList, &p
7240: 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65  Sublist);.    se
7250: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
7260: 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  eEList(pParse, p
7270: 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70  MWin, pSrc, p->p
7280: 4f 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69  OrderBy, &pSubli
7290: 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  st);.    pMWin->
72a0: 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53  nBufferCol = (pS
72b0: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
72c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  t->nExpr : 0);..
72d0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
72e0: 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61  e PARTITION BY a
72f0: 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  nd ORDER BY expr
7300: 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74  essions to the t
7310: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
7320: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
7330: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61  ion list. They a
7340: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  re required to f
7350: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
7360: 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69  .    ** boundari
7370: 65 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e  es for partition
7380: 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65  s and sets of pe
7390: 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f  er rows lie.  */
73a0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
73b0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
73c0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
73d0: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72  ist, pMWin->pPar
73e0: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75  tition);.    pSu
73f0: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
7400: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
7410: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
7420: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a  in->pOrderBy);..
7430: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
7440: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
7450: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
7460: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
7470: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
7480: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
7490: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
74a0: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
74b0: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
74c0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
74d0: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
74e0: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
74f0: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
7500: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
7510: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
7520: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
7530: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
7540: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
7550: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
7560: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
7570: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
7580: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
7590: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
75a0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75b0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
75c0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
75d0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
75e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  r ){.        Exp
75f0: 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  r *pFilter = sql
7600: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7610: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30  pWin->pFilter, 0
7620: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c  );.        pSubl
7630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
7640: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7650: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46  se, pSublist, pF
7660: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
7670: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
7680: 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ccum = ++pParse-
7690: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69  >nMem;.      pWi
76a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b  n->regResult = +
76b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
76e0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
76f0: 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ccum);.    }..  
7700: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7710: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
7720: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61  PARTITION BY cla
7730: 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e  use, and the win
7740: 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  dow.    ** funct
7750: 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f  ion accepts zero
7760: 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20   arguments, and 
7770: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
7780: 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  er columns.    *
7790: 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e  * selected (e.g.
77a0: 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d   "SELECT row_num
77b0: 62 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52  ber() OVER () FR
77c0: 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70  OM t1"), it is p
77d0: 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74  ossible.    ** t
77e0: 68 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20  hat pSublist is 
77f0: 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e  still NULL here.
7800: 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20   Add a constant 
7810: 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20  expression here 
7820: 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20  to .    ** keep 
7830: 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c  everything legal
7840: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a   in this case. .
7850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
7860: 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Sublist==0 ){.  
7870: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73      pSublist = s
7880: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7890: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
78a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
78b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
78c0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
78d0: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
78e0: 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
78f0: 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20    }..    pSub = 
7900: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
7910: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
7920: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63  , pSublist, pSrc
7930: 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
7940: 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f  By, pHaving, pSo
7950: 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  rt, 0, 0.    );.
7960: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71      p->pSrc = sq
7970: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
7980: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
7990: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
79a0: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  pSrc ){.      p-
79b0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
79c0: 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20  ect = pSub;.    
79d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
79e0: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
79f0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
7a00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7a10: 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28  3ExpandSubquery(
7a20: 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63  pParse, &p->pSrc
7a30: 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ->a[0]) ){.     
7a40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7a50: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
7a60: 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  e{.        pSub-
7a70: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
7a80: 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20  Expanded;.      
7a90: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
7aa0: 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
7ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7ac0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7ad0: 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20  , pSub, 0);.    
7ae0: 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
7af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7b00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7b10: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7b20: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
7b30: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7b40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7b50: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
7b60: 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57  ->iEphCsr+1, pMW
7b70: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7ba0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
7bb0: 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+2, pMWin->iE
7bc0: 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71  phCsr);.      sq
7bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7be0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7bf0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c  MWin->iEphCsr+3,
7c00: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7c30: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29  Delete(db, pSub)
7c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7c50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c60: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
7c70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
7c80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7c90: 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77   Free the Window
7ca0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
7cb0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7cc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7cd0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7ce0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7cf0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66  Window *p){.  if
7d00: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
7d10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7d20: 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20   p->pFilter);.  
7d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7d40: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
7d50: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
7d60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7d70: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
7d80: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
7d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7da0: 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  , p->pEnd);.    
7db0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7dc0: 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29  e(db, p->pStart)
7dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7de0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ree(db, p->zName
7df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
7e00: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73  Free(db, p->zBas
7e10: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
7e20: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
7e40: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
7e50: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
7e60: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
7e70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7e90: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
7ea0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7eb0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
7ec0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
7ed0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
7ee0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
7ef0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7f00: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
7f10: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
7f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
7f30: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
7f40: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
7f50: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
7f60: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
7f70: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
7f80: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
7f90: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
7fa0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
7fb0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
7fc0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
7fd0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
7fe0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
7ff0: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
8000: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
8010: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
8020: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
8030: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
8040: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
8050: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
8070: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
8080: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
8090: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
80a0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
80b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
80c0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
80d0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
80e0: 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74  E_OBJECT ) sqlit
80f0: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8100: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
8110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8120: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8130: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
8140: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8150: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
8160: 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
8170: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
8180: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
8190: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
81a0: 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64  eturn a new Wind
81b0: 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  ow object descri
81c0: 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65  bing a Window De
81d0: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e  finition..*/.Win
81e0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
81f0: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
8200: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8210: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8220: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20  */.  int eType, 
8230: 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
8240: 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 2c 20  type. TK_RANGE, 
8250: 54 4b 5f 52 4f 57 53 2c 20 54 4b 5f 47 52 4f 55  TK_ROWS, TK_GROU
8260: 50 53 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 69 6e  PS, or 0 */.  in
8270: 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20  t eStart,       
8280: 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43  /* Start type: C
8290: 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e  URRENT, PRECEDIN
82a0: 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e  G, FOLLOWING, UN
82b0: 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70  BOUNDED */.  Exp
82c0: 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  r *pStart,     /
82d0: 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73  * Start window s
82e0: 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44  ize if TK_PRECED
82f0: 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47  ING or FOLLOWING
8300: 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20   */.  int eEnd, 
8310: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74          /* End t
8320: 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f  ype: CURRENT, FO
8330: 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f  LLOWING, TK_UNBO
8340: 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47  UNDED, PRECEDING
8350: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64   */.  Expr *pEnd
8360: 2c 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77  ,       /* End w
8370: 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b  indow size if TK
8380: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52  _FOLLOWING or PR
8390: 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 75 38 20  ECEDING */.  u8 
83a0: 65 45 78 63 6c 75 64 65 20 20 20 20 20 20 20 2f  eExclude       /
83b0: 2a 20 45 58 43 4c 55 44 45 20 63 6c 61 75 73 65  * EXCLUDE clause
83c0: 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
83d0: 2a 70 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  *pWin = 0;.  int
83e0: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
83f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  = 0;..  /* Parse
8400: 72 20 61 73 73 75 72 65 73 20 74 68 65 20 66 6f  r assures the fo
8410: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73  llowing: */.  as
8420: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c  sert( eType==0 |
8430: 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  | eType==TK_RANG
8440: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  E || eType==TK_R
8450: 4f 57 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  OWS || eType==TK
8460: 5f 47 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73  _GROUPS );.  ass
8470: 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f  ert( eStart==TK_
8480: 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72  CURRENT || eStar
8490: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a  t==TK_PRECEDING.
84a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53             || eS
84b0: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
84c0: 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b  ED || eStart==TK
84d0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20  _FOLLOWING );.  
84e0: 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b  assert( eEnd==TK
84f0: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64  _CURRENT || eEnd
8500: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20  ==TK_FOLLOWING. 
8510: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e            || eEn
8520: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
8530: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
8540: 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72  EDING );.  asser
8550: 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50  t( (eStart==TK_P
8560: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61  RECEDING || eSta
8570: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
8580: 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29  )==(pStart!=0) )
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 45 6e  ;.  assert( (eEn
85a0: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
85b0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
85c0: 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30  EDING)==(pEnd!=0
85d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ) );..  if( eTyp
85e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70  e==0 ){.    bImp
85f0: 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a  licitFrame = 1;.
8600: 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52      eType = TK_R
8610: 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ANGE;.  }..  /* 
8620: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
8630: 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20  e.  ** starting 
8640: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61  boundary type ma
8650: 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c  y not occur earl
8660: 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ier in the follo
8670: 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20  wing list than. 
8680: 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62   ** the ending b
8690: 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20  oundary type:.  
86a0: 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e  **.  **   UNBOUN
86b0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20  DED PRECEDING.  
86c0: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43  **   <expr> PREC
86d0: 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52  EDING.  **   CUR
86e0: 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20  RENT ROW.  **   
86f0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
8700: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
8710: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
8720: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72  .  ** The parser
8730: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22 55   ensures that "U
8740: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8750: 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  NG" cannot be us
8760: 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a  ed as an ending.
8770: 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61    ** boundary, a
8780: 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44  nd than "UNBOUND
8790: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61  ED FOLLOWING" ca
87a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20  nnot be used as 
87b0: 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  a starting.  ** 
87c0: 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a  frame boundary..
87d0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61    */.  if( (eSta
87e0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
87f0: 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  & eEnd==TK_PRECE
8800: 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74  DING).   || (eSt
8810: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
8820: 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50  G && (eEnd==TK_P
8830: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64  RECEDING || eEnd
8840: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20  ==TK_CURRENT)). 
8850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8860: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8870: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61  "unsupported fra
8880: 6d 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  me specification
8890: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e  ");.    goto win
88a0: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d  dowAllocErr;.  }
88b0: 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64  ..  pWin = (Wind
88c0: 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  ow*)sqlite3DbMal
88d0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
88e0: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
88f0: 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d  w));.  if( pWin=
8900: 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77  =0 ) goto window
8910: 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e  AllocErr;.  pWin
8920: 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 65 54 79  ->eFrmType = eTy
8930: 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61  pe;.  pWin->eSta
8940: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70  rt = eStart;.  p
8950: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64  Win->eEnd = eEnd
8960: 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75 64 65  ;.  if( eExclude
8970: 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  ==0 && Optimizat
8980: 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
8990: 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 51  se->db, SQLITE_Q
89a0: 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
89b0: 7b 0a 20 20 20 20 65 45 78 63 6c 75 64 65 20 3d  {.    eExclude =
89c0: 20 54 4b 5f 4e 4f 3b 0a 20 20 7d 0a 20 20 70 57   TK_NO;.  }.  pW
89d0: 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 65  in->eExclude = e
89e0: 45 78 63 6c 75 64 65 3b 0a 20 20 70 57 69 6e 2d  Exclude;.  pWin-
89f0: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20  >bImplicitFrame 
8a00: 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65  = bImplicitFrame
8a10: 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  ;.  pWin->pEnd =
8a20: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66   sqlite3WindowOf
8a30: 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c  fsetExpr(pParse,
8a40: 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e   pEnd);.  pWin->
8a50: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
8a60: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
8a70: 28 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29  (pParse, pStart)
8a80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b  ;.  return pWin;
8a90: 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  ..windowAllocErr
8aa0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
8ab0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8ac0: 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74  , pEnd);.  sqlit
8ad0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
8ae0: 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29  rse->db, pStart)
8af0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
8b00: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 50 41  ./*.** Attach PA
8b10: 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45  RTITION and ORDE
8b20: 52 20 42 59 20 63 6c 61 75 73 65 73 20 70 50 61  R BY clauses pPa
8b30: 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f 72 64  rtition and pOrd
8b40: 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77 0a 2a  erBy to window.*
8b50: 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20 69 66  * pWin. Also, if
8b60: 20 70 61 72 61 6d 65 74 65 72 20 70 42 61 73 65   parameter pBase
8b70: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65   is not NULL, se
8b80: 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 74 6f  t pWin->zBase to
8b90: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
8ba0: 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  nt nul-terminate
8bb0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e  d string..*/.Win
8bc0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
8bd0: 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20 50 61  owAssemble(.  Pa
8be0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
8bf0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 0a 20  Window *pWin, . 
8c00: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
8c10: 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72 4c 69  ition, .  ExprLi
8c20: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 0a 20  st *pOrderBy, . 
8c30: 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a 29 7b   Token *pBase.){
8c40: 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20  .  if( pWin ){. 
8c50: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
8c60: 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69 6f 6e  ion = pPartition
8c70: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
8c80: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
8c90: 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 20 29  .    if( pBase )
8ca0: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42  {.      pWin->zB
8cb0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
8cc0: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
8cd0: 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70 42 61  b, pBase->z, pBa
8ce0: 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  se->n);.    }.  
8cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8d00: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8d10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
8d20: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
8d30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8d40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
8d50: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
8d60: 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a   return pWin;.}.
8d70: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20 2a 70  ./*.** Window *p
8d80: 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62 65 65  Win has just bee
8d90: 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d 20 61  n created from a
8da0: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 2e 20   WINDOW clause. 
8db0: 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a 20 69  Tokne pBase.** i
8dc0: 73 20 74 68 65 20 62 61 73 65 20 77 69 6e 64 6f  s the base windo
8dd0: 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e 64 6f  w. Earlier windo
8de0: 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ws from the same
8df0: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 61   WINDOW clause a
8e00: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
8e10: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
8e20: 73 74 61 72 74 69 6e 67 20 61 74 20 70 57 69 6e  starting at pWin
8e30: 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68 69 73  ->pNextWin. This
8e40: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65 69 74   function.** eit
8e50: 68 65 72 20 75 70 64 61 74 65 73 20 2a 70 57 69  her updates *pWi
8e60: 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  n according to t
8e70: 68 65 20 62 61 73 65 20 73 70 65 63 69 66 69 63  he base specific
8e80: 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a  ation, or else.*
8e90: 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  * leaves an erro
8ea0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  r in pParse..*/.
8eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
8ec0: 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20 2a 70  owChain(Parse *p
8ed0: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
8ee0: 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69  Win, Window *pLi
8ef0: 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d  st){.  if( pWin-
8f00: 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20 73 71  >zBase ){.    sq
8f10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8f20: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69 6e 64  se->db;.    Wind
8f30: 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77 69 6e  ow *pExist = win
8f40: 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65 2c 20  dowFind(pParse, 
8f50: 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a 42 61  pList, pWin->zBa
8f60: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  se);.    if( pEx
8f70: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ist ){.      con
8f80: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
8f90: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  0;.      /* Chec
8fa0: 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  k for errors */.
8fb0: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
8fc0: 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
8fd0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 50 41        zErr = "PA
8fe0: 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 22 3b  RTITION clause";
8ff0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9000: 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42   pExist->pOrderB
9010: 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72 64 65  y && pWin->pOrde
9020: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  rBy ){.        z
9030: 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42 59 20  Err = "ORDER BY 
9040: 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20 20 7d  clause";.      }
9050: 65 6c 73 65 20 69 66 28 20 70 45 78 69 73 74 2d  else if( pExist-
9060: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 3d  >bImplicitFrame=
9070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
9080: 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70 65 63  rr = "frame spec
9090: 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20 20 20  ification";.    
90a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
90b0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
90c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
90d0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
90e0: 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65 72 72     "cannot overr
90f0: 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64 6f 77  ide %s of window
9100: 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70 57 69  : %s", zErr, pWi
9110: 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20 20 20  n->zBase.       
9120: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
9130: 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70  .        pWin->p
9140: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
9150: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9160: 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61 72 74  b, pExist->pPart
9170: 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ition, 0);.     
9180: 20 20 20 69 66 28 20 70 45 78 69 73 74 2d 3e 70     if( pExist->p
9190: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
91a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
91b0: 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  n->pOrderBy==0 )
91c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e  ;.          pWin
91d0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
91e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
91f0: 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f 72 64  db, pExist->pOrd
9200: 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  erBy, 0);.      
9210: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
9220: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
9230: 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20  in->zBase);.    
9240: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
9250: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9260: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9270: 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20 6f 62  Attach window ob
9280: 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65 78 70  ject pWin to exp
9290: 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f  ression p..*/.vo
92a0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
92b0: 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70 50  Attach(Parse *pP
92c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 57  arse, Expr *p, W
92d0: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
92e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
92f0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ert( p->op==TK_F
9300: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 2f  UNCTION );.    /
9310: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9320: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
9330: 72 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 49  r the parser.  I
9340: 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74 0a 20  f pWin was not. 
9350: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
9360: 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74  due to an OOM, t
9370: 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 77  hen the parser w
9380: 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f 72 65  ould fail before
9390: 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69 6e 76   ever.    ** inv
93a0: 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
93b0: 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c  ne */.    if( AL
93c0: 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a 20 20  WAYS(pWin) ){.  
93d0: 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20 3d 20      p->y.pWin = 
93e0: 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78 70 72  pWin;.      Expr
93f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
9400: 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20 20 20  P_WinFunc);.    
9410: 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d    pWin->pOwner =
9420: 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   p;.      if( p-
9430: 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
9440: 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
9450: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9460: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
9470: 20 20 20 22 44 49 53 54 49 4e 43 54 20 69 73 20     "DISTINCT is 
9480: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  not supported fo
9490: 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  r window functio
94a0: 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns");.      }.  
94b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
94c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
94d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
94e0: 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWin);.  }.}../
94f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
9500: 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20   the two window 
9510: 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e  objects are iden
9520: 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  tical, or non-ze
9530: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
9540: 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f   Identical windo
9550: 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65  w objects can be
9560: 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20   processed in a 
9570: 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a  single scan..*/.
9580: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
9590: 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  wCompare(Parse *
95a0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
95b0: 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b  p1, Window *p2){
95c0: 0a 20 20 69 66 28 20 70 31 2d 3e 65 46 72 6d 54  .  if( p1->eFrmT
95d0: 79 70 65 21 3d 70 32 2d 3e 65 46 72 6d 54 79 70  ype!=p2->eFrmTyp
95e0: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
95f0: 69 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d  if( p1->eStart!=
9600: 70 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74  p2->eStart ) ret
9610: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d  urn 1;.  if( p1-
9620: 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20  >eEnd!=p2->eEnd 
9630: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
9640: 28 20 70 31 2d 3e 65 45 78 63 6c 75 64 65 21 3d  ( p1->eExclude!=
9650: 70 32 2d 3e 65 45 78 63 6c 75 64 65 20 29 20 72  p2->eExclude ) r
9660: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
9670: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
9680: 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 53  e(pParse, p1->pS
9690: 74 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72 74  tart, p2->pStart
96a0: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
96b0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
96c0: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
96d0: 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d  e, p1->pEnd, p2-
96e0: 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65 74  >pEnd, -1) ) ret
96f0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9700: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
9710: 61 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74 69  are(p1->pPartiti
9720: 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74 69  on, p2->pPartiti
9730: 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  on, -1) ) return
9740: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
9750: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
9760: 28 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  (p1->pOrderBy, p
9770: 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  2->pOrderBy, -1)
9780: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
9790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
97a0: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
97b0: 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c  d by code in sel
97c0: 65 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74 20  ect.c before it 
97d0: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65  calls sqlite3Whe
97e0: 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20  reBegin().** to 
97f0: 62 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67 20  begin iterating 
9800: 74 68 72 6f 75 67 68 20 74 68 65 20 73 75 62 2d  through the sub-
9810: 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20 49  query results. I
9820: 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  t is used to all
9830: 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  ocate.** and ini
9840: 74 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65 72  tialize register
9850: 73 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75 73  s and cursors us
9860: 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 69 6e  ed by sqlite3Win
9870: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a  dowCodeStep()..*
9880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
9890: 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61 72  ndowCodeInit(Par
98a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
98b0: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69  ow *pMWin){.  Wi
98c0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64  ndow *pWin;.  Vd
98d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
98e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
98f0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
9900: 65 67 69 73 74 65 72 73 20 74 6f 20 75 73 65 20  egisters to use 
9910: 66 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59  for PARTITION BY
9920: 20 76 61 6c 75 65 73 2c 20 69 66 20 61 6e 79 2e   values, if any.
9930: 20 49 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   Initialize.  **
9940: 20 73 61 69 64 20 72 65 67 69 73 74 65 72 73 20   said registers 
9950: 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69  to NULL.  */.  i
9960: 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
9970: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  tion ){.    int 
9980: 6e 45 78 70 72 20 3d 20 70 4d 57 69 6e 2d 3e 70  nExpr = pMWin->p
9990: 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72  Partition->nExpr
99a0: 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  ;.    pMWin->reg
99b0: 50 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Part = pParse->n
99c0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
99d0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
99e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
99f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
9a00: 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65  ll, 0, pMWin->re
9a10: 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  gPart, pMWin->re
9a20: 67 50 61 72 74 2b 6e 45 78 70 72 2d 31 29 3b 0a  gPart+nExpr-1);.
9a30: 20 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d 3e 72 65    }..  pMWin->re
9a40: 67 4f 6e 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gOne = ++pParse-
9a50: 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
9a60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9a70: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57  _Integer, 1, pMW
9a80: 69 6e 2d 3e 72 65 67 4f 6e 65 29 3b 0a 0a 20 20  in->regOne);..  
9a90: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c  if( pMWin->eExcl
9aa0: 75 64 65 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  ude ){.    pMWin
9ab0: 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20  ->regStartRowid 
9ac0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
9ad0: 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  ;.    pMWin->reg
9ae0: 45 6e 64 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  EndRowid = ++pPa
9af0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
9b00: 4d 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70  MWin->csrApp = p
9b10: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
9b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9b30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9b40: 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65  er, 1, pMWin->re
9b50: 67 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20  gStartRowid);.  
9b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9b80: 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
9b90: 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  EndRowid);.    s
9ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9bb0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
9bc0: 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70  pMWin->csrApp, p
9bd0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
9be0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9bf0: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
9c00: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
9c10: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
9c20: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20     FuncDef *p = 
9c30: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
9c40: 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61   if( (p->funcFla
9c50: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
9c60: 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e  _MINMAX) && pWin
9c70: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
9c80: 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
9c90: 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20 76 65  /* The inline ve
9ca0: 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20  rsions of min() 
9cb0: 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75 69 72  and max() requir
9cc0: 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68 65 6d  e a single ephem
9cd0: 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61  eral.      ** ta
9ce0: 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69 73 74  ble and 3 regist
9cf0: 65 72 73 2e 20 54 68 65 20 72 65 67 69 73 74 65  ers. The registe
9d00: 72 73 20 61 72 65 20 75 73 65 64 20 61 73 20 66  rs are used as f
9d10: 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
9d20: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41  .      **   regA
9d30: 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f  pp+0: slot to co
9d40: 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61  py min()/max() a
9d50: 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d  rgument to for M
9d60: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
9d70: 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a 20 69  **   regApp+1: i
9d80: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75 73 65  nteger value use
9d90: 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65 79 73  d to ensure keys
9da0: 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20 20 20   are unique.    
9db0: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 32 3a    **   regApp+2:
9dc0: 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b 65 52   output of MakeR
9dd0: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20  ecord.      */. 
9de0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
9df0: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
9e00: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
9e10: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
9e20: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
9e30: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
9e40: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
9e50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
9e60: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
9e70: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9e80: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
9e90: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9ea0: 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
9eb0: 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20  >nMem += 3;.    
9ec0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26    if( pKeyInfo &
9ed0: 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  & pWin->pFunc->z
9ee0: 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a  Name[1]=='i' ){.
9ef0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9f00: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
9f10: 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20  rder[0]==0 );.  
9f20: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
9f30: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20  aSortOrder[0] = 
9f40: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9f60: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
9f70: 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73  emeral, pWin->cs
9f80: 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20  rApp, 2);.      
9f90: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
9fa0: 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c  dP4(v, pKeyInfo,
9fb0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
9fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9fd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9fe0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
9ff0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gApp+1);.    }. 
a000: 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a     else if( p->z
a010: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
a020: 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d  ame || p->zName=
a030: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
a040: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
a050: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
a060: 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67  ers at pWin->reg
a070: 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20  App. These will 
a080: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20  be used to.     
a090: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74   ** store the st
a0a0: 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65  art and end inde
a0b0: 78 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  x of the current
a0c0: 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20   frame.  */.    
a0d0: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
a0e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a0f0: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
a100: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
a110: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  ab++;.      pPar
a120: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20  se->nMem += 2;. 
a130: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a140: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
a150: 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41  nDup, pWin->csrA
a160: 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  pp, pMWin->iEphC
a170: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  sr);.    }.    e
a180: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
a190: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d  ==leadName || p-
a1a0: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20  >zName==lagName 
a1b0: 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  ){.      pWin->c
a1c0: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
a1d0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nTab++;.      sq
a1e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a1f0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
a200: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57  Win->csrApp, pMW
a210: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
a220: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69    }.  }.}..#defi
a230: 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41 52 54 49  ne WINDOW_STARTI
a240: 4e 47 5f 49 4e 54 20 20 30 0a 23 64 65 66 69 6e  NG_INT  0.#defin
a250: 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f  e WINDOW_ENDING_
a260: 49 4e 54 20 20 20 20 31 0a 23 64 65 66 69 6e 65  INT    1.#define
a270: 20 57 49 4e 44 4f 57 5f 4e 54 48 5f 56 41 4c 55   WINDOW_NTH_VALU
a280: 45 5f 49 4e 54 20 32 0a 23 64 65 66 69 6e 65 20  E_INT 2.#define 
a290: 57 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f  WINDOW_STARTING_
a2a0: 4e 55 4d 20 20 33 0a 23 64 65 66 69 6e 65 20 57  NUM  3.#define W
a2b0: 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d  INDOW_ENDING_NUM
a2c0: 20 20 20 20 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22      4../*.** A "
a2d0: 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70 72 3e  PRECEDING <expr>
a2e0: 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f 72 20  " (eCond==0) or 
a2f0: 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72  "FOLLOWING <expr
a300: 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20 6f 72  >" (eCond==1) or
a310: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
a320: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
a330: 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75  ment to nth_valu
a340: 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29 20 68  e() (eCond==2) h
a350: 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20  as just been.** 
a360: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68  evaluated and th
a370: 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20 69 6e  e result left in
a380: 20 72 65 67 69 73 74 65 72 20 72 65 67 2e 20 54   register reg. T
a390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
a3a0: 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63 6f 64  erates VM.** cod
a3b0: 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  e to check that 
a3c0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
a3d0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
a3e0: 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73 20 61  ger and throws a
a3f0: 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69  n.** exception i
a400: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a  f it is not..*/.
a410: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
a420: 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 50 61 72  owCheckValue(Par
a430: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
a440: 72 65 67 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b  reg, int eCond){
a450: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a460: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
a470: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
a480: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
a490: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
a4a0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
a4b0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a4c0: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a4d0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
a4e0: 74 65 67 65 72 22 2c 0a 20 20 20 20 22 73 65 63  teger",.    "sec
a4f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
a500: 6e 74 68 5f 76 61 6c 75 65 20 6d 75 73 74 20 62  nth_value must b
a510: 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
a520: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
a530: 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65  e starting offse
a540: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
a550: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 22  negative number"
a560: 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64  ,.    "frame end
a570: 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20  ing offset must 
a580: 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  be a non-negativ
a590: 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a  e number",.  };.
a5a0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70    static int aOp
a5b0: 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50  [] = { OP_Ge, OP
a5c0: 5f 47 65 2c 20 4f 50 5f 47 74 2c 20 4f 50 5f 47  _Ge, OP_Gt, OP_G
a5d0: 65 2c 20 4f 50 5f 47 65 20 7d 3b 0a 20 20 56 64  e, OP_Ge };.  Vd
a5e0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a5f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a600: 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20    int regZero = 
a610: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a620: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  g(pParse);.  ass
a630: 65 72 74 28 20 65 43 6f 6e 64 3e 3d 30 20 26 26  ert( eCond>=0 &&
a640: 20 65 43 6f 6e 64 3c 41 72 72 61 79 53 69 7a 65   eCond<ArraySize
a650: 28 61 7a 45 72 72 29 20 29 3b 0a 20 20 73 71 6c  (azErr) );.  sql
a660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a670: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
a680: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 69 66 28   regZero);.  if(
a690: 20 65 43 6f 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53   eCond>=WINDOW_S
a6a0: 54 41 52 54 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20  TARTING_NUM ){. 
a6b0: 20 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e 67     int regString
a6c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a6d0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a6f0: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
a700: 38 2c 20 30 2c 20 72 65 67 53 74 72 69 6e 67 2c  8, 0, regString,
a710: 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49   0, "", P4_STATI
a720: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
a730: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a740: 47 65 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 73  Ge, regString, s
a750: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
a760: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29  tAddr(v)+2, reg)
a770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a780: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
a790: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 7c  ITE_AFF_NUMERIC|
a7a0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
a7b0: 4c 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  L);.    VdbeCove
a7c0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 73 73  rage(v);.    ass
a7d0: 65 72 74 28 20 65 43 6f 6e 64 3d 3d 33 20 7c 7c  ert( eCond==3 ||
a7e0: 20 65 43 6f 6e 64 3d 3d 34 20 29 3b 0a 20 20 20   eCond==4 );.   
a7f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
a800: 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20  v, eCond==3);.  
a810: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
a820: 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20  (v, eCond==4);. 
a830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
a840: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a850: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
a860: 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  eg, sqlite3VdbeC
a870: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
a880: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
a890: 67 65 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72  ge(v);.    asser
a8a0: 74 28 20 65 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65  t( eCond==0 || e
a8b0: 43 6f 6e 64 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64  Cond==1 || eCond
a8c0: 3d 3d 32 20 29 3b 0a 20 20 20 20 56 64 62 65 43  ==2 );.    VdbeC
a8d0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
a8e0: 6e 64 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  nd==0);.    Vdbe
a8f0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
a900: 6f 6e 64 3d 3d 31 29 3b 0a 20 20 20 20 56 64 62  ond==1);.    Vdb
a910: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a920: 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 7d 0a 20 20  Cond==2);.  }.  
a930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a940: 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c  3(v, aOp[eCond],
a950: 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65   regZero, sqlite
a960: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
a970: 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 56  (v)+2, reg);.  V
a980: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
a990: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
a9a0: 3d 30 29 3b 20 2f 2a 20 4e 55 4c 4c 20 63 61 73  =0); /* NULL cas
a9b0: 65 20 63 61 70 74 75 72 65 64 20 62 79 20 2a 2f  e captured by */
a9c0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
a9d0: 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43  everNullIf(v, eC
a9e0: 6f 6e 64 3d 3d 31 29 3b 20 2f 2a 20 20 20 74 68  ond==1); /*   th
a9f0: 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 20 2a  e OP_MustBeInt *
aa00: 2f 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  /.  VdbeCoverage
aa10: 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65  NeverNullIf(v, e
aa20: 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 56 64 62 65  Cond==2);.  Vdbe
aa30: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
aa40: 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 33 29  lIf(v, eCond==3)
aa50: 3b 20 2f 2a 20 4e 55 4c 4c 20 63 61 73 65 20 63  ; /* NULL case c
aa60: 61 75 67 68 74 20 62 79 20 2a 2f 0a 20 20 56 64  aught by */.  Vd
aa70: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
aa80: 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ullIf(v, eCond==
aa90: 34 29 3b 20 2f 2a 20 20 20 74 68 65 20 4f 50 5f  4); /*   the OP_
aaa0: 47 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4d  Ge */.  sqlite3M
aab0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
aac0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
aad0: 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp2(v, OP_Halt,
aae0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f   SQLITE_ERROR, O
aaf0: 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69  E_Abort);.  sqli
ab00: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
ab10: 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b  v, (void*)azErr[
ab20: 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49  eCond], P4_STATI
ab30: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  C);.  sqlite3Rel
ab40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ab50: 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a  se, regZero);.}.
ab60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
ab70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
ab80: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
ab90: 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  the window-funct
aba0: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ion associated.*
abb0: 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65 63  * with the objec
abc0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
abd0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
abe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
abf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ac00: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69 6e  ndowArgCount(Win
ac10: 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78  dow *pWin){.  Ex
ac20: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
ac30: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
ac40: 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  pList;.  return 
ac50: 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e  (pList ? pList->
ac60: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f  nExpr : 0);.}../
ac70: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
ac80: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
ac90: 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20 28  either xStep() (
aca0: 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 30  if bInverse is 0
acb0: 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73  ) or .** xInvers
acc0: 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69  e (if bInverse i
acd0: 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20  s non-zero) for 
ace0: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
acf0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20  tion in the .** 
ad00: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
ad10: 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f  ting at pMWin. O
ad20: 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20  r, for built-in 
ad30: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
ad40: 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  .** that do not 
ad50: 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  use the standard
ad60: 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67   function API, g
ad70: 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71 75  enerate the requ
ad80: 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56  ired.** inline V
ad90: 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  M code..**.** If
ada0: 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69 73   argument csr is
adb0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
adc0: 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68 65   equal to 0, the
add0: 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20 69  n argument reg i
ade0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  s.** the first r
adf0: 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72  egister in an ar
ae00: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
ae10: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
ae20: 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
ae30: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  h to hold the ar
ae40: 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
ae50: 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69   for each functi
ae60: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
ae70: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
ae80: 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
ae90: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
aea0: 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74 6f   row of csr into
aeb0: 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66   the.** array of
aec0: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
aed0: 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67  e invoking OP_Ag
aee0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67 49  gStep or OP_AggI
aef0: 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c  nverse.**.** Or,
af00: 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73 20   if csr is less 
af10: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
af20: 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67  the array of reg
af30: 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69 73  isters at reg is
af40: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70 75  .** already popu
af50: 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63  lated with all c
af60: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
af70: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
af80: 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
af90: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
afa0: 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20 6e  regPartSize is n
afb0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
afc0: 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 63   is a register c
afd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  ontaining the.**
afe0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
aff0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
b000: 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  artition..*/.sta
b010: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41  tic void windowA
b020: 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  ggStep(.  Parse 
b030: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
b040: 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20  ow *pMWin,      
b050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b060: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77 69  inked list of wi
b070: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
b080: 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20 20  /.  int csr,    
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67 75      /* Read argu
b0b0: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20  ments from this 
b0c0: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
b0d0: 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20 20  bInverse,       
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b0f0: 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49  rue to invoke xI
b100: 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20 6f  nverse instead o
b110: 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74  f xStep */.  int
b120: 20 72 65 67 20 20 20 20 20 20 20 20 20 20 20 20   reg            
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b140: 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
b150: 72 73 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  rs */.){.  Vdbe 
b160: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b170: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
b180: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
b190: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
b1a0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
b1b0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
b1c0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
b1d0: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
b1e0: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20   int regArg;.   
b1f0: 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64   int nArg = wind
b200: 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29  owArgCount(pWin)
b210: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
b220: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
b230: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
b240: 66 28 20 69 21 3d 31 20 7c 7c 20 70 46 75 6e 63  f( i!=1 || pFunc
b250: 2d 3e 7a 4e 61 6d 65 21 3d 6e 74 68 5f 76 61 6c  ->zName!=nth_val
b260: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
b270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b280: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b290: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
b2a0: 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a  gCol+i, reg+i);.
b2b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
b2e0: 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  umn, pMWin->iEph
b2f0: 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Csr, pWin->iArgC
b300: 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20  ol+i, reg+i);.  
b310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b320: 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a 20  regArg = reg;.. 
b330: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65     if( pMWin->re
b340: 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20  gStartRowid==0. 
b350: 20 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e 66      && (pFunc->f
b360: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
b370: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a  E_FUNC_MINMAX) .
b380: 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65       && (pWin->e
b390: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
b3a0: 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  DED).    ){.    
b3b0: 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c    int addrIsNull
b3c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b3d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
b3e0: 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20  l, regArg);.    
b3f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b400: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  );.      if( bIn
b410: 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  verse==0 ){.    
b420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b430: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
b440: 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  mm, pWin->regApp
b450: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  +1, 1);.        
b460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b470: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
b480: 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67  egArg, pWin->reg
b490: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
b4a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b4b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
b4c0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20  , pWin->regApp, 
b4d0: 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  2, pWin->regApp+
b4e0: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
b4f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b500: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
b510: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69  Win->csrApp, pWi
b520: 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20  n->regApp+2);.  
b530: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b550: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65  dOp4Int(v, OP_Se
b560: 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41  ekGE, pWin->csrA
b570: 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31  pp, 0, regArg, 1
b580: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b590: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
b5a0: 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(v);.        sq
b5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b5c0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57  v, OP_Delete, pW
b5d0: 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20  in->csrApp);.   
b5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
b600: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
b610: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
b620: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b630: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b640: 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  ddrIsNull);.    
b650: 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e  }else if( pWin->
b660: 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20  regApp ){.      
b670: 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 7a  assert( pFunc->z
b680: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
b690: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ame.           |
b6a0: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
b6b0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
b6c0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
b6d0: 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d  ssert( bInverse=
b6e0: 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d  =0 || bInverse==
b6f0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
b700: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b710: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d  OP_AddImm, pWin-
b720: 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72  >regApp+1-bInver
b730: 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  se, 1);.    }els
b740: 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46  e if( pFunc->xSF
b750: 75 6e 63 21 3d 6e 6f 6f 70 53 74 65 70 46 75 6e  unc!=noopStepFun
b760: 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  c ){.      int a
b770: 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20  ddrIf = 0;.     
b780: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74   if( pWin->pFilt
b790: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
b7a0: 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20  t regTmp;.      
b7b0: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
b7c0: 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d  0 || nArg==pWin-
b7d0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
b7e0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
b7f0: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 20     assert( nArg 
b800: 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  || pWin->pOwner-
b810: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  >x.pList==0 );. 
b820: 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20         regTmp = 
b830: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
b840: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
b850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b860: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b870: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
b880: 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d  rgCol+nArg,regTm
b890: 70 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  p);.        addr
b8a0: 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  If = sqlite3Vdbe
b8b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
b8c0: 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31  ot, regTmp, 0, 1
b8d0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b8e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b8f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
b900: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
b910: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20  , regTmp);.     
b920: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 75   }.      if( pFu
b930: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
b940: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
b950: 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
b960: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b970: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b980: 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20 20  nArg>0 );.      
b990: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
b9a0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
b9b0: 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77  Parse, pWin->pOw
b9c0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  ner->x.pList->a[
b9d0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
b9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9f0: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
ba00: 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73  eq, 0,0,0, (cons
ba10: 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50  t char*)pColl, P
ba20: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
ba30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
ba40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62  3VdbeAddOp3(v, b
ba50: 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67 49  Inverse? OP_AggI
ba60: 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67 53  nverse : OP_AggS
ba70: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tep, .          
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 49                bI
ba90: 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20  nverse, regArg, 
baa0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
bab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bac0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
bad0: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
bae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
baf0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
bb00: 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  u8)nArg);.      
bb10: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
bb20: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
bb30: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20  (v, addrIf);.   
bb40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65   }.  }.}..typede
bb50: 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43  f struct WindowC
bb60: 6f 64 65 41 72 67 20 57 69 6e 64 6f 77 43 6f 64  odeArg WindowCod
bb70: 65 41 72 67 3b 0a 74 79 70 65 64 65 66 20 73 74  eArg;.typedef st
bb80: 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41 6e  ruct WindowCsrAn
bb90: 64 52 65 67 20 57 69 6e 64 6f 77 43 73 72 41 6e  dReg WindowCsrAn
bba0: 64 52 65 67 3b 0a 73 74 72 75 63 74 20 57 69 6e  dReg;.struct Win
bbb0: 64 6f 77 43 73 72 41 6e 64 52 65 67 20 7b 0a 20  dowCsrAndReg {. 
bbc0: 20 69 6e 74 20 63 73 72 3b 0a 20 20 69 6e 74 20   int csr;.  int 
bbd0: 72 65 67 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  reg;.};..struct 
bbe0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 7b 0a  WindowCodeArg {.
bbf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
bc00: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
bc10: 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b  ;.  Vdbe *pVdbe;
bc20: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 3b  .  int regGosub;
bc30: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
bc40: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ;.  int regArg;.
bc50: 20 20 69 6e 74 20 65 44 65 6c 65 74 65 3b 0a 0a    int eDelete;..
bc60: 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65    WindowCsrAndRe
bc70: 67 20 73 74 61 72 74 3b 0a 20 20 57 69 6e 64 6f  g start;.  Windo
bc80: 77 43 73 72 41 6e 64 52 65 67 20 63 75 72 72 65  wCsrAndReg curre
bc90: 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72 41  nt;.  WindowCsrA
bca0: 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f  ndReg end;.};../
bcb0: 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74  *.** Values that
bcc0: 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 61   may be passed a
bcd0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
bce0: 75 6d 65 6e 74 20 74 6f 20 77 69 6e 64 6f 77 43  ument to windowC
bcf0: 6f 64 65 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65 66  odeOp()..*/.#def
bd00: 69 6e 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  ine WINDOW_RETUR
bd10: 4e 5f 52 4f 57 20 31 0a 23 64 65 66 69 6e 65 20  N_ROW 1.#define 
bd20: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
bd30: 45 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  E 2.#define WIND
bd40: 4f 57 5f 41 47 47 53 54 45 50 20 20 20 20 33 0a  OW_AGGSTEP    3.
bd50: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bd60: 56 4d 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20  VM code to read 
bd70: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
bd80: 73 20 70 65 65 72 20 76 61 6c 75 65 73 20 66 72  s peer values fr
bd90: 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 20 69 6e  om cursor csr in
bda0: 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f  to.** an array o
bdb0: 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  f registers star
bdc0: 74 69 6e 67 20 61 74 20 72 65 67 2e 0a 2a 2f 0a  ting at reg..*/.
bdd0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
bde0: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
bdf0: 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  (.  WindowCodeAr
be00: 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63 73 72 2c  g *p,.  int csr,
be10: 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b 0a 20 20  .  int reg.){.  
be20: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
be30: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45 78 70 72  p->pMWin;.  Expr
be40: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
be50: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
be60: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
be70: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
be80: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
be90: 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20 20  (p->pParse);.   
bea0: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
beb0: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
bec0: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 43  tion;.    int iC
bed0: 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e  olOff = pMWin->n
bee0: 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50 61  BufferCol + (pPa
bef0: 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
bf00: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
bf10: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
bf20: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
bf30: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
bf40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bf50: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
bf60: 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69 2c 20 72  sr, iColOff+i, r
bf70: 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  eg+i);.    }.  }
bf80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
bf90: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
bfa0: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61 6c  voke either xVal
bfb0: 75 65 28 29 20 28 62 46 69 6e 3d 3d 30 29 20 6f  ue() (bFin==0) o
bfc0: 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a  r xFinalize().**
bfd0: 20 28 62 46 69 6e 3d 3d 31 29 20 66 6f 72 20 65   (bFin==1) for e
bfe0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
bff0: 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ion in the linke
c000: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
c010: 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c  at.** pMWin. Or,
c020: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
c030: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
c040: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
c050: 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41  he standard.** A
c060: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
c070: 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63   equivalent VM c
c080: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
c090: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e  oid windowAggFin
c0a0: 61 6c 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  al(WindowCodeArg
c0b0: 20 2a 70 2c 20 69 6e 74 20 62 46 69 6e 29 7b 0a   *p, int bFin){.
c0c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c0d0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  = p->pParse;.  W
c0e0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
c0f0: 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20  ->pMWin;.  Vdbe 
c100: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
c110: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
c120: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20  indow *pWin;..  
c130: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c140: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c150: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c160: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
c170: 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20  artRowid==0.    
c180: 20 26 26 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63   && (pWin->pFunc
c190: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
c1a0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
c1b0: 29 20 0a 20 20 20 20 20 26 26 20 28 70 57 69 6e  ) .     && (pWin
c1c0: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
c1d0: 4f 55 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a 20  OUNDED).    ){. 
c1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
c200: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
c210: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
c220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c230: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e  v, OP_Last, pWin
c240: 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20  ->csrApp);.     
c250: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c260: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c270: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c280: 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73  Column, pWin->cs
c290: 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  rApp, 0, pWin->r
c2a0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
c2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c2c0: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
c2d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c2e0: 29 2d 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  )-2);.    }else 
c2f0: 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  if( pWin->regApp
c300: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c310: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
c320: 74 52 6f 77 69 64 3d 3d 30 20 29 3b 0a 20 20 20  tRowid==0 );.   
c330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
c340: 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41  t nArg = windowA
c350: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20  rgCount(pWin);. 
c360: 20 20 20 20 20 69 66 28 20 62 46 69 6e 20 29 7b       if( bFin ){
c370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c390: 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d  _AggFinal, pWin-
c3a0: 3e 72 65 67 41 63 63 75 6d 2c 20 6e 41 72 67 29  >regAccum, nArg)
c3b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c3c0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
c3d0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34   pWin->pFunc, P4
c3e0: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
c3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c400: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
c410: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
c420: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
c430: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c440: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c450: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
c460: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
c470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c490: 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c  Op3(v, OP_AggVal
c4a0: 75 65 2c 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  ue,pWin->regAccu
c4b0: 6d 2c 6e 41 72 67 2c 70 57 69 6e 2d 3e 72 65 67  m,nArg,pWin->reg
c4c0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
c4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
c4e0: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
c4f0: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
c500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c510: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
c520: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61  erate code to ca
c530: 6c 63 75 6c 61 74 65 20 74 68 65 20 63 75 72 72  lculate the curr
c540: 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 61 6c  ent values of al
c550: 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  l window functio
c560: 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e  ns in the.** p->
c570: 70 4d 57 69 6e 20 6c 69 73 74 20 62 79 20 64 6f  pMWin list by do
c580: 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 20  ing a full scan 
c590: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  of the current w
c5a0: 69 6e 64 6f 77 20 66 72 61 6d 65 2e 20 53 74 6f  indow frame. Sto
c5b0: 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
c5c0: 73 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 2e  s in the Window.
c5d0: 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73 74  regResult regist
c5e0: 65 72 73 2c 20 72 65 61 64 79 20 74 6f 20 72 65  ers, ready to re
c5f0: 74 75 72 6e 20 74 68 65 20 75 70 70 65 72 0a 2a  turn the upper.*
c600: 2a 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  * layer..*/.stat
c610: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 46 75  ic void windowFu
c620: 6c 6c 53 63 61 6e 28 57 69 6e 64 6f 77 43 6f 64  llScan(WindowCod
c630: 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64  eArg *p){.  Wind
c640: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 50 61 72 73  ow *pWin;.  Pars
c650: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
c660: 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20  Parse;.  Window 
c670: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
c680: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  n;.  Vdbe *v = p
c690: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 6e 74 20  ->pVdbe;..  int 
c6a0: 72 65 67 43 52 6f 77 69 64 20 3d 20 30 3b 20 20  regCRowid = 0;  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c6c0: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61 6c  urrent rowid val
c6d0: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  ue */.  int regC
c6e0: 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Peer = 0;       
c6f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
c700: 6e 74 20 70 65 65 72 20 76 61 6c 75 65 73 20 2a  nt peer values *
c710: 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  /.  int regRowid
c720: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c730: 20 20 20 20 2f 2a 20 41 67 67 53 74 65 70 20 72      /* AggStep r
c740: 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  owid value */.  
c750: 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b  int regPeer = 0;
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 2f 2a 20 41 67 67 53 74 65 70 20 70 65 65 72 20  /* AggStep peer 
c780: 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 69 6e 74  values */..  int
c790: 20 6e 50 65 65 72 3b 0a 20 20 69 6e 74 20 6c 62   nPeer;.  int lb
c7a0: 6c 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6c 62 6c  lNext;.  int lbl
c7b0: 42 72 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e  Brk;.  int addrN
c7c0: 65 78 74 3b 0a 20 20 69 6e 74 20 63 73 72 20 3d  ext;.  int csr =
c7d0: 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a   pMWin->csrApp;.
c7e0: 0a 20 20 6e 50 65 65 72 20 3d 20 28 70 4d 57 69  .  nPeer = (pMWi
c7f0: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d  n->pOrderBy ? pM
c800: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  Win->pOrderBy->n
c810: 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 6c 62  Expr : 0);..  lb
c820: 6c 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  lNext = sqlite3V
c830: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
c840: 72 73 65 29 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d  rse);.  lblBrk =
c850: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c860: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
c870: 20 20 72 65 67 43 52 6f 77 69 64 20 3d 20 73 71    regCRowid = sq
c880: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
c890: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f  pParse);.  regRo
c8a0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
c8b0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
c8c0: 0a 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a  .  if( nPeer ){.
c8d0: 20 20 20 20 72 65 67 43 50 65 65 72 20 3d 20 73      regCPeer = s
c8e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
c8f0: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72  ge(pParse, nPeer
c900: 29 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20 3d  );.    regPeer =
c910: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
c920: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65  ange(pParse, nPe
c930: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  er);.  }..  sqli
c940: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c950: 20 4f 50 5f 52 6f 77 69 64 2c 20 70 4d 57 69 6e   OP_Rowid, pMWin
c960: 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 43 52  ->iEphCsr, regCR
c970: 6f 77 69 64 29 3b 0a 20 20 77 69 6e 64 6f 77 52  owid);.  windowR
c980: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c  eadPeerValues(p,
c990: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
c9a0: 20 72 65 67 43 50 65 65 72 29 3b 0a 0a 20 20 66   regCPeer);..  f
c9b0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
c9c0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
c9d0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 73  pNextWin){.    s
c9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c9f0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ca00: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
ca10: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
ca20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ca30: 53 65 65 6b 47 45 2c 20 63 73 72 2c 20 6c 62 6c  SeekGE, csr, lbl
ca40: 42 72 6b 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  Brk, pMWin->regS
ca50: 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 56 64  tartRowid);.  Vd
ca60: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ca70: 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
ca80: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ca90: 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  dr(v);.  sqlite3
caa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cab0: 5f 52 6f 77 69 64 2c 20 63 73 72 2c 20 72 65 67  _Rowid, csr, reg
cac0: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
cad0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cae0: 50 5f 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  P_Gt, pMWin->reg
caf0: 45 6e 64 52 6f 77 69 64 2c 20 6c 62 6c 42 72 6b  EndRowid, lblBrk
cb00: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56  , regRowid);.  V
cb10: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
cb20: 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  Null(v);..  if( 
cb30: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d  pMWin->eExclude=
cb40: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 29 7b 0a 20  =TK_CURRENT ){. 
cb50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cb60: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
cb70: 65 67 43 52 6f 77 69 64 2c 20 6c 62 6c 4e 65 78  egCRowid, lblNex
cb80: 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  t, regRowid);.  
cb90: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
cba0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
cbb0: 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 21 3d  MWin->eExclude!=
cbc0: 54 4b 5f 4e 4f 20 29 7b 0a 20 20 20 20 69 6e 74  TK_NO ){.    int
cbd0: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 61   addr;.    int a
cbe0: 64 64 72 45 71 20 3d 20 30 3b 0a 20 20 20 20 4b  ddrEq = 0;.    K
cbf0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
cc00: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
cc10: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29  MWin->pOrderBy )
cc20: 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  {.      pKeyInfo
cc30: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
cc40: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
cc50: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72  arse, pMWin->pOr
cc60: 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
cc70: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 57 69    }.    if( pMWi
cc80: 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
cc90: 54 49 45 53 20 29 7b 0a 20 20 20 20 20 20 61 64  TIES ){.      ad
cca0: 64 72 45 71 20 3d 20 73 71 6c 69 74 65 33 56 64  drEq = sqlite3Vd
ccb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
ccc0: 71 2c 20 72 65 67 43 52 6f 77 69 64 2c 20 30 2c  q, regCRowid, 0,
ccd0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
cce0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ccf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cd00: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
cd10: 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65     windowReadPee
cd20: 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20  rValues(p, csr, 
cd30: 72 65 67 50 65 65 72 29 3b 0a 20 20 20 20 20 20  regPeer);.      
cd40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd50: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
cd60: 20 72 65 67 50 65 65 72 2c 20 72 65 67 43 50 65   regPeer, regCPe
cd70: 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
cd80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
cd90: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
cda0: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
cdb0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64  INFO);.      add
cdc0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
cdd0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
cde0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cdf0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
ce00: 75 6d 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e 65  ump, addr, lblNe
ce10: 78 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  xt, addr);.     
ce20: 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
ce30: 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(v);.    }else{
ce40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ce50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
ce60: 6f 74 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78 74 29  oto, 0, lblNext)
ce70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ce80: 61 64 64 72 45 71 20 29 20 73 71 6c 69 74 65 33  addrEq ) sqlite3
ce90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cea0: 61 64 64 72 45 71 29 3b 0a 20 20 7d 0a 0a 20 20  addrEq);.  }..  
ceb0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
cec0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
ced0: 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b  , 0, p->regArg);
cee0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ..  sqlite3VdbeR
cef0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
cf00: 62 6c 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  blNext);.  sqlit
cf10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cf20: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 61 64  OP_Next, csr, ad
cf30: 64 72 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43  drNext);.  VdbeC
cf40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
cf50: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cf60: 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2d 31 29  e(v, addrNext-1)
cf70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
cf80: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e  umpHere(v, addrN
cf90: 65 78 74 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  ext+1);.  sqlite
cfa0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
cfb0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
cfc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
cfd0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
cfe0: 65 2c 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20  e, regCRowid);. 
cff0: 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20   if( nPeer ){.  
d000: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
d010: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
d020: 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72  , regPeer, nPeer
d030: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
d040: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
d050: 50 61 72 73 65 2c 20 72 65 67 43 50 65 65 72 2c  Parse, regCPeer,
d060: 20 6e 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20   nPeer);.  }..  
d070: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
d080: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , 1);.}../*.** I
d090: 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
d0a0: 75 74 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75  utine at regGosu
d0b0: 62 20 28 67 65 6e 65 72 61 74 65 64 20 62 79 20  b (generated by 
d0c0: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
d0d0: 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74  ) to.** return t
d0e0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
d0f0: 66 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  f Window.iEphCsr
d100: 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20  . If all window 
d110: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  functions are.**
d120: 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f   aggregate windo
d130: 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w functions that
d140: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
d150: 64 20 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a  d API, a single.
d160: 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74  ** OP_Gosub inst
d170: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74  ruction is all t
d180: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
d190: 20 67 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72   generates. Extr
d1a0: 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72  a VM code.** for
d1b0: 20 70 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73   per-row process
d1c0: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65  ing is only gene
d1d0: 72 61 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f  rated for the fo
d1e0: 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e  llowing built-in
d1f0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74   window.** funct
d200: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74  ions:.**.**   nt
d210: 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66  h_value().**   f
d220: 69 72 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20  irst_value().** 
d230: 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61    lag().**   lea
d240: 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d().*/.static vo
d250: 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  id windowReturnO
d260: 6e 65 52 6f 77 28 57 69 6e 64 6f 77 43 6f 64 65  neRow(WindowCode
d270: 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f  Arg *p){.  Windo
d280: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
d290: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
d2a0: 20 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66   p->pVdbe;..  if
d2b0: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
d2c0: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 77 69  tRowid ){.    wi
d2d0: 6e 64 6f 77 46 75 6c 6c 53 63 61 6e 28 70 29 3b  ndowFullScan(p);
d2e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61  .  }else{.    Pa
d2f0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
d300: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 57 69 6e  >pParse;.    Win
d310: 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 20 20  dow *pWin;..    
d320: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
d330: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
d340: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
d350: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
d360: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
d370: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d        if( pFunc-
d380: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
d390: 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 7c 7c 20  eName.       || 
d3a0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
d3b0: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
d3c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
d3d0: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
d3e0: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69  srApp;.        i
d3f0: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
d400: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
d410: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
d420: 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69  nt tmpReg = sqli
d430: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
d440: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
d450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d460: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d470: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
d480: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28  ;.  .        if(
d490: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
d4a0: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  th_valueName ){.
d4b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d4d0: 50 5f 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e 2d 3e  P_Column,pMWin->
d4e0: 69 45 70 68 43 73 72 2c 70 57 69 6e 2d 3e 69 41  iEphCsr,pWin->iA
d4f0: 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b  rgCol+1,tmpReg);
d500: 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f  .          windo
d510: 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72  wCheckValue(pPar
d520: 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b 0a  se, tmpReg, 2);.
d530: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d540: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d550: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d560: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70  _Integer, 1, tmp
d570: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Reg);.        }.
d580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d590: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d5a0: 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69  Add, tmpReg, pWi
d5b0: 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65  n->regApp, tmpRe
d5c0: 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
d5d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d5e0: 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65   OP_Gt, pWin->re
d5f0: 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70  gApp+1, lbl, tmp
d600: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Reg);.        Vd
d610: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
d620: 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ull(v);.        
d630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d640: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
d650: 64 2c 20 63 73 72 2c 20 30 2c 20 74 6d 70 52 65  d, csr, 0, tmpRe
d660: 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
d670: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
d680: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
d690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d6a0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
d6b0: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
d6c0: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
d6d0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
d6e0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d6f0: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
d700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
d710: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
d720: 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  se, tmpReg);.   
d730: 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
d740: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
d750: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46  ==leadName || pF
d760: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e  unc->zName==lagN
d770: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ame ){.        i
d780: 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e  nt nArg = pWin->
d790: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
d7a0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
d7b0: 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e  int csr = pWin->
d7c0: 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20  csrApp;.        
d7d0: 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65  int lbl = sqlite
d7e0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
d7f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d800: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
d810: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
d820: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d830: 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e  int iEph = pMWin
d840: 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 0a 20 20  ->iEphCsr;.  .  
d850: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33        if( nArg<3
d860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
d870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d880: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
d890: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
d8a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d8b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d8c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d8d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 70  P_Column, iEph,p
d8e0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 70  Win->iArgCol+2,p
d8f0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
d900: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d920: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
d930: 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b  , iEph, tmpReg);
d940: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72  .        if( nAr
d950: 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g<2 ){.         
d960: 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e   int val = (pFun
d970: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
d980: 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20  me ? 1 : -1);.  
d990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d9a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d9b0: 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20  AddImm, tmpReg, 
d9c0: 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  val);.        }e
d9d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
d9e0: 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e  nt op = (pFunc->
d9f0: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20  zName==leadName 
da00: 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75  ? OP_Add : OP_Su
da10: 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20  btract);.       
da20: 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d     int tmpReg2 =
da30: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
da40: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
da50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
da70: 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e  lumn, iEph, pWin
da80: 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70  ->iArgCol+1, tmp
da90: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Reg2);.         
daa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dab0: 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67  p3(v, op, tmpReg
dac0: 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65  2, tmpReg, tmpRe
dad0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  g);.          sq
dae0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
daf0: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
db00: 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eg2);.        }.
db10: 20 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74    .        sqlit
db20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
db30: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
db40: 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  r, lbl, tmpReg);
db50: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
db60: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
db70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
db80: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
db90: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
dba0: 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52  gCol, pWin->regR
dbb0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
dbc0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
dbd0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
dbe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dbf0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
dc00: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a  Parse, tmpReg);.
dc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dc20: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
dc30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
dc40: 62 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20  b, p->regGosub, 
dc50: 70 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d  p->addrGosub);.}
dc60: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
dc70: 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65   code to set the
dc80: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
dc90: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
dca0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a  indow function.*
dcb0: 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  * in the linked 
dcc0: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
dcd0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
dce0: 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20  nt to NULL. And 
dcf0: 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65  perform.** any e
dd00: 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74 69 61  quivalent initia
dd10: 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69 72 65  lization require
dd20: 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74 2d 69  d by any built-i
dd30: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
dd40: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ns.** in the lis
dd50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
dd60: 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
dd70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dd80: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a  Window *pMWin){.
dd90: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
dda0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
ddb0: 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67  e);.  int regArg
ddc0: 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
ddd0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
dde0: 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ;.  for(pWin=pMW
ddf0: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
de00: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
de10: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
de20: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
de30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
de40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
de50: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
de60: 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67  Accum);.    nArg
de70: 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e   = MAX(nArg, win
de80: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
de90: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  ));.    if( pMWi
dea0: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
deb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
dec0: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
ded0: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20  th_valueName || 
dee0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
def0: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  rst_valueName ){
df00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
df10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
df20: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
df30: 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20  n->regApp);.    
df40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
df50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
df60: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
df70: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d  gApp+1);.      }
df80: 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75  ..      if( (pFu
df90: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
dfa0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
dfb0: 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72  AX) && pWin->csr
dfc0: 41 70 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61  App ){.        a
dfd0: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
dfe0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
dff0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  D );.        sql
e000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e010: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
e020: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
e030: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e040: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e050: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
e060: 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20  n->regApp+1);.  
e070: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e080: 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72 73    regArg = pPars
e090: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
e0a0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72  rse->nMem += nAr
e0b0: 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41  g;.  return regA
e0c0: 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  rg;.}../* .** Re
e0d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
e0e0: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73   current frame s
e0f0: 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65 64 20  hould be cached 
e100: 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  in the ephemeral
e110: 20 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20   table,.** even 
e120: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
e130: 78 49 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73  xInverse() calls
e140: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
e150: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43  atic int windowC
e160: 61 63 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77  acheFrame(Window
e170: 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64   *pMWin){.  Wind
e180: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28 20  ow *pWin;.  if( 
e190: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
e1a0: 6f 77 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b  owid ) return 1;
e1b0: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
e1c0: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
e1d0: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
e1e0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
e1f0: 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  c = pWin->pFunc;
e200: 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d  .    if( (pFunc-
e210: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
e220: 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28  eName).     || (
e230: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
e240: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20  rst_valueName). 
e250: 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
e260: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a  Name==leadName).
e270: 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
e280: 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a  zName==lagName).
e290: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
e2a0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
e2b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e2c0: 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64  /*.** regOld and
e2d0: 20 72 65 67 4e 65 77 20 61 72 65 20 65 61 63 68   regNew are each
e2e0: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
e2f0: 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ter in an array 
e300: 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65  of size.** pOrde
e310: 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73  rBy->nExpr. This
e320: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
e330: 74 65 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  tes code to comp
e340: 61 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61  are the two.** a
e350: 72 72 61 79 73 20 6f 66 20 72 65 67 69 73 74 65  rrays of registe
e360: 72 73 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  rs using the col
e370: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
e380: 20 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61   and other compa
e390: 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74  rison.** paramet
e3a0: 65 72 73 20 73 70 65 63 69 66 69 65 64 20 62 79  ers specified by
e3b0: 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a   pOrderBy. .**.*
e3c0: 2a 20 49 66 20 74 68 65 20 74 77 6f 20 61 72 72  * If the two arr
e3d0: 61 79 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  ays are not equa
e3e0: 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  l, the contents 
e3f0: 6f 66 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70  of regNew is cop
e400: 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c  ied to .** regOl
e410: 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61  d and control fa
e420: 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68  lls through. Oth
e430: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
e440: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61  ontents of the a
e450: 72 72 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75  rrays.** are equ
e460: 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69  al, an OP_Goto i
e470: 73 20 65 78 65 63 75 74 65 64 2e 20 54 68 65 20  s executed. The 
e480: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
e490: 50 5f 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e  P_Goto is return
e4a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
e4b0: 69 64 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65  id windowIfNewPe
e4c0: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
e4d0: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
e4e0: 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74  *pOrderBy,.  int
e4f0: 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20   regNew,        
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e510: 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f  First in array o
e520: 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a  f new values */.
e530: 20 20 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20    int regOld,   
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
e560: 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65  ray of old value
e570: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 20  s */.  int addr 
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
e5a0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
e5b0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
e5c0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e5d0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
e5e0: 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70      int nVal = p
e5f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
e600: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
e610: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
e620: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
e630: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
e640: 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rBy, 0, 0);.    
e650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e660: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
e670: 20 72 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c   regOld, regNew,
e680: 20 6e 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   nVal);.    sqli
e690: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
e6a0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
e6b0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e6d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
e6e0: 70 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p, .      sqlite
e6f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
e700: 28 76 29 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c  (v)+1, addr, sql
e710: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e720: 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a  ddr(v)+1.    );.
e730: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e740: 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  EqNe(v);.    sql
e750: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e760: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
e770: 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d  w, regOld, nVal-
e780: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
e790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e7a0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
e7b0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
e7c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e7d0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
e7e0: 20 70 61 72 74 20 6f 66 20 67 65 6e 65 72 61 74   part of generat
e7f0: 69 6e 67 20 56 4d 20 70 72 6f 67 72 61 6d 73 20  ing VM programs 
e800: 66 6f 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66 66  for RANGE.** off
e810: 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f  set PRECEDING/FO
e820: 4c 4c 4f 57 49 4e 47 20 66 72 61 6d 65 20 62 6f  LLOWING frame bo
e830: 75 6e 64 61 72 69 65 73 2e 20 41 73 73 75 6d 69  undaries. Assumi
e840: 6e 67 20 22 41 53 43 22 20 6f 72 64 65 72 20 66  ng "ASC" order f
e850: 6f 72 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  or.** the ORDER 
e860: 42 59 20 74 65 72 6d 20 69 6e 20 74 68 65 20 77  BY term in the w
e870: 69 6e 64 6f 77 2c 20 69 74 20 67 65 6e 65 72 61  indow, it genera
e880: 74 65 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c  tes code equival
e890: 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  ent to:.**.**   
e8a0: 69 66 28 20 63 73 72 31 2e 70 65 65 72 56 61 6c  if( csr1.peerVal
e8b0: 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63 73 72   + regVal >= csr
e8c0: 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f 74 6f  2.peerVal ) goto
e8d0: 20 6c 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70   lbl;.**.** A sp
e8e0: 65 63 69 61 6c 20 74 79 70 65 20 6f 66 20 61 72  ecial type of ar
e8f0: 69 74 68 6d 65 74 69 63 20 69 73 20 75 73 65 64  ithmetic is used
e900: 20 73 75 63 68 20 74 68 61 74 20 69 66 20 63 73   such that if cs
e910: 72 2e 70 65 65 72 56 61 6c 20 69 73 20 6e 6f 74  r.peerVal is not
e920: 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 74 79  .** a numeric ty
e930: 70 65 20 28 72 65 61 6c 20 6f 72 20 69 6e 74 65  pe (real or inte
e940: 67 65 72 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ger), then the r
e950: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61 64 64  esult of the add
e960: 69 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 63 6f  ition is.** a co
e970: 70 79 20 6f 66 20 63 73 72 31 2e 70 65 65 72 56  py of csr1.peerV
e980: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
e990: 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e  id windowCodeRan
e9a0: 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64 6f 77  geTest(.  Window
e9b0: 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20 20 69  CodeArg *p, .  i
e9c0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47  /* OP_Ge or OP_G
e9f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c  t */.  int csr1,
ea00: 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c 2c 20   .  int regVal, 
ea10: 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20 20 69  .  int csr2,.  i
ea20: 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73  nt lbl.){.  Pars
ea30: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
ea40: 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
ea50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ea60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
ea70: 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47   reg1 = sqlite3G
ea80: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ea90: 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20 3d 20  );.  int reg2 = 
eaa0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
eab0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
eac0: 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b   arith = OP_Add;
ead0: 0a 20 20 69 6e 74 20 61 64 64 72 47 65 3b 0a 0a  .  int addrGe;..
eae0: 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e 67 20    int regString 
eaf0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
eb00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
eb10: 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50  =OP_Ge || op==OP
eb20: 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _Gt || op==OP_Le
eb30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
eb40: 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  >pMWin->pOrderBy
eb50: 20 26 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f   && p->pMWin->pO
eb60: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
eb70: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d 57   );.  if( p->pMW
eb80: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  in->pOrderBy->a[
eb90: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a  0].sortOrder ){.
eba0: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 20 29      switch( op )
ebb0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
ebc0: 47 65 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20  Ge: op = OP_Le; 
ebd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ebe0: 65 20 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f 50  e OP_Gt: op = OP
ebf0: 5f 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _Lt; break;.    
ec00: 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
ec10: 74 28 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20  t( op==OP_Le ); 
ec20: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65 61  op = OP_Ge; brea
ec30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 69  k;.    }.    ari
ec40: 74 68 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74  th = OP_Subtract
ec50: 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 52  ;.  }..  windowR
ec60: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c  eadPeerValues(p,
ec70: 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a 20 20   csr1, reg1);.  
ec80: 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61  windowReadPeerVa
ec90: 6c 75 65 73 28 70 2c 20 63 73 72 32 2c 20 72 65  lues(p, csr2, re
eca0: 67 32 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  g2);..  /* Check
ecb0: 20 69 66 20 74 68 65 20 70 65 65 72 20 76 61 6c   if the peer val
ecc0: 75 65 20 66 6f 72 20 63 73 72 31 20 76 61 6c 75  ue for csr1 valu
ecd0: 65 20 69 73 20 61 20 74 65 78 74 20 6f 72 20 62  e is a text or b
ece0: 6c 6f 62 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  lob by comparing
ecf0: 0a 20 20 2a 2a 20 69 74 20 74 6f 20 74 68 65 20  .  ** it to the 
ed00: 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  smallest possibl
ed10: 65 20 73 74 72 69 6e 67 20 2d 20 27 27 2e 20 49  e string - ''. I
ed20: 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 6f 76  f it is, jump ov
ed30: 65 72 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 41  er the.  ** OP_A
ed40: 64 64 20 6f 72 20 4f 50 5f 53 75 62 74 72 61 63  dd or OP_Subtrac
ed50: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20  t operation and 
ed60: 70 72 6f 63 65 65 64 20 64 69 72 65 63 74 6c 79  proceed directly
ed70: 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   to the comparis
ed80: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
ed90: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
eda0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67  _String8, 0, reg
edb0: 53 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20 50  String, 0, "", P
edc0: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 61 64 64  4_STATIC);.  add
edd0: 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rGe = sqlite3Vdb
ede0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65  eAddOp3(v, OP_Ge
edf0: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
ee00: 72 65 67 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  reg1);.  VdbeCov
ee10: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
ee20: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ee30: 20 61 72 69 74 68 2c 20 72 65 67 56 61 6c 2c 20   arith, regVal, 
ee40: 72 65 67 31 2c 20 72 65 67 31 29 3b 0a 20 20 73  reg1, reg1);.  s
ee50: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ee60: 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20  re(v, addrGe);. 
ee70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee80: 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c 20  p3(v, op, reg2, 
ee90: 6c 62 6c 2c 20 72 65 67 31 29 3b 20 56 64 62 65  lbl, reg1); Vdbe
eea0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
eeb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
eec0: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
eed0: 4c 45 51 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LEQ);.  assert( 
eee0: 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d  op==OP_Ge || op=
eef0: 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50  =OP_Gt || op==OP
ef00: 5f 4c 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _Lt || op==OP_Le
ef10: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f   );.  testcase(o
ef20: 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
ef30: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
ef40: 3d 4f 50 5f 47 65 29 3b 0a 20 20 74 65 73 74 63  =OP_Ge);.  testc
ef50: 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
ef60: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
ef70: 2c 20 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  , op==OP_Lt);.  
ef80: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
ef90: 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
efa0: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65  eIf(v, op==OP_Le
efb0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70  );.  testcase(op
efc0: 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
efd0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
efe0: 4f 50 5f 47 74 29 3b 0a 0a 20 20 73 71 6c 69 74  OP_Gt);..  sqlit
eff0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f000: 28 70 50 61 72 73 65 2c 20 72 65 67 31 29 3b 0a  (pParse, reg1);.
f010: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f020: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f030: 72 65 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reg2);.}../*.** 
f040: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
f050: 66 6f 72 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  for sqlite3Windo
f060: 77 43 6f 64 65 53 74 65 70 28 29 2e 20 45 61 63  wCodeStep(). Eac
f070: 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  h call to this f
f080: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e 65 72  unction.** gener
f090: 61 74 65 73 20 56 4d 20 63 6f 64 65 20 66 6f 72  ates VM code for
f0a0: 20 61 20 73 69 6e 67 6c 65 20 52 45 54 55 52 4e   a single RETURN
f0b0: 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20 6f 72  _ROW, AGGSTEP or
f0c0: 20 41 47 47 49 4e 56 45 52 53 45 20 0a 2a 2a 20   AGGINVERSE .** 
f0d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 52 65 66 65 72  operation. Refer
f0e0: 20 74 6f 20 74 68 65 20 68 65 61 64 65 72 20 63   to the header c
f0f0: 6f 6d 6d 65 6e 74 20 66 6f 72 20 73 71 6c 69 74  omment for sqlit
f100: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
f110: 28 29 20 66 6f 72 0a 2a 2a 20 64 65 74 61 69 6c  () for.** detail
f120: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
f130: 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 0a 20   windowCodeOp(. 
f140: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
f150: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f160: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65   /* Context obje
f170: 63 74 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c 20 20  ct */. int op,  
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 20 20 20 20 20 20 2f 2a 20 57 49 4e 44 4f          /* WINDO
f1a0: 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47  W_RETURN_ROW, AG
f1b0: 47 53 54 45 50 20 6f 72 20 41 47 47 49 4e 56 45  GSTEP or AGGINVE
f1c0: 52 53 45 20 2a 2f 0a 20 69 6e 74 20 72 65 67 43  RSE */. int regC
f1d0: 6f 75 6e 74 64 6f 77 6e 2c 20 20 20 20 20 20 20  ountdown,       
f1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
f1f0: 73 74 65 72 20 66 6f 72 20 4f 50 5f 49 66 50 6f  ster for OP_IfPo
f200: 73 20 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f 0a 20  s countdown */. 
f210: 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 20 20 20  int jumpOnEof   
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
f240: 20 73 74 65 70 70 65 64 20 63 75 72 73 6f 72 20   stepped cursor 
f250: 72 65 61 63 68 65 73 20 45 4f 46 20 2a 2f 0a 29  reaches EOF */.)
f260: 7b 0a 20 20 69 6e 74 20 63 73 72 2c 20 72 65 67  {.  int csr, reg
f270: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
f280: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
f290: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
f2a0: 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e 74   p->pMWin;.  int
f2b0: 20 72 65 74 20 3d 20 30 3b 0a 20 20 56 64 62 65   ret = 0;.  Vdbe
f2c0: 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a   *v = p->pVdbe;.
f2d0: 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30    int addrIf = 0
f2e0: 3b 20 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  ; .  int addrCon
f2f0: 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74  tinue = 0;.  int
f300: 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20   addrGoto = 0;. 
f310: 20 69 6e 74 20 62 50 65 65 72 20 3d 20 28 70 4d   int bPeer = (pM
f320: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54  Win->eFrmType!=T
f330: 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74 20  K_ROWS);..  int 
f340: 6c 62 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  lblDone = sqlite
f350: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
f360: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 64  Parse);.  int ad
f370: 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 30 3b  drNextRange = 0;
f380: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
f390: 61 73 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47 47  ase - WINDOW_AGG
f3a0: 49 4e 56 45 52 53 45 20 69 73 20 61 6c 77 61 79  INVERSE is alway
f3b0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
f3c0: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61 72   frame.  ** star
f3d0: 74 73 20 77 69 74 68 20 55 4e 42 4f 55 4e 44 45  ts with UNBOUNDE
f3e0: 44 20 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f 0a  D PRECEDING. */.
f3f0: 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57    if( op==WINDOW
f400: 5f 41 47 47 49 4e 56 45 52 53 45 20 26 26 20 70  _AGGINVERSE && p
f410: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f420: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
f430: 20 20 61 73 73 65 72 74 28 20 72 65 67 43 6f 75    assert( regCou
f440: 6e 74 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75 6d  ntdown==0 && jum
f450: 70 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20  pOnEof==0 );.   
f460: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
f470: 20 20 69 66 28 20 72 65 67 43 6f 75 6e 74 64 6f    if( regCountdo
f480: 77 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  wn>0 ){.    if( 
f490: 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d  pMWin->eFrmType=
f4a0: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
f4b0: 20 20 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65     addrNextRange
f4c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f4d0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
f4e0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
f4f0: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
f500: 45 20 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f  E || op==WINDOW_
f510: 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20  AGGSTEP );.     
f520: 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f   if( op==WINDOW_
f530: 41 47 47 49 4e 56 45 52 53 45 20 29 7b 0a 20 20  AGGINVERSE ){.  
f540: 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
f550: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
f560: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20  OWING ){.       
f570: 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e     windowCodeRan
f580: 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20 20  geTest(.        
f590: 20 20 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c 20        p, OP_Le, 
f5a0: 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20  p->current.csr, 
f5b0: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d  regCountdown, p-
f5c0: 3e 73 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c 44  >start.csr, lblD
f5d0: 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b  one.          );
f5e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f5f0: 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
f600: 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20  CodeRangeTest(. 
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
f620: 4f 50 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e  OP_Ge, p->start.
f630: 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77  csr, regCountdow
f640: 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73  n, p->current.cs
f650: 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20  r, lblDone.     
f660: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
f670: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
f680: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
f690: 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20  eRangeTest(.    
f6a0: 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74          p, OP_Gt
f6b0: 2c 20 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65  , p->end.csr, re
f6c0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63  gCountdown, p->c
f6d0: 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44  urrent.csr, lblD
f6e0: 6f 6e 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  one.        );. 
f6f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f700: 7b 0a 20 20 20 20 20 20 61 64 64 72 49 66 20 3d  {.      addrIf =
f710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f720: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
f730: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c  regCountdown, 0,
f740: 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
f750: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f760: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d  }.  }..  if( op=
f770: 3d 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52  =WINDOW_RETURN_R
f780: 4f 57 20 26 26 20 70 4d 57 69 6e 2d 3e 72 65 67  OW && pMWin->reg
f790: 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b  StartRowid==0 ){
f7a0: 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69  .    windowAggFi
f7b0: 6e 61 6c 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  nal(p, 0);.  }. 
f7c0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
f7d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f7e0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69  ntAddr(v);.  swi
f7f0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
f800: 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  ase WINDOW_RETUR
f810: 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72  N_ROW:.      csr
f820: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73   = p->current.cs
f830: 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70  r;.      reg = p
f840: 2d 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20  ->current.reg;. 
f850: 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72       windowRetur
f860: 6e 4f 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20 20  nOneRow(p);.    
f870: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
f880: 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  se WINDOW_AGGINV
f890: 45 52 53 45 3a 0a 20 20 20 20 20 20 63 73 72 20  ERSE:.      csr 
f8a0: 3d 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a  = p->start.csr;.
f8b0: 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 73        reg = p->s
f8c0: 74 61 72 74 2e 72 65 67 3b 0a 20 20 20 20 20 20  tart.reg;.      
f8d0: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
f8e0: 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  artRowid ){.    
f8f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
f900: 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29  n->regEndRowid )
f910: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f920: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f930: 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d  P_AddImm, pMWin-
f940: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 2c 20  >regStartRowid, 
f950: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
f960: 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41  .        windowA
f970: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
f980: 4d 57 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d  MWin, csr, 1, p-
f990: 3e 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20  >regArg);.      
f9a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  }.      break;..
f9b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
f9c0: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57     assert( op==W
f9d0: 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 20 29 3b  INDOW_AGGSTEP );
f9e0: 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e  .      csr = p->
f9f0: 65 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72  end.csr;.      r
fa00: 65 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b  eg = p->end.reg;
fa10: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
fa20: 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20  ->regStartRowid 
fa30: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
fa40: 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64  t( pMWin->regEnd
fa50: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
fa60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa70: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
fa80: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
fa90: 77 69 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  wid, 1);.      }
faa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69  else{.        wi
fab0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
fac0: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20  se, pMWin, csr, 
fad0: 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 20  0, p->regArg);. 
fae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
faf0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  ak;.  }..  if( o
fb00: 70 3d 3d 70 2d 3e 65 44 65 6c 65 74 65 20 29 7b  p==p->eDelete ){
fb10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fb20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
fb30: 65 74 65 2c 20 63 73 72 29 3b 0a 20 20 20 20 73  ete, csr);.    s
fb40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fb50: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41 56  P5(v, OPFLAG_SAV
fb60: 45 50 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 7d 0a  EPOSITION);.  }.
fb70: 0a 20 20 69 66 28 20 6a 75 6d 70 4f 6e 45 6f 66  .  if( jumpOnEof
fb80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
fb90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fba0: 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74  Next, csr, sqlit
fbb0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fbc0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62  r(v)+2);.    Vdb
fbd0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fbe0: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56    ret = sqlite3V
fbf0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
fc00: 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Goto);.  }else{.
fc10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
fc30: 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64  , csr, sqlite3Vd
fc40: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
fc50: 2b 31 2b 62 50 65 65 72 29 3b 0a 20 20 20 20 56  +1+bPeer);.    V
fc60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fc70: 20 20 20 20 69 66 28 20 62 50 65 65 72 20 29 7b      if( bPeer ){
fc80: 0a 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20  .      addrGoto 
fc90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fca0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
fcb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
fcc0: 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20 20 69  ( bPeer ){.    i
fcd0: 6e 74 20 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e  nt nReg = (pMWin
fce0: 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57  ->pOrderBy ? pMW
fcf0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
fd00: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e  xpr : 0);.    in
fd10: 74 20 72 65 67 54 6d 70 20 3d 20 28 6e 52 65 67  t regTmp = (nReg
fd20: 20 3f 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   ? sqlite3GetTem
fd30: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
fd40: 52 65 67 29 20 3a 20 30 29 3b 0a 20 20 20 20 77  Reg) : 0);.    w
fd50: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
fd60: 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67 54  ues(p, csr, regT
fd70: 6d 70 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49  mp);.    windowI
fd80: 66 4e 65 77 50 65 65 72 28 70 50 61 72 73 65 2c  fNewPeer(pParse,
fd90: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
fda0: 2c 20 72 65 67 54 6d 70 2c 20 72 65 67 2c 20 61  , regTmp, reg, a
fdb0: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
fdc0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
fdd0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
fde0: 2c 20 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b  , regTmp, nReg);
fdf0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72  .  }..  if( addr
fe00: 4e 65 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20  NextRange ){.   
fe10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fe20: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
fe30: 2c 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29  , addrNextRange)
fe40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
fe50: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
fe60: 76 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69  v, lblDone);.  i
fe70: 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71  f( addrGoto ) sq
fe80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fe90: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a  e(v, addrGoto);.
fea0: 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73    if( addrIf ) s
feb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fec0: 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20  re(v, addrIf);. 
fed0: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
fee0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
fef0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70  and return a dup
ff00: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69  licate of the Wi
ff10: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69  ndow object indi
ff20: 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  cated by the.** 
ff30: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20  third argument. 
ff40: 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70  Set the Window.p
ff50: 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Owner field of t
ff60: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f  he new object to
ff70: 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57  .** pOwner..*/.W
ff80: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
ff90: 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20  ndowDup(sqlite3 
ffa0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65  *db, Expr *pOwne
ffb0: 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  r, Window *p){. 
ffc0: 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20   Window *pNew = 
ffd0: 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  0;.  if( ALWAYS(
ffe0: 70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  p) ){.    pNew =
fff0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10000 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
10010 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66  Window));.    if
10020 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
10030 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
10040 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
10050 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
10060 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72     pNew->pFilter
10070 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
10080 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72  p(db, p->pFilter
10090 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
100a0 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75  ->pFunc = p->pFu
100b0 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nc;.      pNew->
100c0 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c  pPartition = sql
100d0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
100e0 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f  db, p->pPartitio
100f0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  n, 0);.      pNe
10100 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
10110 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
10120 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
10130 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
10140 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 70 2d 3e  ->eFrmType = p->
10150 65 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20  eFrmType;.      
10160 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pNew->eEnd = p->
10170 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77  eEnd;.      pNew
10180 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53  ->eStart = p->eS
10190 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  tart;.      pNew
101a0 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 70 2d 3e  ->eExclude = p->
101b0 65 45 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20  eExclude;.      
101c0 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73  pNew->pStart = s
101d0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
101e0 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b  , p->pStart, 0);
101f0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e  .      pNew->pEn
10200 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  d = sqlite3ExprD
10210 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  up(db, p->pEnd, 
10220 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10230 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b  pOwner = pOwner;
10240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10250 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
10260 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
10270 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
10280 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
10290 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20  jects passed as 
102a0 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  the.** second ar
102b0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f  gument..*/.Windo
102c0 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
102d0 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
102e0 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b  *db, Window *p){
102f0 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
10300 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20  .  Window *pRet 
10310 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a  = 0;.  Window **
10320 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66  pp = &pRet;..  f
10330 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b  or(pWin=p; pWin;
10340 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
10350 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d  tWin){.    *pp =
10360 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75   sqlite3WindowDu
10370 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a  p(db, 0, pWin);.
10380 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29      if( *pp==0 )
10390 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d   break;.    pp =
103a0 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57   &((*pp)->pNextW
103b0 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  in);.  }..  retu
103c0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
103d0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
103e0 20 69 74 20 63 61 6e 20 62 65 20 64 65 74 65 72   it can be deter
103f0 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
10400 20 74 69 6d 65 20 74 68 61 74 20 65 78 70 72 65   time that expre
10410 73 73 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20  ssion .** pExpr 
10420 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 76  evaluates to a v
10430 61 6c 75 65 20 74 68 61 74 2c 20 77 68 65 6e 20  alue that, when 
10440 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
10450 65 72 2c 20 69 73 20 67 72 65 61 74 65 72 20 0a  er, is greater .
10460 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61  ** than zero. Fa
10470 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
10480 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
10490 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
104a0 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
104b0 74 68 65 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c  the Parse.db.mal
104c0 6c 6f 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c  locFailed .** fl
104d0 61 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 7a  ag and returns z
104e0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
104f0 6e 74 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a  nt windowExprGtZ
10500 65 72 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  ero(Parse *pPars
10510 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
10520 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
10530 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10540 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71  pParse->db;.  sq
10550 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
10560 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
10570 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62  ValueFromExpr(db
10580 2c 20 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63  , pExpr, db->enc
10590 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
105a0 45 52 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20  ERIC, &pVal);.  
105b0 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
105c0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56  te3_value_int(pV
105d0 61 6c 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  al)>0 ){.    ret
105e0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
105f0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
10600 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  l);.  return ret
10610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
10620 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
10630 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10640 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
10650 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10660 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
10670 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10680 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
10690 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
106a0 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
106b0 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
106c0 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
106d0 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
106e0 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
106f0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64  function .** and
10700 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   invoke the sub-
10710 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72  routine at instr
10720 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62  uction addrGosub
10730 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72   once for each r
10740 6f 77 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  ow..** sqlite3Wh
10750 65 72 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61  ereEnd() is alwa
10760 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
10770 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a   returning. .**.
10780 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10790 20 68 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c   handles several
107a0 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
107b0 20 6f 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65   of window frame
107c0 73 2c 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75  s, which.** requ
107d0 69 72 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66  ire slightly dif
107e0 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e  ferent processin
107f0 67 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  g. The following
10800 20 70 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a   pseudo code is.
10810 2a 2a 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  ** used to imple
10820 6d 65 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d  ment window fram
10830 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  es of the form:.
10840 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  **.**   ROWS BET
10850 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45  WEEN <expr1> PRE
10860 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
10870 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
10880 2a 2a 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20  ** Other window 
10890 66 72 61 6d 65 20 74 79 70 65 73 20 75 73 65 20  frame types use 
108a0 76 61 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20  variants of the 
108b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
108c0 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74       ... loop st
108d0 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  arted by sqlite3
108e0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e  WhereBegin() ...
108f0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
10900 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
10910 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
10920 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d  flush.**       }
10930 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74  .**       Insert
10940 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
10950 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
10960 20 20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20    .**       if( 
10970 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72  first row of par
10980 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
10990 20 20 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74       // Rewind t
109a0 68 72 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c  hree cursors, al
109b0 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70  l open on the ep
109c0 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
109d0 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
109e0 64 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52  d);.**         R
109f0 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b  ewind(csrStart);
10a00 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
10a10 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a  nd(csrCurrent);.
10a20 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20  **       .**    
10a30 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
10a40 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f  xpr2>          /
10a50 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72  / FOLLOWING expr
10a60 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  ession.**       
10a70 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
10a80 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50  pr1>        // P
10a90 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
10aa0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  ion.**       }el
10ab0 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f  se{.**         /
10ac0 2f 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 69  / First time thi
10ad0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
10ae0 6e 2c 20 74 68 65 20 65 70 68 20 74 61 62 6c 65  n, the eph table
10af0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a   contains two .*
10b00 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77  *         // row
10b10 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 6f 77  s. The first row
10b20 20 69 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f   in the partitio
10b30 6e 2c 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72  n, which all thr
10b40 65 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20  ee cursors.**   
10b50 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74        // current
10b60 6c 79 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64  ly point to, and
10b70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
10b80 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41  ow..**         A
10b90 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
10ba0 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
10bb0 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
10bc0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
10bd0 2a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20  *           if( 
10be0 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
10bf0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10c00 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
10c10 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20            }.**  
10c20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
10c30 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
10c40 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20      flush:.**   
10c50 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
10c60 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
10c70 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
10c80 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN ROW.**       
10c90 20 20 69 66 28 20 63 73 72 43 75 72 72 65 6e 74    if( csrCurrent
10ca0 20 69 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b   is EOF ) break;
10cb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
10cc0 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
10cd0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10ce0 41 67 67 49 6e 76 65 72 73 65 28 63 73 72 53 74  AggInverse(csrSt
10cf0 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
10d00 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
10d10 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
10d20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54         }.**.** T
10d30 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61  he pseudo-code a
10d40 62 6f 76 65 20 75 73 65 73 20 74 68 65 20 66 6f  bove uses the fo
10d50 6c 6c 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e  llowing shorthan
10d60 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54  d:.**.**   AGGST
10d70 45 50 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68  EP:    invoke th
10d80 65 20 61 67 67 72 65 67 61 74 65 20 78 53 74 65  e aggregate xSte
10d90 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
10da0 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
10db0 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ction.**        
10dc0 20 20 20 20 20 20 20 77 69 74 68 20 61 72 67 75         with argu
10dd0 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20  ments read from 
10de0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
10df0 6f 66 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64  of cursor csrEnd
10e00 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
10e10 20 20 20 20 20 20 20 20 73 74 65 70 20 63 75 72          step cur
10e20 73 6f 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61  sor csrEnd forwa
10e30 72 64 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e  rd one row (i.e.
10e40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
10e50 74 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45  t())..**.**   RE
10e60 54 55 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e  TURN_ROW: return
10e70 20 61 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61   a row to the ca
10e80 6c 6c 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ller based on th
10e90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10ea0 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e .**           
10eb0 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20      current row 
10ec0 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e  of csrCurrent an
10ed0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
10ee0 61 74 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20  ate of all .**  
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67 67               agg
10f00 72 65 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74  regates. Then st
10f10 65 70 20 63 75 72 73 6f 72 20 63 73 72 43 75 72  ep cursor csrCur
10f20 72 65 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65  rent forward one
10f30 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47   row..**.**   AG
10f40 47 49 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65  GINVERSE: invoke
10f50 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 78   the aggregate x
10f60 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74 69  Inverse() functi
10f70 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  on for each wind
10f80 6f 77 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ow .**          
10f90 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77       functions w
10fa0 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ith arguments re
10fb0 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
10fc0 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f  ent row of curso
10fd0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
10fe0 20 20 20 63 73 72 53 74 61 72 74 2e 20 54 68 65     csrStart. The
10ff0 6e 20 73 74 65 70 20 63 73 72 53 74 61 72 74 20  n step csrStart 
11000 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e  forward one row.
11010 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
11020 20 74 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20   two other ROWS 
11030 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68  window frames th
11040 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  at are handled s
11050 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20  ignificantly.** 
11060 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
11070 20 74 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45   the above - "BE
11080 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
11090 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
110a0 3e 20 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20  > PRECEDING".** 
110b0 61 6e 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78  and "BETWEEN <ex
110c0 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  pr> FOLLOWING AN
110d0 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
110e0 4e 47 22 2e 20 54 68 65 73 65 20 61 72 65 20 73  NG". These are s
110f0 70 65 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73  pecial .** cases
11100 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 68   because they ch
11110 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20 69  ange the order i
11120 6e 20 77 68 69 63 68 20 74 68 65 20 74 68 72 65  n which the thre
11130 65 20 63 75 72 73 6f 72 73 20 28 63 73 72 53 74  e cursors (csrSt
11140 61 72 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65  art,.** csrCurre
11150 6e 74 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69  nt and csrEnd) i
11160 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
11170 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
11180 6c 65 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a  le. Cases that.*
11190 2a 20 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20  * use UNBOUNDED 
111a0 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61  or CURRENT ROW a
111b0 72 65 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  re much simpler 
111c0 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e  variations on on
111d0 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68  e of these.** th
111e0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  ree..**.**   ROW
111f0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
11200 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
11210 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
11220 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
11230 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
11240 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11250 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
11260 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11270 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
11280 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11290 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
112a0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
112b0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
112c0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
112d0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
112e0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
112f0 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
11300 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
11310 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
11320 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
11330 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
11340 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
11350 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
11360 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
11370 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e{.**         if
11380 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
11390 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
113a0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
113b0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
113c0 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
113d0 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
113e0 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
113f0 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
11400 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
11410 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  }.**       }.** 
11420 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75      }.**     flu
11430 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  sh:.**       if(
11440 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
11450 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  {.**         AGG
11460 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  STEP.**       }.
11470 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
11480 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52  ROW.**.**.**   R
11490 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
114a0 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
114b0 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
114c0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
114d0 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
114e0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
114f0 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11500 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11510 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11520 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11530 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
11540 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11550 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
11560 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11570 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11580 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
11590 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
115a0 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
115b0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
115c0 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d  *       regEnd =
115d0 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
115e0 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
115f0 45 6e 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a  End - <expr1>.**
11600 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
11610 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
11620 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
11630 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
11640 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
11650 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
11660 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
11670 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
11680 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
11690 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  E.**       }.** 
116a0 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20      }.**   }.** 
116b0 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
116c0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77  AGGSTEP.**     w
116d0 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
116e0 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
116f0 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11700 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11710 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f  *         if( eo
11720 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  f ) break;.**   
11730 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69      }.**       i
11740 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
11750 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
11760 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
11770 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
11780 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20   break.**       
11790 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
117a0 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73    while( !eof cs
117b0 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20  rCurrent ){.**  
117c0 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
117d0 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46  **     }.**.** F
117e0 6f 72 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74  or the most part
117f0 2c 20 74 68 65 20 70 61 74 74 65 72 6e 73 20 61  , the patterns a
11800 62 6f 76 65 20 61 72 65 20 61 64 61 70 74 65 64  bove are adapted
11810 20 74 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f   to support UNBO
11820 55 4e 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75  UNDED by.** assu
11830 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ming that it is 
11840 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69  equivalent to "i
11850 6e 66 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e  nfinity PRECEDIN
11860 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64  G/FOLLOWING" and
11870 0a 2a 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20  .** CURRENT ROW 
11880 62 79 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  by assuming that
11890 20 69 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e   it is equivilen
118a0 74 20 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e  t to "0 PRECEDIN
118b0 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a  G/FOLLOWING"..**
118c0 20 54 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a   This is optimiz
118d0 65 64 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62  ed of course - b
118e0 72 61 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c  ranches that wil
118f0 6c 20 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e  l never be taken
11900 20 61 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f   and.** conditio
11910 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
11920 79 73 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74  ys true are omit
11930 74 65 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20  ted from the VM 
11940 63 6f 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a  code. The only.*
11950 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61  * exceptional ca
11960 73 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  se is:.**.**   R
11970 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11980 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
11990 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
119a0 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
119b0 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
119c0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
119d0 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
119e0 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
119f0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11a00 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11a10 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73      }.**     Ins
11a20 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
11a30 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
11a40 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
11a50 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
11a60 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64  .**       Rewind
11a70 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
11a80 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
11a90 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
11aa0 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
11ab0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
11ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
11ad0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
11ae0 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20     }.**   }.**  
11af0 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41   flush:.**     A
11b00 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68  GGSTEP.**     wh
11b10 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
11b20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
11b30 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
11b40 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
11b50 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65  **         if( e
11b60 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20  of ) break.**   
11b70 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52      }.**       R
11b80 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
11b90 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28   }.**     while(
11ba0 20 21 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74   !eof csrCurrent
11bb0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54   ){.**       RET
11bc0 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
11bd0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75  .**.** Also requ
11be0 69 72 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  iring special ha
11bf0 6e 64 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63  ndling are the c
11c00 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  ases:.**.**   RO
11c10 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
11c20 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  1> PRECEDING AND
11c30 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49   <expr2> PRECEDI
11c40 4e 47 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  NG.**   ROWS BET
11c50 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c  WEEN <expr1> FOL
11c60 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  LOWING AND <expr
11c70 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
11c80 2a 2a 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c  ** when (expr1 <
11c90 20 65 78 70 72 32 29 2e 20 54 68 69 73 20 69 73   expr2). This is
11ca0 20 64 65 74 65 63 74 65 64 20 61 74 20 72 75 6e   detected at run
11cb0 74 69 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69  time, not by thi
11cc0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  s function..** T
11cd0 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61  o handle this ca
11ce0 73 65 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63  se, the pseudo-c
11cf0 6f 64 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70  ode programs dep
11d00 69 63 74 65 64 20 61 62 6f 76 65 20 61 72 65 20  icted above are 
11d10 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67  modified.** slig
11d20 68 74 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a  htly to be:.**.*
11d30 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
11d40 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11d50 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
11d60 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  ..**     if( new
11d70 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
11d80 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
11d90 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  sh.**     }.**  
11da0 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
11db0 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
11dc0 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72  ..**     if( fir
11dd0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
11de0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
11df0 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11e00 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11e10 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11e20 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11e30 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
11e40 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
11e50 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
11e60 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
11e70 20 3c 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a   < regStart ){.*
11e80 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
11e90 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20  _ROW.**         
11ea0 64 65 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65  delete eph table
11eb0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
11ec0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a       continue.**
11ed0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
11ee0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ....**.** The ne
11ef0 77 20 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61  w "continue" sta
11f00 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62  tement in the ab
11f10 6f 76 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ove jumps to the
11f20 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a   next iteration.
11f30 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ** of the outer 
11f40 6c 6f 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73  loop - the one s
11f50 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11f60 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a  3WhereBegin()..*
11f70 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73  *.** The various
11f80 20 47 52 4f 55 50 53 20 63 61 73 65 73 20 61 72   GROUPS cases ar
11f90 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
11fa0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 61 74  ing the same pat
11fb0 74 65 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53  terns as.** ROWS
11fc0 2e 20 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73  . The VM code is
11fd0 20 6d 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74   modified slight
11fe0 6c 79 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a  ly so that:.**.*
11ff0 2a 20 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20  *   1. The else 
12000 62 72 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61  branch in the ma
12010 69 6e 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20  in loop is only 
12020 74 61 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77  taken if the row
12030 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64   just.**      ad
12040 64 65 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d  ded to the ephem
12050 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68  eral table is th
12060 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
12070 20 67 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20   group. In.**   
12080 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20     other words, 
12090 69 74 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a  it becomes:.**.*
120a0 2a 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f  *         ... lo
120b0 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
120c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
120d0 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ) ....**        
120e0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
120f0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12100 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
12110 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12120 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
12130 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
12140 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
12150 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
12160 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
12170 2a 20 20 20 20 20 20 20 20 20 20 20 52 65 77 69  *           Rewi
12180 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
12190 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
121a0 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
121b0 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
121c0 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
121d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
121e0 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
121f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73  .**         }els
12200 65 20 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20  e if( new group 
12210 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
12220 2e 2e 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ... .**         
12230 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  }.**       }.**.
12240 2a 2a 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20  **   2. Instead 
12250 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  of processing a 
12260 73 69 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68  single row, each
12270 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47   RETURN_ROW, AGG
12280 53 54 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20  STEP or .**     
12290 20 41 47 47 49 4e 56 45 52 53 45 20 73 74 65 70   AGGINVERSE step
122a0 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 63   processes the c
122b0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
122c0 65 20 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f  e relevant curso
122d0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c  r and.**      al
122e0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77  l subsequent row
122f0 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
12300 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a  he same group..*
12310 2a 0a 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f  *.** RANGE windo
12320 77 20 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c  w frames are a l
12330 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20  ittle different 
12340 61 67 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52  again. As for GR
12350 4f 55 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61  OUPS, the .** ma
12360 69 6e 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  in loop runs onc
12370 65 20 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79  e per group only
12380 2e 20 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57  . And RETURN_ROW
12390 2c 20 41 47 47 53 54 45 50 20 61 6e 64 20 41 47  , AGGSTEP and AG
123a0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c  GINVERSE.** deal
123b0 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65   in groups inste
123c0 61 64 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66  ad of rows. As f
123d0 6f 72 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55  or ROWS and GROU
123e0 50 53 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  PS, there are th
123f0 72 65 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73  ree.** basic cas
12400 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  es:.**.**   RANG
12410 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
12420 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
12430 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
12440 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
12450 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
12460 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
12470 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
12480 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12490 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
124a0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
124b0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
124c0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
124d0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
124e0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
124f0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12500 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12510 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12520 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12530 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
12540 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
12550 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
12560 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
12570 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12580 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
12590 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  e{.**         AG
125a0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
125b0 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72   while( (csrCurr
125c0 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  ent.key + regEnd
125d0 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29  ) < csrEnd.key )
125e0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52  {.**           R
125f0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12600 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73         while( cs
12610 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
12620 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
12630 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
12640 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
12650 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
12660 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d    }.**         }
12670 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12680 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73     }.**     flus
12690 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53  h:.**       AGGS
126a0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  TEP.**       whi
126b0 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
126c0 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a      RETURN ROW.*
126d0 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 63 73  *         if( cs
126e0 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20  rCurrent is EOF 
126f0 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
12700 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72        while( csr
12710 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
12720 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
12730 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
12740 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
12750 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  RSE.**          
12760 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   }.**         }.
12770 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
12780 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f   In the above no
12790 74 61 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79  tation, "csr.key
127a0 22 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72  " means the curr
127b0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
127c0 20 4f 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78   ORDER BY .** ex
127d0 70 72 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20  pression (there 
127e0 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66  is only ever 1 f
127f0 6f 72 20 61 20 52 41 4e 47 45 20 74 68 61 74 20  or a RANGE that 
12800 75 73 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46  uses an <expr> F
12810 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c  OLLOWING.** or <
12820 65 78 70 72 20 50 52 45 43 45 44 49 4e 47 29 20  expr PRECEDING) 
12830 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72  read from cursor
12840 20 63 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41   csr..**.**   RA
12850 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70  NGE BETWEEN <exp
12860 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
12870 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44  D <expr2> PRECED
12880 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
12890 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
128a0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
128b0 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
128c0 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
128d0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
128e0 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
128f0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12900 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
12910 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
12920 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66  ..**       if( f
12930 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
12940 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
12950 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
12960 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
12970 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
12980 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
12990 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
129a0 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
129b0 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
129c0 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  pr1>.**       }e
129d0 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
129e0 77 68 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b  while( (csrEnd.k
129f0 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20  ey + regEnd) <= 
12a00 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29  csrCurrent.key )
12a10 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
12a20 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
12a30 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52    }.**         R
12a40 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12a50 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
12a60 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
12a70 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
12a80 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
12a90 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
12aa0 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  E.**         }.*
12ab0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12ac0 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
12ad0 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
12ae0 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72   (csrEnd.key + r
12af0 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43 75 72  egEnd) <= csrCur
12b00 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rent.key ){.**  
12b10 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
12b20 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12b30 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
12b40 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
12b50 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  EEN <expr1> FOLL
12b60 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32  OWING AND <expr2
12b70 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
12b80 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
12b90 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
12ba0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
12bb0 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
12bc0 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
12bd0 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
12be0 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20   flush.**       
12bf0 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
12c00 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
12c10 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
12c20 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
12c30 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
12c40 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
12c50 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
12c60 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
12c70 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
12c80 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  t).**         re
12c90 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
12ca0 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74 61  *         regSta
12cb0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
12cc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20        }else{.** 
12cd0 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a          AGGSTEP.
12ce0 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  **         while
12cf0 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
12d00 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73  y + regEnd) < cs
12d10 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rEnd.key ){.**  
12d20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12d30 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
12d40 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20 63 73  + regStart) > cs
12d50 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a  rStart.key ){.**
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 41 47 47               AGG
12d70 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20  INVERSE.**      
12d80 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
12d90 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12da0 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12db0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
12dc0 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
12dd0 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
12de0 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31  *       while( 1
12df0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77   ){.**         w
12e00 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
12e10 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74  t.key + regStart
12e20 29 20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79  ) > csrStart.key
12e30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12e40 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
12e50 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
12e60 20 29 20 62 72 65 61 6b 20 22 77 68 69 6c 65 28   ) break "while(
12e70 20 31 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20   1 )" loop..**  
12e80 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12e90 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12ea0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12eb0 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63     while( !eof c
12ec0 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20  srCurrent ){.** 
12ed0 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
12ee0 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  OW.**       }.**
12ef0 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 61 62 6f  .** The text abo
12f00 76 65 20 6c 65 61 76 65 73 20 6f 75 74 20 6d 61  ve leaves out ma
12f10 6e 79 20 64 65 74 61 69 6c 73 2e 20 52 65 66 65  ny details. Refe
12f20 72 20 74 6f 20 74 68 65 20 63 6f 64 65 20 61 6e  r to the code an
12f30 64 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65  d comments.** be
12f40 6c 6f 77 20 66 6f 72 20 61 20 6d 6f 72 65 20 63  low for a more c
12f50 6f 6d 70 6c 65 74 65 20 70 69 63 74 75 72 65 2e  omplete picture.
12f60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12f70 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a  WindowCodeStep(.
12f80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
12fb0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12fc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
12fe0 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  tten SELECT stat
12ff0 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65  ement */.  Where
13000 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
13010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13020 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62  ntext returned b
13030 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
13040 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72  gin() */.  int r
13050 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  egGosub,        
13060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13070 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f  gister for OP_Go
13080 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  sub */.  int add
13090 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20 20  rGosub          
130a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47           /* OP_G
130b0 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65 74  osub here to ret
130c0 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a  urn each row */.
130d0 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
130e0 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
130f0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
13100 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By = pMWin->pOrd
13110 65 72 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20  erBy;.  Vdbe *v 
13120 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13130 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
13140 63 73 72 57 72 69 74 65 3b 20 20 20 20 20 20 20  csrWrite;       
13150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13160 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72  ursor used to wr
13170 69 74 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c  ite to eph. tabl
13180 65 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e  e */.  int csrIn
13190 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  put = p->pSrc->a
131a0 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20  [0].iCursor;    
131b0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75   /* Cursor of su
131c0 62 2d 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e  b-select */.  in
131d0 74 20 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53  t nInput = p->pS
131e0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
131f0 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  Col;    /* Numbe
13200 72 20 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e  r of cols return
13210 65 64 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69  ed by sub */.  i
13220 6e 74 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20  nt iInput;      
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
13250 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
13260 75 62 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  ub cols */.  int
13270 20 61 64 64 72 4e 65 3b 20 20 20 20 20 20 20 20   addrNe;        
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13290 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4e 65  Address of OP_Ne
132a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
132b0 73 75 62 46 6c 75 73 68 20 3d 20 30 3b 20 20 20  subFlush = 0;   
132c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
132d0 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   of OP_Gosub to 
132e0 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20  flush: */.  int 
132f0 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20 30 3b  addrInteger = 0;
13300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13310 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74  ddress of OP_Int
13320 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64  eger */.  int ad
13330 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  drEmpty;        
13340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
13350 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e  ress of OP_Rewin
13360 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20  d in flush: */. 
13370 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20   int regStart = 
13380 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13390 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
133a0 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
133b0 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20  .  int regEnd = 
133c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
133d0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
133e0 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
133f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b  */.  int regNew;
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13410 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
13420 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
13430 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77  ng new input row
13440 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
13450 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
13460 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20        /* regNew 
13470 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20  array in record 
13480 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  form */.  int re
13490 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
134a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
134b0 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64  id for regRecord
134c0 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f   in eph table */
134d0 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65  .  int regNewPee
134e0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
134f0 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65     /* Peer value
13500 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70  s for new row (p
13510 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a  art of regNew) *
13520 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 20  /.  int regPeer 
13530 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13540 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
13550 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  es for current r
13560 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  ow */.  int regF
13570 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20 20 20  lushPart = 0;   
13580 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13590 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66  ter for "Gosub f
135a0 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
135b0 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  */.  WindowCodeA
135c0 72 67 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  rg s;           
135d0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
135e0 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62 2d 72  object for sub-r
135f0 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
13600 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20 20 20   lblWhereEnd;   
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13620 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66 6f 72  Label just befor
13630 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
13640 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  d() code */..  a
13650 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
13660 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
13670 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
13680 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
13690 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
136a0 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
136b0 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  LOWING || pMWin-
136c0 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
136d0 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  UNDED .  );.  as
136e0 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
136f0 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
13700 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
13710 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
13720 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
13730 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
13740 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
13750 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20  TK_PRECEDING .  
13760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  );.  assert( pMW
13770 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 30 20  in->eExclude==0 
13780 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13790 64 65 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 0a 20  de==TK_CURRENT. 
137a0 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
137b0 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f  eExclude==TK_GRO
137c0 55 50 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78  UP || pMWin->eEx
137d0 63 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53 0a 20  clude==TK_TIES. 
137e0 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
137f0 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a  eExclude==TK_NO.
13800 20 20 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65    );..  lblWhere
13810 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
13820 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
13830 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e);..  /* Fill i
13840 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62  n the context ob
13850 6a 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ject */.  memset
13860 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  (&s, 0, sizeof(W
13870 69 6e 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a  indowCodeArg));.
13880 20 20 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61    s.pParse = pPa
13890 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d  rse;.  s.pMWin =
138a0 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62   pMWin;.  s.pVdb
138b0 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f  e = v;.  s.regGo
138c0 73 75 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a  sub = regGosub;.
138d0 20 20 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20    s.addrGosub = 
138e0 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63  addrGosub;.  s.c
138f0 75 72 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57  urrent.csr = pMW
13900 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63  in->iEphCsr;.  c
13910 73 72 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72  srWrite = s.curr
13920 65 6e 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73  ent.csr+1;.  s.s
13930 74 61 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72  tart.csr = s.cur
13940 72 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e  rent.csr+2;.  s.
13950 65 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72  end.csr = s.curr
13960 65 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a  ent.csr+3;..  /*
13970 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 6e   Figure out when
13980 20 72 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c   rows may be del
13990 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65 70  eted from the ep
139a0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 54  hemeral table. T
139b0 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f  here.  ** are fo
139c0 75 72 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65  ur options - the
139d0 79 20 6d 61 79 20 6e 65 76 65 72 20 62 65 20 64  y may never be d
139e0 65 6c 65 74 65 64 20 28 65 44 65 6c 65 74 65 3d  eleted (eDelete=
139f0 3d 30 29 2c 20 74 68 65 79 20 6d 61 79 20 0a 20  =0), they may . 
13a00 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
13a10 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61  s soon as they a
13a20 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72  re no longer par
13a30 74 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20  t of the window 
13a40 66 72 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c  frame.  ** (eDel
13a50 65 74 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49  ete==WINDOW_AGGI
13a60 4e 56 45 52 53 45 29 2c 20 74 68 65 79 20 6d 61  NVERSE), they ma
13a70 79 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  y be deleted as 
13a80 61 66 74 65 72 20 74 68 65 20 72 6f 77 20 0a 20  after the row . 
13a90 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 74   ** has been ret
13aa0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
13ab0 6c 65 72 20 28 57 49 4e 44 4f 57 5f 52 45 54 55  ler (WINDOW_RETU
13ac0 52 4e 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65 79  RN_ROW), or they
13ad0 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c   may.  ** be del
13ae0 65 74 65 64 20 61 66 74 65 72 20 74 68 65 79 20  eted after they 
13af0 65 6e 74 65 72 20 74 68 65 20 66 72 61 6d 65 20  enter the frame 
13b00 28 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 29  (WINDOW_AGGSTEP)
13b10 2e 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  . */.  switch( p
13b20 4d 57 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a  MWin->eStart ){.
13b30 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c      case TK_FOLL
13b40 4f 57 49 4e 47 3a 0a 20 20 20 20 20 20 69 66 28  OWING:.      if(
13b50 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
13b60 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20 20 20 20  !=TK_RANGE.     
13b70 20 20 26 26 20 77 69 6e 64 6f 77 45 78 70 72 47    && windowExprG
13b80 74 5a 65 72 6f 28 70 50 61 72 73 65 2c 20 70 4d  tZero(pParse, pM
13b90 57 69 6e 2d 3e 70 53 74 61 72 74 29 0a 20 20 20  Win->pStart).   
13ba0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 2e     ){.        s.
13bb0 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57  eDelete = WINDOW
13bc0 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20  _RETURN_ROW;.   
13bd0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13be0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  ;.    case TK_UN
13bf0 42 4f 55 4e 44 45 44 3a 0a 20 20 20 20 20 20 69  BOUNDED:.      i
13c00 66 28 20 77 69 6e 64 6f 77 43 61 63 68 65 46 72  f( windowCacheFr
13c10 61 6d 65 28 70 4d 57 69 6e 29 3d 3d 30 20 29 7b  ame(pMWin)==0 ){
13c20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 57  .        if( pMW
13c30 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
13c40 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  CEDING ){.      
13c50 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
13c60 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47  FrmType!=TK_RANG
13c70 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
13c80 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72 6f  windowExprGtZero
13c90 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
13ca0 70 45 6e 64 29 0a 20 20 20 20 20 20 20 20 20 20  pEnd).          
13cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
13cc0 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f  .eDelete = WINDO
13cd0 57 5f 41 47 47 53 54 45 50 3b 0a 20 20 20 20 20  W_AGGSTEP;.     
13ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13d00 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44  s.eDelete = WIND
13d10 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20  OW_RETURN_ROW;. 
13d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13d30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d40 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
13d50 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e   s.eDelete = WIN
13d60 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 3b 0a  DOW_AGGINVERSE;.
13d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
13d80 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
13d90 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 74 68  registers for th
13da0 65 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65  e array of value
13db0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 71  s from the sub-q
13dc0 75 65 72 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73  uery, the.  ** s
13dd0 61 6d 76 65 20 76 61 6c 75 65 73 20 69 6e 20 72  amve values in r
13de0 65 63 6f 72 64 20 66 6f 72 6d 2c 20 61 6e 64 20  ecord form, and 
13df0 74 68 65 20 72 6f 77 69 64 20 75 73 65 64 20 74  the rowid used t
13e00 6f 20 69 6e 73 65 72 74 20 73 61 69 64 20 72 65  o insert said re
13e10 63 6f 72 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  cord.  ** into t
13e20 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
13e30 6c 65 2e 20 20 2a 2f 0a 20 20 72 65 67 4e 65 77  le.  */.  regNew
13e40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
13e50 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  1;.  pParse->nMe
13e60 6d 20 2b 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 72  m += nInput;.  r
13e70 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61  egRecord = ++pPa
13e80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
13e90 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
13ea0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20 49 66  ->nMem;..  /* If
13eb0 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
13ec0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 3c  e contains an "<
13ed0 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22  expr> PRECEDING"
13ee0 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c   or "<expr> FOLL
13ef0 4f 57 49 4e 47 22 0a 20 20 2a 2a 20 63 6c 61 75  OWING".  ** clau
13f00 73 65 2c 20 61 6c 6c 6f 63 61 74 65 20 72 65 67  se, allocate reg
13f10 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20  isters to store 
13f20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65  the results of e
13f30 76 61 6c 75 61 74 69 6e 67 20 65 61 63 68 0a 20  valuating each. 
13f40 20 2a 2a 20 3c 65 78 70 72 3e 2e 20 20 2a 2f 0a   ** <expr>.  */.
13f50 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
13f60 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
13f70 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61  G || pMWin->eSta
13f80 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
13f90 20 29 7b 0a 20 20 20 20 72 65 67 53 74 61 72 74   ){.    regStart
13fa0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13fb0 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  m;.  }.  if( pMW
13fc0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
13fd0 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  CEDING || pMWin-
13fe0 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
13ff0 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67 45 6e  ING ){.    regEn
14000 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
14010 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  em;.  }..  /* If
14020 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 22   this is not a "
14030 52 4f 57 53 20 42 45 54 57 45 45 4e 20 2e 2e 2e  ROWS BETWEEN ...
14040 22 20 66 72 61 6d 65 2c 20 74 68 65 6e 20 61 6c  " frame, then al
14050 6c 6f 63 61 74 65 20 61 72 72 61 79 73 20 6f 66  locate arrays of
14060 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20  .  ** registers 
14070 74 6f 20 73 74 6f 72 65 20 63 6f 70 69 65 73 20  to store copies 
14080 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
14090 65 78 70 72 65 73 73 69 6f 6e 73 20 28 70 65 65  expressions (pee
140a0 72 20 76 61 6c 75 65 73 29 20 0a 20 20 2a 2a 20  r values) .  ** 
140b0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  for the main loo
140c0 70 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 20  p, and for each 
140d0 63 75 72 73 6f 72 20 28 73 74 61 72 74 2c 20 63  cursor (start, c
140e0 75 72 72 65 6e 74 20 61 6e 64 20 65 6e 64 29 2e  urrent and end).
140f0 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
14100 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 4f  >eFrmType!=TK_RO
14110 57 53 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50  WS ){.    int nP
14120 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20  eer = (pOrderBy 
14130 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ? pOrderBy->nExp
14140 72 20 3a 20 30 29 3b 0a 20 20 20 20 72 65 67 4e  r : 0);.    regN
14150 65 77 50 65 65 72 20 3d 20 72 65 67 4e 65 77 20  ewPeer = regNew 
14160 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
14170 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 4d 57  Col;.    if( pMW
14180 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
14190 20 72 65 67 4e 65 77 50 65 65 72 20 2b 3d 20 70   regNewPeer += p
141a0 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
141b0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 72 65 67  ->nExpr;.    reg
141c0 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Peer = pParse->n
141d0 4d 65 6d 2b 31 3b 20 20 20 20 20 20 20 70 50 61  Mem+1;       pPa
141e0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
141f0 65 72 3b 0a 20 20 20 20 73 2e 73 74 61 72 74 2e  er;.    s.start.
14200 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  reg = pParse->nM
14210 65 6d 2b 31 3b 20 20 20 70 50 61 72 73 65 2d 3e  em+1;   pParse->
14220 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20  nMem += nPeer;. 
14230 20 20 20 73 2e 63 75 72 72 65 6e 74 2e 72 65 67     s.current.reg
14240 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
14250 31 3b 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  1; pParse->nMem 
14260 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e  += nPeer;.    s.
14270 65 6e 64 2e 72 65 67 20 3d 20 70 50 61 72 73 65  end.reg = pParse
14280 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 70 50  ->nMem+1;     pP
14290 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
142a0 65 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  eer;.  }..  /* L
142b0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  oad the column v
142c0 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 72 6f  alues for the ro
142d0 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  w returned by th
142e0 65 20 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a  e sub-select.  *
142f0 2a 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  * into an array 
14300 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61  of registers sta
14310 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77 2e  rting at regNew.
14320 20 41 73 73 65 6d 62 6c 65 20 74 68 65 6d 20 69   Assemble them i
14330 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65 63 6f 72  nto.  ** a recor
14340 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
14350 67 52 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f  gRecord. */.  fo
14360 72 28 69 49 6e 70 75 74 3d 30 3b 20 69 49 6e 70  r(iInput=0; iInp
14370 75 74 3c 6e 49 6e 70 75 74 3b 20 69 49 6e 70 75  ut<nInput; iInpu
14380 74 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t++){.    sqlite
14390 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
143a0 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 49 6e 70  P_Column, csrInp
143b0 75 74 2c 20 69 49 6e 70 75 74 2c 20 72 65 67 4e  ut, iInput, regN
143c0 65 77 2b 69 49 6e 70 75 74 29 3b 0a 20 20 7d 0a  ew+iInput);.  }.
143d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
143e0 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
143f0 63 6f 72 64 2c 20 72 65 67 4e 65 77 2c 20 6e 49  cord, regNew, nI
14400 6e 70 75 74 2c 20 72 65 67 52 65 63 6f 72 64 29  nput, regRecord)
14410 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70 75 74  ;..  /* An input
14420 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20 62 65   row has just be
14430 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61 6e 20  en read into an 
14440 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
14450 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  rs starting.  **
14460 20 61 74 20 72 65 67 4e 65 77 2e 20 49 66 20 74   at regNew. If t
14470 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20 61 20  he window has a 
14480 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65  PARTITION clause
14490 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e  , this block gen
144a0 65 72 61 74 65 73 20 0a 20 20 2a 2a 20 56 4d 20  erates .  ** VM 
144b0 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 69 66  code to check if
144c0 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77 20 69   the input row i
144d0 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
144e0 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 0a   new partition..
144f0 20 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74 20 64    ** If so, it d
14500 6f 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20  oes an OP_Gosub 
14510 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f  to an address to
14520 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 6c 61   be filled in la
14530 74 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20 61 64  ter. The.  ** ad
14540 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
14550 47 6f 73 75 62 20 69 73 20 73 74 6f 72 65 64 20  Gosub is stored 
14560 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
14570 65 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68  e addrGosubFlush
14580 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e  . */.  if( pMWin
14590 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
145a0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
145b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
145c0 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
145d0 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  ition;.    int n
145e0 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45  Part = pPart->nE
145f0 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  xpr;.    int reg
14600 4e 65 77 50 61 72 74 20 3d 20 72 65 67 4e 65 77  NewPart = regNew
14610 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65   + pMWin->nBuffe
14620 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66  rCol;.    KeyInf
14630 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
14640 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
14650 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
14660 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a   pPart, 0, 0);..
14670 20 20 20 20 72 65 67 46 6c 75 73 68 50 61 72 74      regFlushPart
14680 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
14690 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  m;.    addr = sq
146a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
146b0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
146c0 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e  egNewPart, pMWin
146d0 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74  ->regPart, nPart
146e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
146f0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
14700 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
14710 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
14720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14730 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
14740 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64  dr+2, addr+4, ad
14750 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  dr+2);.    VdbeC
14760 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a  overageEqNe(v);.
14770 20 20 20 20 61 64 64 72 47 6f 73 75 62 46 6c 75      addrGosubFlu
14780 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  sh = sqlite3Vdbe
14790 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47 6f 73  AddOp1(v, OP_Gos
147a0 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
147b0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
147c0 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75  nt((v, "call flu
147d0 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b  sh_partition"));
147e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
147f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
14800 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  y, regNewPart, p
14810 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
14820 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Part-1);.  }..  
14830 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
14840 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 65  w row into the e
14850 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a  phemeral table *
14860 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
14870 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
14880 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65 2c 20  owid, csrWrite, 
14890 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  regRowid);.  sql
148a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
148b0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 63 73 72  , OP_Insert, csr
148c0 57 72 69 74 65 2c 20 72 65 67 52 65 63 6f 72 64  Write, regRecord
148d0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 61  , regRowid);.  a
148e0 64 64 72 4e 65 20 3d 20 73 71 6c 69 74 65 33 56  ddrNe = sqlite3V
148f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14900 4e 65 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e  Ne, pMWin->regOn
14910 65 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  e, 0, regRowid);
14920 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
14930 76 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  v);..  /* This b
14940 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f 72 20  lock is run for 
14950 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66  the first row of
14960 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20   each partition 
14970 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67 20 3d 20  */.  s.regArg = 
14980 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28  windowInitAccum(
14990 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a  pParse, pMWin);.
149a0 0a 20 20 69 66 28 20 72 65 67 53 74 61 72 74 20  .  if( regStart 
149b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
149c0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
149d0 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72 65  MWin->pStart, re
149e0 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69 6e  gStart);.    win
149f0 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50  dowCheckValue(pP
14a00 61 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20  arse, regStart, 
14a10 30 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 46 72 6d  0 + (pMWin->eFrm
14a20 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f  Type==TK_RANGE ?
14a30 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 20 20   3 : 0));.  }.  
14a40 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20  if( regEnd ){.  
14a50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14a60 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
14a70 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a  >pEnd, regEnd);.
14a80 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56      windowCheckV
14a90 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
14aa0 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e 2d  End, 1 + (pMWin-
14ab0 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
14ac0 4e 47 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20  NGE ? 3 : 0));. 
14ad0 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   }..  if( pMWin-
14ae0 3e 65 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e  >eStart==pMWin->
14af0 65 45 6e 64 20 26 26 20 72 65 67 53 74 61 72 74  eEnd && regStart
14b00 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
14b10 20 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74   ((pMWin->eStart
14b20 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20  ==TK_FOLLOWING) 
14b30 3f 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29  ? OP_Ge : OP_Le)
14b40 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 65  ;.    int addrGe
14b50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14b60 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53  dOp3(v, op, regS
14b70 74 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29  tart, 0, regEnd)
14b80 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
14b90 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
14ba0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
14bb0 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 56 64 62  =OP_Ge);.    Vdb
14bc0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
14bd0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 77  p==OP_Le);.    w
14be0 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 26 73  indowAggFinal(&s
14bf0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14c00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c10 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72  P_Rewind, s.curr
14c20 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20  ent.csr, 1);.   
14c30 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
14c40 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  erTaken(v);.    
14c50 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
14c60 6f 77 28 26 73 29 3b 0a 20 20 20 20 73 71 6c 69  ow(&s);.    sqli
14c70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14c80 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
14c90 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b   s.current.csr);
14ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
14cc0 6f 2c 20 30 2c 20 6c 62 6c 57 68 65 72 65 45 6e  o, 0, lblWhereEn
14cd0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
14ce0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
14cf0 64 64 72 47 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ddrGe);.  }.  if
14d00 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
14d10 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26  =TK_FOLLOWING &&
14d20 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
14d30 21 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20 72 65  !=TK_RANGE && re
14d40 67 45 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gEnd ){.    asse
14d50 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
14d60 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b  =TK_FOLLOWING );
14d70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14d80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
14d90 74 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c  tract, regStart,
14da0 20 72 65 67 45 6e 64 2c 20 72 65 67 53 74 61 72   regEnd, regStar
14db0 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  t);.  }..  if( p
14dc0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  MWin->eStart!=TK
14dd0 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
14de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14df0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
14e00 2c 20 73 2e 73 74 61 72 74 2e 63 73 72 2c 20 31  , s.start.csr, 1
14e10 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
14e20 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
14e30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
14e40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14e50 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e  Rewind, s.curren
14e60 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 56 64 62  t.csr, 1);.  Vdb
14e70 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61  eCoverageNeverTa
14e80 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ken(v);.  sqlite
14e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14ea0 50 5f 52 65 77 69 6e 64 2c 20 73 2e 65 6e 64 2e  P_Rewind, s.end.
14eb0 63 73 72 2c 20 31 29 3b 0a 20 20 56 64 62 65 43  csr, 1);.  VdbeC
14ec0 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
14ed0 6e 28 76 29 3b 0a 20 20 69 66 28 20 72 65 67 50  n(v);.  if( regP
14ee0 65 65 72 20 26 26 20 70 4f 72 64 65 72 42 79 20  eer && pOrderBy 
14ef0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14f00 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
14f10 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
14f20 20 72 65 67 50 65 65 72 2c 20 70 4f 72 64 65 72   regPeer, pOrder
14f30 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  By->nExpr-1);.  
14f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f50 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
14f60 72 65 67 50 65 65 72 2c 20 73 2e 73 74 61 72 74  regPeer, s.start
14f70 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e  .reg, pOrderBy->
14f80 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71  nExpr-1);.    sq
14f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14fa0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50  v, OP_Copy, regP
14fb0 65 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 72  eer, s.current.r
14fc0 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  eg, pOrderBy->nE
14fd0 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  xpr-1);.    sqli
14fe0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14ff0 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65   OP_Copy, regPee
15000 72 2c 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70 4f  r, s.end.reg, pO
15010 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29  rderBy->nExpr-1)
15020 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
15030 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15040 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68 65  _Goto, 0, lblWhe
15050 72 65 45 6e 64 29 3b 0a 0a 20 20 73 71 6c 69 74  reEnd);..  sqlit
15060 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15070 2c 20 61 64 64 72 4e 65 29 3b 0a 20 20 69 66 28  , addrNe);.  if(
15080 20 72 65 67 50 65 65 72 20 29 7b 0a 20 20 20 20   regPeer ){.    
15090 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28  windowIfNewPeer(
150a0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
150b0 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
150c0 67 50 65 65 72 2c 20 6c 62 6c 57 68 65 72 65 45  gPeer, lblWhereE
150d0 6e 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nd);.  }.  if( p
150e0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
150f0 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
15100 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15110 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
15120 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  P, 0, 0);.    if
15130 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54  ( pMWin->eEnd!=T
15140 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
15150 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
15160 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  eFrmType==TK_RAN
15170 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  GE ){.        in
15180 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56  t lbl = sqlite3V
15190 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
151a0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
151b0 74 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c  t addrNext = sql
151c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
151d0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
151e0 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54  windowCodeRangeT
151f0 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73  est(&s, OP_Ge, s
15200 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  .current.csr, re
15210 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c  gEnd, s.end.csr,
15220 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 77   lbl);.        w
15230 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
15240 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
15250 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
15260 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
15270 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15280 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
15290 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
152a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
152b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
152c0 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  rNext);.        
152d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
152e0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
152f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15300 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
15310 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15320 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64  TURN_ROW, regEnd
15330 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69  , 0);.        wi
15340 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15350 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
15360 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
15370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15380 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4d 57 69  }else.  if( pMWi
15390 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
153a0 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e  EDING ){.    win
153b0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
153c0 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72 65  NDOW_AGGSTEP, re
153d0 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77 69  gEnd, 0);.    wi
153e0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
153f0 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15400 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e  , 0, 0);.    win
15410 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15420 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
15430 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
15440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
15450 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 77 69  addr = 0;.    wi
15460 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15470 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30  INDOW_AGGSTEP, 0
15480 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  , 0);.    if( pM
15490 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e  Win->eEnd!=TK_UN
154a0 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20  BOUNDED ){.     
154b0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d   if( pMWin->eFrm
154c0 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29  Type==TK_RANGE )
154d0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62  {.        int lb
154e0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  l = 0;.        a
154f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15500 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15510 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67  .        if( reg
15520 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
15530 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
15540 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
15550 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77  se);.          w
15560 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65  indowCodeRangeTe
15570 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73 2e  st(&s, OP_Ge, s.
15580 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67  current.csr, reg
15590 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20  End, s.end.csr, 
155a0 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lbl);.        }.
155b0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
155c0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
155d0 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
155e0 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
155f0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15600 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72  OW_AGGINVERSE, r
15610 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  egStart, 0);.   
15620 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
15630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
15640 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15650 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
15660 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  dr);.          s
15670 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15680 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
15690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
156a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
156b0 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20  f( regEnd ){.   
156c0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
156d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
156e0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
156f0 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  End, 0, 1);.    
15700 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
15710 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d  ge(v);.        }
15720 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
15730 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15740 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
15750 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  0);.        wind
15760 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15770 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
15780 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
15790 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
157a0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
157b0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
157c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
157d0 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20   }..  /* End of 
157e0 74 68 65 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c  the main input l
157f0 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
15800 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15810 28 76 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29  (v, lblWhereEnd)
15820 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
15830 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
15840 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
15850 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
15860 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
15870 20 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20    addrInteger = 
15880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15890 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
158a0 20 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74   0, regFlushPart
158b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
158c0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
158d0 64 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20  drGosubFlush);. 
158e0 20 7d 0a 0a 20 20 61 64 64 72 45 6d 70 74 79 20   }..  addrEmpty 
158f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15900 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
15910 2c 20 63 73 72 57 72 69 74 65 29 3b 0a 20 20 56  , csrWrite);.  V
15920 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15930 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
15940 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
15950 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
15960 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
15970 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20  GGSTEP, regEnd, 
15980 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  0);.    windowCo
15990 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
159a0 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
159b0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
159c0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
159d0 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
159e0 20 20 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b    int addrStart;
159f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65  .    int addrBre
15a00 61 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  ak1;.    int add
15a10 72 42 72 65 61 6b 32 3b 0a 20 20 20 20 69 6e 74  rBreak2;.    int
15a20 20 61 64 64 72 42 72 65 61 6b 33 3b 0a 20 20 20   addrBreak3;.   
15a30 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15a40 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
15a50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
15a60 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
15a70 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
15a80 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
15a90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15aa0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
15ab0 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69   addrBreak2 = wi
15ac0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15ad0 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
15ae0 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a  , regStart, 1);.
15af0 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
15b00 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15b10 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15b20 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20  N_ROW, 0, 1);.  
15b30 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20    }else.    if( 
15b40 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
15b50 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
15b60 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
15b70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15b80 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
15b90 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e  addrBreak1 = win
15ba0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15bb0 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
15bc0 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
15bd0 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20       addrBreak2 
15be0 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15bf0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
15c00 45 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20  ERSE, 0, 1);.   
15c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
15c20 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
15c30 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
15c40 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61  );.      addrSta
15c50 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15c60 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15c70 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
15c80 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15c90 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15ca0 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31  N_ROW, regEnd, 1
15cb0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
15cc0 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak2 = windowCode
15cd0 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15ce0 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
15cf0 72 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  rt, 1);.    }.  
15d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15d20 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
15d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15d40 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
15d50 65 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53  eak2);.    addrS
15d60 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
15d70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15d80 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 33  ;.    addrBreak3
15d90 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15da0 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15db0 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20  N_ROW, 0, 1);.  
15dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15dd0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15de0 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
15df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15e00 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
15e10 65 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eak1);.    sqlit
15e20 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15e30 2c 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20  , addrBreak3);. 
15e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
15e50 61 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69  addrBreak;.    i
15e60 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20  nt addrStart;.  
15e70 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15e80 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
15e90 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64  P, 0, 0);.    ad
15ea0 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  drStart = sqlite
15eb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15ec0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65  (v);.    addrBre
15ed0 61 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  ak = windowCodeO
15ee0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
15ef0 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a  URN_ROW, 0, 1);.
15f00 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
15f10 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
15f20 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
15f30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15f40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15f50 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
15f60 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
15f70 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15f80 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
15f90 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  }.  sqlite3VdbeJ
15fa0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45  umpHere(v, addrE
15fb0 6d 70 74 79 29 3b 0a 0a 20 20 73 71 6c 69 74 65  mpty);..  sqlite
15fc0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15fd0 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 73  P_ResetSorter, s
15fe0 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20  .current.csr);. 
15ff0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72   if( pMWin->pPar
16000 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66  tition ){.    if
16010 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
16020 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  tRowid ){.      
16030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16040 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
16050 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74   1, pMWin->regSt
16060 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  artRowid);.     
16070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16080 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
16090 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45  , 0, pMWin->regE
160a0 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  ndRowid);.    }.
160b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
160c0 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 49  hangeP1(v, addrI
160d0 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 56  nteger, sqlite3V
160e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
160f0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
16100 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16110 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68  Return, regFlush
16120 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 65  Part);.  }.}..#e
16130 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16140 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
16150 2f 0a                                            /.