/ Hex Artifact Content
Login

Artifact 1d78310e655ce2a697a54cf28b713ae9dff9d1d6c5d370233499e0efbf96c699:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  nArg==0 );.  UNU
2870: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70  SED_PARAMETER(ap
2880: 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72  Arg);.  p = (str
2890: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
28a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28b0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28c0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
28d0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ( p ){.    p->nT
28e0: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
28f0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
2900: 74 5f 72 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20  t_rankInvFunc(. 
2910: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2920: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2930: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2940: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2950: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
2960: 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f  nt *p;.  UNUSED_
2970: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2980: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
2990: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
29a0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
29b0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
29c0: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
29d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
29e0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
29f0: 70 29 29 3b 0a 20 20 70 2d 3e 6e 53 74 65 70 2b  p));.  p->nStep+
2a00: 2b 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  +;.}.static void
2a10: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c   percent_rankVal
2a20: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
2a30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2a40: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2a50: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  t *p;.  p = (str
2a60: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
2a70: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2a80: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2a90: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2aa0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  ( p ){.    p->nV
2ab0: 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b  alue = p->nStep;
2ac0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2ad0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2ae0: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2af0: 29 70 2d 3e 6e 56 61 6c 75 65 20 2f 20 28 64 6f  )p->nValue / (do
2b00: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2b10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b20: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2b30: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2b40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b50: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2b60: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2b70: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2b80: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 46 69 6e   percent_rankFin
2b90: 61 6c 69 7a 65 46 75 6e 63 20 70 65 72 63 65 6e  alizeFunc percen
2ba0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 0a  t_rankValueFunc.
2bb0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2bc0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
2bd0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
2be0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
2bf0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2c00: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2c10: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2c20: 0a 2a 2a 0a 2a 2a 20 20 20 47 52 4f 55 50 53 20  .**.**   GROUPS 
2c30: 42 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57  BETWEEN 1 FOLLOW
2c40: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
2c50: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73  D FOLLOWING.*/.s
2c60: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2c70: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c90: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
2ca0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
2cb0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
2cc0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2cd0: 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t *p;.  UNUSED_P
2ce0: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 20  ARAMETER(nArg); 
2cf0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
2d00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d10: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20  METER(apArg);.  
2d20: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2d30: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2d40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2d50: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2d60: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
2d70: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a     p->nTotal++;.
2d80: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d90: 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75  d cume_distInvFu
2da0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2db0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2dc0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2dd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2de0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2df0: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2e00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2e10: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2e20: 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  rg==0 );.  UNUSE
2e30: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70 41 72  D_PARAMETER(apAr
2e40: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2e50: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2e60: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2e70: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2e80: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e  eof(*p));.  p->n
2e90: 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63  Step++;.}.static
2ea0: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2eb0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2ec0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2ed0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2ee0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2ef0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2f00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
2f30: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28      double r = (
2f40: 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74 65 70  double)(p->nStep
2f50: 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e  ) / (double)(p->
2f60: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73 71 6c  nTotal);.    sql
2f70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
2f80: 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20 7d  le(pCtx, r);.  }
2f90: 0a 7d 0a 23 64 65 66 69 6e 65 20 63 75 6d 65 5f  .}.#define cume_
2fa0: 64 69 73 74 46 69 6e 61 6c 69 7a 65 46 75 6e 63  distFinalizeFunc
2fb0: 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65 46   cume_distValueF
2fc0: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
2fd0: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 74  xt object for nt
2fe0: 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e  ile() window fun
2ff0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ction..*/.struct
3000: 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69 36   NtileCtx {.  i6
3010: 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20 20  4 nTotal;       
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3030: 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20 70   Total rows in p
3040: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36  artition */.  i6
3050: 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20 20  4 nParam;       
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   Parameter passe
3080: 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a 2f  d to ntile(N) */
3090: 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20  .  i64 iRow;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
30c0: 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  w */.};../*.** I
30d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30e0: 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20 61   ntile(). This a
30f0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
3100: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
3110: 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65 64  .** been coerced
3120: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   to:.**.**   ROW
3130: 53 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  S CURRENT ROW AN
3140: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
3150: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
3160: 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46 75  void ntileStepFu
3170: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3180: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
3190: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
31a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
31b0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74  g.){.  struct Nt
31c0: 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73 73  ileCtx *p;.  ass
31d0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20  ert( nArg==1 ); 
31e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31f0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
3200: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29  truct NtileCtx*)
3210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3220: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3230: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3240: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3250: 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a  p->nTotal==0 ){.
3260: 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20        p->nParam 
3270: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3280: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
3290: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
32a0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
32b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
32c0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
32d0: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
32e0: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
32f0: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
3300: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
3310: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
3320: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 54  .    }.    p->nT
3330: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
3340: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49  atic void ntileI
3350: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
3360: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3370: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3380: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3390: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
33a0: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
33b0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
33c0: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
33d0: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55 4e  ETER(nArg);.  UN
33e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
33f0: 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74  pArg);.  p = (st
3400: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
3410: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3420: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
3430: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
3440: 3e 69 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >iRow++;.}.stati
3450: 63 20 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75  c void ntileValu
3460: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3470: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3480: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
3490: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
34a0: 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69  t NtileCtx*)sqli
34b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
34c0: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
34d0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
34e0: 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20   && p->nParam>0 
34f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  ){.    int nSize
3500: 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20   = (p->nTotal / 
3510: 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20  p->nParam);.    
3520: 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  if( nSize==0 ){.
3530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3540: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
3550: 20 70 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20   p->iRow+1);.   
3560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
3570: 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54  4 nLarge = p->nT
3580: 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d  otal - p->nParam
3590: 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36  *nSize;.      i6
35a0: 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67  4 iSmall = nLarg
35b0: 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20  e*(nSize+1);.   
35c0: 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d     i64 iRow = p-
35d0: 3e 69 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73  >iRow;..      as
35e0: 73 65 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e  sert( (nLarge*(n
35f0: 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50  Size+1) + (p->nP
3600: 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69  aram-nLarge)*nSi
3610: 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29  ze)==p->nTotal )
3620: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  ;..      if( iRo
3630: 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20  w<iSmall ){.    
3640: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3650: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31  lt_int64(pCtx, 1
3660: 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31   + iRow/(nSize+1
3670: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
3680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3690: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
36a0: 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b  tx, 1 + nLarge +
36b0: 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e   (iRow-iSmall)/n
36c0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
36d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69     }.  }.}.#defi
36e0: 6e 65 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65  ne ntileFinalize
36f0: 46 75 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46  Func ntileValueF
3700: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
3710: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61  xt object for la
3720: 73 74 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f  st_value() windo
3730: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
3740: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3750: 74 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  tx {.  sqlite3_v
3760: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
3770: 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t nVal;.};../*.*
3780: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3790: 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29   of last_value()
37a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37b0: 20 6c 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46   last_valueStepF
37c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
37d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
37e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
37f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
3800: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c  rg.){.  struct L
3810: 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a  astValueCtx *p;.
3820: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3830: 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20  ER(nArg);.  p = 
3840: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3850: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3860: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3870: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3880: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3890: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
38a0: 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20  free(p->pVal);. 
38b0: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c     p->pVal = sql
38c0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61  ite3_value_dup(a
38d0: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pArg[0]);.    if
38e0: 28 20 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->pVal==0 ){.
38f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3900: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
3910: 28 70 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73  (pCtx);.    }els
3920: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  e{.      p->nVal
3930: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3940: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3950: 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20  _valueInvFunc(. 
3960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3970: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
3980: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
3990: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
39a0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
39b0: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
39c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
39d0: 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g);.  UNUSED_PAR
39e0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
39f0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73   p = (struct Las
3a00: 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74  tValueCtx*)sqlit
3a10: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3a20: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
3a30: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c  f(*p));.  if( AL
3a40: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
3a50: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
3a60: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
3a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3a80: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
3a90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
3aa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
3ab0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3ac0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
3ad0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3ae0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
3af0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
3b00: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
3b10: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
3b20: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3b30: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3b40: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
3b50: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
3b60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
3b70: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
3b80: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
3b90: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46  void last_valueF
3ba0: 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69  inalizeFunc(sqli
3bb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
3bc0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
3bd0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
3be0: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
3bf0: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
3c00: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3c10: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
3c20: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
3c30: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
3c40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3c50: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
3c60: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
3c70: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3c80: 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56  pVal);.    p->pV
3c90: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
3ca0: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e 61 6d 65  *.** Static name
3cb0: 73 20 66 6f 72 20 74 68 65 20 62 75 69 6c 74 2d  s for the built-
3cc0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3cd0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 73 65  on names.  These
3ce0: 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73   static.** names
3cf0: 20 61 72 65 20 75 73 65 64 2c 20 72 61 74 68 65   are used, rathe
3d00: 72 20 74 68 61 6e 20 73 74 72 69 6e 67 20 6c 69  r than string li
3d10: 74 65 72 61 6c 73 2c 20 73 6f 20 74 68 61 74 20  terals, so that 
3d20: 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 74 73 0a  FuncDef objects.
3d30: 2a 2a 20 63 61 6e 20 62 65 20 61 73 73 6f 63 69  ** can be associ
3d40: 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74  ated with a part
3d50: 69 63 75 6c 61 72 20 77 69 6e 64 6f 77 20 66 75  icular window fu
3d60: 6e 63 74 69 6f 6e 20 62 79 20 64 69 72 65 63 74  nction by direct
3d70: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  .** comparison o
3d80: 66 20 74 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e  f the zName poin
3d90: 74 65 72 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ter.  Example:.*
3da0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 70  *.**       if( p
3db0: 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d  FuncDef->zName==
3dc0: 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  row_valueName ){
3dd0: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63   ... }.*/.static
3de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 72 6f 77 5f   const char row_
3df0: 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20  numberName[] =  
3e00: 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73   "row_number";.s
3e10: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3e20: 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b   dense_rankName[
3e30: 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f 72 61 6e  ] =   "dense_ran
3e40: 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  k";.static const
3e50: 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d   char rankName[]
3e60: 20 3d 20 20 20 20 20 20 20 20 20 22 72 61 6e 6b   =         "rank
3e70: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e80: 63 68 61 72 20 70 65 72 63 65 6e 74 5f 72 61 6e  char percent_ran
3e90: 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65  kName[] = "perce
3ea0: 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63  nt_rank";.static
3eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 63 75 6d 65   const char cume
3ec0: 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20  _distName[] =   
3ed0: 20 22 63 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74   "cume_dist";.st
3ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3ef0: 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  ntileName[] =   
3f00: 20 20 20 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74       "ntile";.st
3f10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3f20: 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d  last_valueName[]
3f30: 20 3d 20 20 20 22 6c 61 73 74 5f 76 61 6c 75 65   =   "last_value
3f40: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3f50: 63 68 61 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61  char nth_valueNa
3f60: 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76  me[] =    "nth_v
3f70: 61 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  alue";.static co
3f80: 6e 73 74 20 63 68 61 72 20 66 69 72 73 74 5f 76  nst char first_v
3f90: 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66  alueName[] =  "f
3fa0: 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61  irst_value";.sta
3fb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c  tic const char l
3fc0: 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  eadName[] =     
3fd0: 20 20 20 20 22 6c 65 61 64 22 3b 0a 73 74 61 74      "lead";.stat
3fe0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61  ic const char la
3ff0: 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  gName[] =       
4000: 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a     "lag";../*.**
4010: 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74   No-op implement
4020: 61 74 69 6f 6e 73 20 6f 66 20 78 53 74 65 70 28  ations of xStep(
4030: 29 20 61 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28  ) and xFinalize(
4040: 29 2e 20 20 55 73 65 64 20 61 73 20 70 6c 61 63  ).  Used as plac
4050: 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72  e-holders.** for
4060: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4070: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4080: 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 6f 73 65  never call those
4090: 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a   interfaces..**.
40a0: 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65  ** The noopValue
40b0: 46 75 6e 63 28 29 20 69 73 20 63 61 6c 6c 65 64  Func() is called
40c0: 20 62 75 74 20 69 73 20 65 78 70 65 63 74 65 64   but is expected
40d0: 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20   to do nothing. 
40e0: 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70   The.** noopStep
40f0: 46 75 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Func() is never 
4100: 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69  called, and so i
4110: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
4120: 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c   NO_TEST to.** l
4130: 65 74 20 74 68 65 20 74 65 73 74 20 63 6f 76 65  et the test cove
4140: 72 61 67 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  rage routine kno
4150: 77 20 6e 6f 74 20 74 6f 20 65 78 70 65 63 74 20  w not to expect 
4160: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
4170: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a   be.** invoked..
4180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4190: 6f 6f 70 53 74 65 70 46 75 6e 63 28 20 20 20 20  oopStepFunc(    
41a0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71  /*NO_TEST*/.  sq
41b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
41c0: 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  ,        /*NO_TE
41d0: 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  ST*/.  int n,   
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4210: 61 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f  a          /*NO_
4220: 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20  TEST*/.){       
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
4250: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4260: 45 52 28 70 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(p);       /*N
4270: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
4280: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 20  D_PARAMETER(n); 
4290: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
42a0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
42b0: 45 54 45 52 28 61 29 3b 20 20 20 20 20 20 20 2f  ETER(a);       /
42c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61 73 73  *NO_TEST*/.  ass
42d0: 65 72 74 28 30 29 3b 20 20 20 20 20 20 20 20 20  ert(0);         
42e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
42f0: 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20 20 20  T*/.}           
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73 74 61   /*NO_TEST*/.sta
4320: 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56 61 6c  tic void noopVal
4330: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
4340: 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55 4e 55 53  ontext *p){ UNUS
4350: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
4360: 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a 0a 2f 2a   /*no-op*/ }../*
4370: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
4380: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
4390: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
43a0: 3a 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  : xStep, xFinal,
43b0: 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20  .** xValue, and 
43c0: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66  xInverse */.#def
43d0: 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c  ine WINDOWFUNCAL
43e0: 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72  L(name,nArg,extr
43f0: 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c         \.  nArg,
4420: 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51   (SQLITE_UTF8|SQ
4430: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
4440: 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20  |extra), 0, 0,  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
4470: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
4480: 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20  # FinalizeFunc, 
4490: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
44a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44b0: 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76   \.  name ## Inv
44c0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61  Func, name ## Na
44d0: 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20  me, {0}         
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4500: 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e  }../* Window fun
4510: 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
4520: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
4530: 67 20 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74  g bytecode and t
4540: 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f  hus have.** no-o
4550: 70 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  p routines for t
4560: 68 65 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  heir methods */.
4570: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55  #define WINDOWFU
4580: 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67  NCNOOP(name,nArg
4590: 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20  ,extra) {       
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
45c0: 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46  Arg, (SQLITE_UTF
45d0: 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  8|SQLITE_FUNC_WI
45e0: 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20  NDOW|extra), 0, 
45f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4600: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
4610: 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61  StepFunc, noopVa
4620: 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c  lueFunc, noopVal
4630: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65       \.  noopSte
4660: 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e  pFunc, name ## N
4670: 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20  ame, {0}        
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77    \.}../* Window
46b0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
46c0: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
46d0: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
46e0: 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f  , the.** same ro
46f0: 75 74 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c  utine for xFinal
4700: 69 7a 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61  ize and xValue a
4710: 6e 64 20 77 68 69 63 68 20 6e 65 76 65 72 20 63  nd which never c
4720: 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e  all.** xInverse.
4730: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44   */.#define WIND
4740: 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72  OWFUNCX(name,nAr
4750: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4780: 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45  .  nArg, (SQLITE
4790: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8|SQLITE_FUN
47a0: 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c  C_WINDOW|extra),
47b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
47d0: 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63  name ## StepFunc
47e0: 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46  , name ## ValueF
47f0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
4800: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4810: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f           \.  noo
4820: 70 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20  pStepFunc, name 
4830: 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20  ## Name, {0}    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
4870: 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65  * Register those
4880: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4890: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
48a0: 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67  are not also agg
48b0: 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64  regates..*/.void
48c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75   sqlite3WindowFu
48d0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
48e0: 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20   static FuncDef 
48f0: 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d  aWindowFuncs[] =
4900: 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e   {.    WINDOWFUN
4910: 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  CX(row_number, 0
4920: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4930: 46 55 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b  FUNCX(dense_rank
4940: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
4950: 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30  DOWFUNCX(rank, 0
4960: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4970: 46 55 4e 43 41 4c 4c 28 70 65 72 63 65 6e 74 5f  FUNCALL(percent_
4980: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
4990: 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 63   WINDOWFUNCALL(c
49a0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 30 29 2c  ume_dist, 0, 0),
49b0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49c0: 4c 4c 28 6e 74 69 6c 65 2c 20 31 2c 20 30 29 2c  LL(ntile, 1, 0),
49d0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49e0: 4c 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31  LL(last_value, 1
49f0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4a00: 46 55 4e 43 41 4c 4c 28 6e 74 68 5f 76 61 6c 75  FUNCALL(nth_valu
4a10: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
4a20: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 66 69 72 73  NDOWFUNCALL(firs
4a30: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
4a40: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a50: 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c 0a  OP(lead, 1, 0),.
4a60: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a70: 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 0a  OP(lead, 2, 0),.
4a80: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a90: 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c 0a  OP(lead, 3, 0),.
4aa0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4ab0: 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a 20  OP(lag, 1, 0),. 
4ac0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
4ad0: 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20 20  P(lag, 2, 0),.  
4ae0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50    WINDOWFUNCNOOP
4af0: 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d  (lag, 3, 0),.  }
4b00: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72  ;.  sqlite3Inser
4b10: 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57  tBuiltinFuncs(aW
4b20: 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61  indowFuncs, Arra
4b30: 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e  ySize(aWindowFun
4b40: 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  cs));.}..static 
4b50: 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46 69  Window *windowFi
4b60: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4b70: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c  , Window *pList,
4b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4b90: 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  me){.  Window *p
4ba0: 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
4bb0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69   p; p=p->pNextWi
4bc0: 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  n){.    if( sqli
4bd0: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4be0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
4bf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
4c00: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
4c10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c20: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 77  arse, "no such w
4c30: 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61 6d  indow: %s", zNam
4c40: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4c50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
4c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4c70: 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
4c80: 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   after resolving
4c90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
4ca0: 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64  me.** for a wind
4cb0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
4cc0: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
4cd0: 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20  ement. Argument 
4ce0: 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69  pList is a.** li
4cf0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e  nked list of WIN
4d00: 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  DOW definitions 
4d10: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
4d20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4d30: 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46  ..** Argument pF
4d40: 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63 74  unc is the funct
4d50: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a  ion definition j
4d60: 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64  ust resolved and
4d70: 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20   pWin.** is the 
4d80: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65  Window object re
4d90: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61  presenting the a
4da0: 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63  ssociated OVER c
4db0: 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66  lause. This.** f
4dc0: 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
4dd0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4de0: 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  pWin as follows:
4df0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
4e00: 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65  e OVER clause re
4e10: 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64  fered to a named
4e20: 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22   window (as in "
4e30: 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22  max(x) OVER win"
4e40: 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68  ),.**     search
4e50: 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20   list pList for 
4e60: 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f  a matching WINDO
4e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e  W definition, an
4e80: 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a  d update pWin.**
4e90: 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79       accordingly
4ea0: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e  . If no such WIN
4eb0: 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62  DOW clause can b
4ec0: 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61  e found, leave a
4ed0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69  n error.**     i
4ee0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  n pParse..**.** 
4ef0: 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74    * If the funct
4f00: 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69  ion is a built-i
4f10: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
4f20: 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  n that requires 
4f30: 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  the.**     windo
4f40: 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20  w to be coerced 
4f50: 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57  (see "BUILT-IN W
4f60: 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22  INDOW FUNCTIONS"
4f70: 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20   at the top.**  
4f80: 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29     of this file)
4f90: 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74 65  , pWin is update
4fa0: 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d here..*/.void 
4fb0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64  sqlite3WindowUpd
4fc0: 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ate(.  Parse *pP
4fd0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
4fe0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
5000: 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77   of named window
5010: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
5020: 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70  T */.  Window *p
5030: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
5040: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5050: 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65   frame to update
5060: 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70   */.  FuncDef *p
5070: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Func            
5080: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
5090: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
50a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ion */.){.  if( 
50b0: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70  pWin->zName && p
50c0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 30  Win->eFrmType==0
50d0: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
50e0: 70 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70  p = windowFind(p
50f0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57  Parse, pList, pW
5100: 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  in->zName);.    
5110: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5120: 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  n;.    pWin->pPa
5130: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
5140: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
5150: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72  rse->db, p->pPar
5160: 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
5170: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
5180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5190: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
51a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  p->pOrderBy, 0);
51b0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72  .    pWin->pStar
51c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
51d0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
51e0: 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
51f0: 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73    pWin->pEnd = s
5200: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
5210: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e  arse->db, p->pEn
5220: 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  d, 0);.    pWin-
5230: 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
5240: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
5250: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
5260: 20 20 20 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70     pWin->eFrmTyp
5270: 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79 70 65 3b  e = p->eFrmType;
5280: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5290: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
52a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
52b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
52c0: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
52d0: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
52e0: 66 28 20 28 70 57 69 6e 2d 3e 65 46 72 6d 54 79  f( (pWin->eFrmTy
52f0: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20  pe==TK_RANGE).  
5300: 20 26 26 20 28 70 57 69 6e 2d 3e 70 53 74 61 72   && (pWin->pStar
5310: 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29  t || pWin->pEnd)
5320: 20 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70   .   && (pWin->p
5330: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57  OrderBy==0 || pW
5340: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
5350: 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20  xpr!=1).  ){.   
5360: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5370: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5380: 22 52 41 4e 47 45 20 77 69 74 68 20 6f 66 66 73  "RANGE with offs
5390: 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c  et PRECEDING/FOL
53a0: 4c 4f 57 49 4e 47 20 72 65 71 75 69 72 65 73 20  LOWING requires 
53b0: 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  one ORDER BY exp
53c0: 72 65 73 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a  ression".    );.
53d0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 46    }else.  if( pF
53e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
53f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
5400: 44 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DOW ){.    sqlit
5410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5420: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69  >db;.    if( pWi
5430: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5450: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
5460: 20 20 20 20 20 20 20 22 46 49 4c 54 45 52 20 63         "FILTER c
5470: 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62  lause may only b
5480: 65 20 75 73 65 64 20 77 69 74 68 20 61 67 67 72  e used with aggr
5490: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
54a0: 63 74 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b  ctions".      );
54b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
54c0: 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 55    struct WindowU
54d0: 70 64 61 74 65 20 7b 0a 20 20 20 20 20 20 20 20  pdate {.        
54e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
54f0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
5500: 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 20  FrmType;.       
5510: 20 69 6e 74 20 65 53 74 61 72 74 3b 0a 20 20 20   int eStart;.   
5520: 20 20 20 20 20 69 6e 74 20 65 45 6e 64 3b 0a 20       int eEnd;. 
5530: 20 20 20 20 20 7d 20 61 55 70 5b 5d 20 3d 20 7b       } aUp[] = {
5540: 0a 20 20 20 20 20 20 20 20 7b 20 72 6f 77 5f 6e  .        { row_n
5550: 75 6d 62 65 72 4e 61 6d 65 2c 20 20 20 54 4b 5f  umberName,   TK_
5560: 52 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  ROWS,   TK_UNBOU
5570: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
5580: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 64   }, .        { d
5590: 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 2c 20 20  ense_rankName,  
55a0: 20 54 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55   TK_RANGE,  TK_U
55b0: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
55c0: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20  RENT }, .       
55d0: 20 7b 20 72 61 6e 6b 4e 61 6d 65 2c 20 20 20 20   { rankName,    
55e0: 20 20 20 20 20 54 4b 5f 52 41 4e 47 45 2c 20 20       TK_RANGE,  
55f0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5600: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
5610: 20 20 20 20 20 7b 20 70 65 72 63 65 6e 74 5f 72       { percent_r
5620: 61 6e 6b 4e 61 6d 65 2c 20 54 4b 5f 47 52 4f 55  ankName, TK_GROU
5630: 50 53 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20  PS, TK_CURRENT, 
5640: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d    TK_UNBOUNDED }
5650: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 63 75 6d  , .        { cum
5660: 65 5f 64 69 73 74 4e 61 6d 65 2c 20 20 20 20 54  e_distName,    T
5670: 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 46 4f 4c  K_GROUPS, TK_FOL
5680: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
5690: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
56a0: 20 7b 20 6e 74 69 6c 65 4e 61 6d 65 2c 20 20 20   { ntileName,   
56b0: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
56c0: 54 4b 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b  TK_CURRENT,   TK
56d0: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
56e0: 20 20 20 20 20 20 20 7b 20 6c 65 61 64 4e 61 6d         { leadNam
56f0: 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  e,         TK_RO
5700: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
5710: 45 44 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  ED, TK_UNBOUNDED
5720: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6c   }, .        { l
5730: 61 67 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  agName,         
5740: 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 55   TK_ROWS,   TK_U
5750: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
5760: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 7d  RENT }, .      }
5770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5780: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5790: 41 72 72 61 79 53 69 7a 65 28 61 55 70 29 3b 20  ArraySize(aUp); 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
57b0: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
57c0: 61 55 70 5b 69 5d 2e 7a 46 75 6e 63 20 29 7b 0a  aUp[i].zFunc ){.
57d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
57e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
57f0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
5800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5820: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
5830: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64        pWin->pEnd
5840: 20 3d 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20   = pWin->pStart 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
5860: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20  Win->eFrmType = 
5870: 61 55 70 5b 69 5d 2e 65 46 72 6d 54 79 70 65 3b  aUp[i].eFrmType;
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5890: 3e 65 53 74 61 72 74 20 3d 20 61 55 70 5b 69 5d  >eStart = aUp[i]
58a0: 2e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  .eStart;.       
58b0: 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20     pWin->eEnd = 
58c0: 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20 20 20  aUp[i].eEnd;.   
58d0: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 78         pWin->eEx
58e0: 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
58f0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65       if( pWin->e
5900: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
5910: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
5920: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
5930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
5940: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 31  , TK_INTEGER, "1
5950: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
5960: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5980: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
5990: 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  Win->pFunc = pFu
59a0: 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  nc;.}../*.** Con
59b0: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
59c0: 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74  ed through sqlit
59d0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29  e3WalkExprList()
59e0: 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e   to.** selectWin
59f0: 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62  dowRewriteExprCb
5a00: 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  () by selectWind
5a10: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5a30: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
5a40: 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b  e WindowRewrite;
5a50: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65  .struct WindowRe
5a60: 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77  write {.  Window
5a70: 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73   *pWin;.  SrcLis
5a80: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
5a90: 69 73 74 20 2a 70 53 75 62 3b 0a 20 20 54 61 62  ist *pSub;.  Tab
5aa0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 65 6c 65  le *pTab;.  Sele
5ab0: 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b 20  ct *pSubSelect; 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5ad0: 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65 63  urrent sub-selec
5ae0: 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a  t, if any */.};.
5af0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20  ./*.** Callback 
5b00: 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79  function used by
5b10: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5b20: 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20  riteEList(). If 
5b30: 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68  necessary,.** th
5b40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
5b50: 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  nds to the outpu
5b60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  t expression-lis
5b70: 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a  t and updates .*
5b80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70  * expression (*p
5b90: 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e  pExpr) in place.
5ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5bb0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
5bc0: 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  teExprCb(Walker 
5bd0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
5be0: 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74  pExpr){.  struct
5bf0: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
5c00: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
5c10: 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65  Rewrite;.  Parse
5c20: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
5c30: 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f  er->pParse;..  /
5c40: 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
5c50: 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
5c60: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ed from within a
5c70: 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65   scalar sub-sele
5c80: 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73 65  ct.  ** that use
5c90: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
5ca0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
5cb0: 70 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79 20  processed, only 
5cc0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b 5f  process.  ** TK_
5cd0: 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f  COLUMN expressio
5ce0: 6e 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  ns that refer to
5cf0: 20 69 74 20 28 74 68 65 20 6f 75 74 65 72 20 53   it (the outer S
5d00: 45 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a 20  ELECT). Do.  ** 
5d10: 6e 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67 72  not process aggr
5d20: 65 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f 77  egates or window
5d30: 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61 6c   functions at al
5d40: 6c 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f 6e  l, as they belon
5d50: 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 63  g.  ** to the sc
5d60: 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74 2e  alar sub-select.
5d70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53    */.  if( p->pS
5d80: 75 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  ubSelect ){.    
5d90: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
5da0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
5db0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
5dc0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tinue;.    }else
5dd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72 63  {.      int nSrc
5de0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   = p->pSrc->nSrc
5df0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5e00: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5e10: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
5e20: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
5e30: 54 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d 3e  Table==p->pSrc->
5e40: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62  a[i].iCursor ) b
5e50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5e60: 20 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63 20      if( i==nSrc 
5e70: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
5e80: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tinue;.    }.  }
5e90: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
5ea0: 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61  r->op ){..    ca
5eb0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
5ec0: 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48        if( !ExprH
5ed0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
5ee0: 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  , EP_WinFunc) ){
5ef0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5f00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5f10: 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69       Window *pWi
5f20: 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  n;.        for(p
5f30: 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69  Win=p->pWin; pWi
5f40: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
5f50: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20  extWin){.       
5f60: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79 2e     if( pExpr->y.
5f70: 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20  pWin==pWin ){.  
5f80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5f90: 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d  ( pWin->pOwner==
5fa0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
5fb0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
5fc0: 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20  Prune;.         
5fd0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
5fe0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
5ff0: 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a  ll through.  */.
6000: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
6010: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
6020: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
6030: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
6040: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
6050: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
6060: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
6070: 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74 65  p->pSub = sqlite
6080: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6090: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c  pParse, p->pSub,
60a0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
60b0: 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20  ( p->pSub ){.   
60c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
60d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
60e0: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d 3d  pr, EP_Static)==
60f0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  0 );.        Exp
6100: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
6110: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a  pr, EP_Static);.
6120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6130: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
6140: 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  ->db, pExpr);.  
6150: 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50        ExprClearP
6160: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
6170: 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  P_Static);.     
6180: 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72 2c     memset(pExpr,
6190: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
61a0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70  );..        pExp
61b0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
61c0: 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  N;.        pExpr
61d0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70  ->iColumn = p->p
61e0: 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20  Sub->nExpr-1;.  
61f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
6200: 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69  ble = p->pWin->i
6210: 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 20 20  EphCsr;.        
6220: 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 3d 20  pExpr->y.pTab = 
6230: 70 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d  p->pTab;.      }
6240: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
6250: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
6260: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
6270: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6280: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
6290: 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
62a0: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
62b0: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
62c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
62d0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
62e0: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  t){.  struct Win
62f0: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
6300: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
6310: 69 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ite;.  Select *p
6320: 53 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65  Save = p->pSubSe
6330: 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76  lect;.  if( pSav
6340: 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e==pSelect ){.  
6350: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6360: 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tinue;.  }else{.
6370: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
6380: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
6390: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
63a0: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
63b0: 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75  ect);.    p->pSu
63c0: 62 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b  bSelect = pSave;
63d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
63e0: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
63f0: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
6400: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
6410: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
6420: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
6430: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
6440: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
6450: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
6460: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
6470: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
6480: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
6490: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
64a0: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
64b0: 68 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f  he .**     Windo
64c0: 77 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  w list passed as
64d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
64e0: 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a  ment (pWin)..**.
64f0: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f  ** Append the no
6500: 64 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70  de to output exp
6510: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70  ression-list (*p
6520: 70 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61  pSub). And repla
6530: 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20  ce it.** with a 
6540: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
6550: 65 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68  eads the (N-1)th
6560: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c   element of tabl
6570: 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68  e .** pWin->iEph
6580: 43 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  Csr, where N is 
6590: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
65a0: 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75  ements in (*ppSu
65b0: 62 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65  b) after.** appe
65c0: 6e 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  nding the new on
65d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
65e0: 64 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  d selectWindowRe
65f0: 77 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61  writeEList(.  Pa
6600: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
6610: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20  Window *pWin,.  
6620: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20  SrcList *pSrc,. 
6630: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6640: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
6650: 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72   /* Rewrite expr
6660: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
6670: 6c 69 73 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  list */.  Table 
6680: 2a 70 54 61 62 2c 0a 20 20 45 78 70 72 4c 69 73  *pTab,.  ExprLis
6690: 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20  t **ppSub       
66a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
66b0: 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65  UT: Sub-select e
66c0: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a  xpression-list *
66d0: 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  /.){.  Walker sW
66e0: 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52  alker;.  WindowR
66f0: 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b  ewrite sRewrite;
6700: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c  ..  memset(&sWal
6710: 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ker, 0, sizeof(W
6720: 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  alker));.  memse
6730: 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20  t(&sRewrite, 0, 
6740: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77  sizeof(WindowRew
6750: 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72  rite));..  sRewr
6760: 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75  ite.pSub = *ppSu
6770: 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57  b;.  sRewrite.pW
6780: 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65  in = pWin;.  sRe
6790: 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72  write.pSrc = pSr
67a0: 63 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 54  c;.  sRewrite.pT
67b0: 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 73 57  ab = pTab;..  sW
67c0: 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70  alker.pParse = p
67d0: 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72  Parse;.  sWalker
67e0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
67f0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
6800: 72 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57  riteExprCb;.  sW
6810: 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
6820: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69  lback = selectWi
6830: 6e 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63  ndowRewriteSelec
6840: 74 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75  tCb;.  sWalker.u
6850: 2e 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65  .pRewrite = &sRe
6860: 77 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29  write;..  (void)
6870: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
6880: 69 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45  ist(&sWalker, pE
6890: 4c 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62  List);..  *ppSub
68a0: 20 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62   = sRewrite.pSub
68b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
68c0: 64 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68  d a copy of each
68d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65   expression in e
68e0: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
68f0: 41 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70  Append to.** exp
6900: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69  ression list pLi
6910: 73 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69  st. Return a poi
6920: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75  nter to the resu
6930: 6c 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  lt list..*/.stat
6940: 69 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70  ic ExprList *exp
6950: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
6960: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6970: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
6980: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6990: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
69a0: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
69b0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
69c0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
69d0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
69e0: 73 74 20 2a 70 41 70 70 65 6e 64 2c 20 20 20 20  st *pAppend,    
69f0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
6a00: 75 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ues to append. M
6a10: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
6a20: 20 20 69 6e 74 20 62 49 6e 74 54 6f 4e 75 6c 6c    int bIntToNull
6a30: 0a 29 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e  .){.  if( pAppen
6a40: 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  d ){.    int i;.
6a50: 20 20 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20      int nInit = 
6a60: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
6a70: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f  Expr : 0;.    fo
6a80: 72 28 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64  r(i=0; i<pAppend
6a90: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6aa0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 20       Expr *pDup 
6ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
6ac0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70  (pParse->db, pAp
6ad0: 70 65 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pend->a[i].pExpr
6ae0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
6af0: 62 49 6e 74 54 6f 4e 75 6c 6c 20 26 26 20 70 44  bIntToNull && pD
6b00: 75 70 20 26 26 20 70 44 75 70 2d 3e 6f 70 3d 3d  up && pDup->op==
6b10: 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
6b20: 20 20 20 20 20 20 70 44 75 70 2d 3e 6f 70 20 3d        pDup->op =
6b30: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
6b40: 20 20 70 44 75 70 2d 3e 66 6c 61 67 73 20 26 3d    pDup->flags &=
6b50: 20 7e 28 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   ~(EP_IntValue|E
6b60: 50 5f 49 73 54 72 75 65 7c 45 50 5f 49 73 46 61  P_IsTrue|EP_IsFa
6b70: 6c 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lse);.      }.  
6b80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6b90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6ba0: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
6bb0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
6bc0: 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d  ( pList ) pList-
6bd0: 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74  >a[nInit+i].sort
6be0: 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d  Order = pAppend-
6bf0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
6c00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6c10: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
6c20: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
6c30: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
6c40: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6c50: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
6c60: 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79  ot invoke.** any
6c70: 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63   SQL window func
6c80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63  tions, this func
6c90: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6ca0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a   Otherwise, it .
6cb0: 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20  ** rewrites the 
6cc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6cd0: 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20   so that window 
6ce0: 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66  function xStep f
6cf0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
6d00: 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63  invoked in the c
6d10: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20  orrect order as 
6d20: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20  described under 
6d30: 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e  "SELECT REWRITIN
6d40: 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70  G".** at the top
6d50: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
6d60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
6d70: 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65  dowRewrite(Parse
6d80: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6d90: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
6da0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
6db0: 28 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e  ( p->pWin && p->
6dc0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
6dd0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6de0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  );.    sqlite3 *
6e00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6e10: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
6e20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
6e30: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
6e40: 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ry */.    SrcLis
6e50: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
6e60: 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68  c;.    Expr *pWh
6e70: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
6e80: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6e90: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
6ea0: 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20  oupBy;.    Expr 
6eb0: 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48  *pHaving = p->pH
6ec0: 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c  aving;.    ExprL
6ed0: 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a  ist *pSort = 0;.
6ee0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6ef0: 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Sublist = 0;    
6f00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6f10: 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75   list for sub-qu
6f20: 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ery */.    Windo
6f30: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
6f40: 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74  in;      /* Mast
6f50: 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  er window object
6f60: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
6f70: 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  pWin;           
6f80: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
6f90: 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
6fa0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
6fb0: 61 62 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20  ab;..    pTab = 
6fc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6fd0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
6fe0: 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
6ff0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
7000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7010: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OMEM;.    }..   
7020: 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
7030: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b    p->pWhere = 0;
7040: 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
7050: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61   = 0;.    p->pHa
7060: 76 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  ving = 0;.    p-
7070: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
7080: 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 20 20 20  _Aggregate;..   
7090: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 4f   /* Create the O
70a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
70b0: 6f 72 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  or the sub-selec
70c0: 74 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 63  t. This is the c
70d0: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a 20 20 20  oncatenation.   
70e0: 20 2a 2a 20 6f 66 20 74 68 65 20 77 69 6e 64 6f   ** of the windo
70f0: 77 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20  w PARTITION and 
7100: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
7110: 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
7120: 6d 61 6b 65 73 20 69 74 0a 20 20 20 20 2a 2a 20  makes it.    ** 
7130: 72 65 64 75 6e 64 61 6e 74 2c 20 72 65 6d 6f 76  redundant, remov
7140: 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 66  e the ORDER BY f
7150: 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 53  rom the parent S
7160: 45 4c 45 43 54 2e 20 20 2a 2f 0a 20 20 20 20 70  ELECT.  */.    p
7170: 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Sort = sqlite3Ex
7180: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
7190: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  Win->pPartition,
71a0: 20 30 29 3b 0a 20 20 20 20 70 53 6f 72 74 20 3d   0);.    pSort =
71b0: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
71c0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
71d0: 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  t, pMWin->pOrder
71e0: 42 79 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  By, 1);.    if( 
71f0: 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72 64  pSort && p->pOrd
7200: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
7210: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
7220: 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c 20  tCompare(pSort, 
7230: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  p->pOrderBy, -1)
7240: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
7250: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7260: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
7270: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
7280: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
7290: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
72a0: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63     /* Assign a c
72b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
72c0: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
72d0: 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66  able used to buf
72e0: 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a  fer rows..    **
72f0: 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   The OpenEphemer
7300: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  al instruction i
7310: 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61  s coded later, a
7320: 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e  fter it is known
7330: 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   how.    ** many
7340: 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62   columns the tab
7350: 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a  le will have.  *
7360: 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70  /.    pMWin->iEp
7370: 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  hCsr = pParse->n
7380: 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  Tab++;.    pPars
7390: 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20  e->nTab += 3;.. 
73a0: 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52     selectWindowR
73b0: 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72  ewriteEList(pPar
73c0: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c  se, pMWin, pSrc,
73d0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 70 54 61 62   p->pEList, pTab
73e0: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
73f0: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
7400: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
7410: 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20  e, pMWin, pSrc, 
7420: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 54 61  p->pOrderBy, pTa
7430: 62 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20  b, &pSublist);. 
7440: 20 20 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65     pMWin->nBuffe
7450: 72 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74  rCol = (pSublist
7460: 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78   ? pSublist->nEx
7470: 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  pr : 0);..    /*
7480: 20 41 70 70 65 6e 64 20 74 68 65 20 50 41 52 54   Append the PART
7490: 49 54 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52 44  ITION BY and ORD
74a0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
74b0: 73 20 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20  s to the to the 
74c0: 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65  .    ** sub-sele
74d0: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ct expression li
74e0: 73 74 2e 20 54 68 65 79 20 61 72 65 20 72 65 71  st. They are req
74f0: 75 69 72 65 64 20 74 6f 20 66 69 67 75 72 65 20  uired to figure 
7500: 6f 75 74 20 77 68 65 72 65 20 0a 20 20 20 20 2a  out where .    *
7510: 2a 20 62 6f 75 6e 64 61 72 69 65 73 20 66 6f 72  * boundaries for
7520: 20 70 61 72 74 69 74 69 6f 6e 73 20 61 6e 64 20   partitions and 
7530: 73 65 74 73 20 6f 66 20 70 65 65 72 20 72 6f 77  sets of peer row
7540: 73 20 6c 69 65 2e 20 20 2a 2f 0a 20 20 20 20 70  s lie.  */.    p
7550: 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69  Sublist = exprLi
7560: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
7570: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
7580: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
7590: 2c 20 30 29 3b 0a 20 20 20 20 70 53 75 62 6c 69  , 0);.    pSubli
75a0: 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  st = exprListApp
75b0: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
75c0: 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d  pSublist, pMWin-
75d0: 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a  >pOrderBy, 0);..
75e0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
75f0: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
7600: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
7610: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
7620: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
7630: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
7640: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
7650: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
7660: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
7670: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
7680: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
7690: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
76a0: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
76b0: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
76c0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
76d0: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
76e0: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
76f0: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
7700: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
7710: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
7720: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
7730: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
7740: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
7750: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
7760: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
7770: 78 2e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  x.pList, 0);.   
7780: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69     if( pWin->pFi
7790: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
77a0: 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20  Expr *pFilter = 
77b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
77c0: 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  b, pWin->pFilter
77d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 53  , 0);.        pS
77e0: 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ublist = sqlite3
77f0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7800: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
7810: 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20   pFilter);.     
7820: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72   }.      pWin->r
7830: 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72  egAccum = ++pPar
7840: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
7850: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20  pWin->regResult 
7860: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7870: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7880: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7890: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
78a0: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a  egAccum);.    }.
78b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
78c0: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
78d0: 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20  or PARTITION BY 
78e0: 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20  clause, and the 
78f0: 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75  window.    ** fu
7900: 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 7a  nction accepts z
7910: 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 61  ero arguments, a
7920: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
7930: 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20  other columns.  
7940: 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28 65    ** selected (e
7950: 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77 5f  .g. "SELECT row_
7960: 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28 29  number() OVER ()
7970: 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20 69   FROM t1"), it i
7980: 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a  s possible.    *
7990: 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74 20  * that pSublist 
79a0: 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65  is still NULL he
79b0: 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74 61  re. Add a consta
79c0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68 65  nt expression he
79d0: 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65  re to .    ** ke
79e0: 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c 65  ep everything le
79f0: 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65  gal in this case
7a00: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
7a10: 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b  ( pSublist==0 ){
7a20: 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20  .      pSublist 
7a30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7a40: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
7a50: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  0, .          sq
7a60: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
7a70: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
7a80: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
7a90: 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29 3b  [0], 0).      );
7aa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75 62  .    }..    pSub
7ab0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7ac0: 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50 61  New(.        pPa
7ad0: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
7ae0: 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47 72  Src, pWhere, pGr
7af0: 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20  oupBy, pHaving, 
7b00: 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20 20  pSort, 0, 0.    
7b10: 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  );.    p->pSrc =
7b20: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
7b30: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
7b40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
7b50: 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 20  p->pSrc ){.     
7b60: 20 54 61 62 6c 65 20 2a 70 54 61 62 32 3b 0a 20   Table *pTab2;. 
7b70: 20 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b       p->pSrc->a[
7b80: 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  0].pSelect = pSu
7b90: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
7ba0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
7bb0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
7bc0: 70 53 72 63 29 3b 0a 20 20 20 20 20 20 70 53 75  pSrc);.      pSu
7bd0: 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
7be0: 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20  F_Expanded;.    
7bf0: 20 20 70 54 61 62 32 20 3d 20 73 71 6c 69 74 65    pTab2 = sqlite
7c00: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
7c10: 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 29  ct(pParse, pSub)
7c20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7c30: 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  2==0 ){.        
7c40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7c50: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
7c60: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
7c70: 54 61 62 2c 20 70 54 61 62 32 2c 20 73 69 7a 65  Tab, pTab2, size
7c80: 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
7c90: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
7ca0: 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
7cb0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  al;.        p->p
7cc0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d  Src->a[0].pTab =
7cd0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70   pTab;.        p
7ce0: 54 61 62 20 3d 20 70 54 61 62 32 3b 0a 20 20 20  Tab = pTab2;.   
7cf0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7d00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7d10: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7d20: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7d30: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
7d40: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7d50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7d60: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
7d70: 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57  ->iEphCsr+1, pMW
7d80: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7d90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7da0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7db0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
7dc0: 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+2, pMWin->iE
7dd0: 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71  phCsr);.      sq
7de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7df0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7e00: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c  MWin->iEphCsr+3,
7e10: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e30: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7e40: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29  Delete(db, pSub)
7e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7e60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7e70: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
7e80: 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  OMEM;.    sqlite
7e90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
7ea0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
7eb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
7ec0: 65 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62  ee the Window ob
7ed0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
7ee0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7ef0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
7f00: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
7f10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e  sqlite3 *db, Win
7f20: 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dow *p){.  if( p
7f30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7f40: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
7f50: 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 73  >pFilter);.    s
7f60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7f70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72  lete(db, p->pPar
7f80: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  tition);.    sql
7f90: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7fa0: 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
7fb0: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
7fc0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7fd0: 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  ->pEnd);.    sql
7fe0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7ff0: 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a 20  b, p->pStart);. 
8000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8010: 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  (db, p->zName);.
8020: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8030: 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29 3b  e(db, p->zBase);
8040: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8050: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
8060: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
8070: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
8080: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 73  Window objects s
8090: 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20 73  tarting at the s
80a0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
80b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
80c0: 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28  indowListDelete(
80d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e  sqlite3 *db, Win
80e0: 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  dow *p){.  while
80f0: 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f  ( p ){.    Windo
8100: 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  w *pNext = p->pN
8110: 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69  extWin;.    sqli
8120: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
8130: 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20  db, p);.    p = 
8140: 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pNext;.  }.}../*
8150: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
8160: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
8170: 6e 20 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46  n PRECEDING or F
8180: 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74 2e  OLLOWING offset.
8190: 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73    The.** value s
81a0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d 6e  hould be a non-n
81b0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
81c0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69    If the value i
81d0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73 74  s not a.** const
81e0: 61 6e 74 2c 20 63 68 61 6e 67 65 20 69 74 20 74  ant, change it t
81f0: 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61 63  o NULL.  The fac
8200: 74 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  t that it is the
8210: 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  n a non-negative
8220: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77 69 6c 6c  .** integer will
8230: 20 62 65 20 63 61 75 67 68 74 20 6c 61 74 65 72   be caught later
8240: 2e 20 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  .  But it is imp
8250: 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c 65  ortant not to le
8260: 61 76 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ave.** variable 
8270: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 65 78  values in the ex
8280: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
8290: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
82a0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73  qlite3WindowOffs
82b0: 65 74 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  etExpr(Parse *pP
82c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
82d0: 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c  r){.  if( 0==sql
82e0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
82f0: 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
8300: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
8310: 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33 52  BJECT ) sqlite3R
8320: 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70  enameExprUnmap(p
8330: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
8340: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
8350: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
8360: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45 78   pExpr);.    pEx
8370: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
8380: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
8390: 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29  , TK_NULL, 0, 0)
83a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
83b0: 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Expr;.}../*.** A
83c0: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
83d0: 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77 20  rn a new Window 
83e0: 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e  object describin
83f0: 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69 6e  g a Window Defin
8400: 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f 77  ition..*/.Window
8410: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41   *sqlite3WindowA
8420: 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a 70  lloc(.  Parse *p
8430: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
8440: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8450: 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20 20    int eType,    
8460: 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79 70      /* Frame typ
8470: 65 2e 20 54 4b 5f 52 41 4e 47 45 2c 20 54 4b 5f  e. TK_RANGE, TK_
8480: 52 4f 57 53 2c 20 54 4b 5f 47 52 4f 55 50 53 2c  ROWS, TK_GROUPS,
8490: 20 6f 72 20 30 20 2a 2f 0a 20 20 69 6e 74 20 65   or 0 */.  int e
84a0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f 2a 20  Start,       /* 
84b0: 53 74 61 72 74 20 74 79 70 65 3a 20 43 55 52 52  Start type: CURR
84c0: 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47 2c 20  ENT, PRECEDING, 
84d0: 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42 4f 55  FOLLOWING, UNBOU
84e0: 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NDED */.  Expr *
84f0: 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53  pStart,     /* S
8500: 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69 7a 65  tart window size
8510: 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49 4e 47   if TK_PRECEDING
8520: 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f   or FOLLOWING */
8530: 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20 20 20  .  int eEnd,    
8540: 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79 70 65       /* End type
8550: 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c 4c 4f  : CURRENT, FOLLO
8560: 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44  WING, TK_UNBOUND
8570: 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  ED, PRECEDING */
8580: 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 2c 20 20  .  Expr *pEnd,  
8590: 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69 6e 64       /* End wind
85a0: 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 46 4f  ow size if TK_FO
85b0: 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45 43 45  LLOWING or PRECE
85c0: 44 49 4e 47 20 2a 2f 0a 20 20 75 38 20 65 45 78  DING */.  u8 eEx
85d0: 63 6c 75 64 65 20 20 20 20 20 20 20 2f 2a 20 45  clude       /* E
85e0: 58 43 4c 55 44 45 20 63 6c 61 75 73 65 20 2a 2f  XCLUDE clause */
85f0: 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  .){.  Window *pW
8600: 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 49  in = 0;.  int bI
8610: 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 30  mplicitFrame = 0
8620: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20 61  ;..  /* Parser a
8630: 73 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ssures the follo
8640: 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65 72  wing: */.  asser
8650: 74 28 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20 65  t( eType==0 || e
8660: 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c  Type==TK_RANGE |
8670: 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53  | eType==TK_ROWS
8680: 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47 52   || eType==TK_GR
8690: 4f 55 50 53 20 29 3b 0a 20 20 61 73 73 65 72 74  OUPS );.  assert
86a0: 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ( eStart==TK_CUR
86b0: 52 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d 3d  RENT || eStart==
86c0: 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20 20  TK_PRECEDING.   
86d0: 20 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61 72          || eStar
86e0: 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
86f0: 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  || eStart==TK_FO
8700: 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73 73  LLOWING );.  ass
8710: 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43 55  ert( eEnd==TK_CU
8720: 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d 54  RRENT || eEnd==T
8730: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20  K_FOLLOWING.    
8740: 20 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d 3d         || eEnd==
8750: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20  TK_UNBOUNDED || 
8760: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
8770: 4e 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NG );.  assert( 
8780: 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  (eStart==TK_PREC
8790: 45 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74 3d  EDING || eStart=
87a0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d 3d  =TK_FOLLOWING)==
87b0: 28 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a 20  (pStart!=0) );. 
87c0: 20 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d 3d   assert( (eEnd==
87d0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20  TK_FOLLOWING || 
87e0: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
87f0: 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20 29  NG)==(pEnd!=0) )
8800: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
8810: 30 20 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69 63  0 ){.    bImplic
8820: 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20 20  itFrame = 1;.   
8830: 20 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e 47   eType = TK_RANG
8840: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  E;.  }..  /* Add
8850: 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 20  itionally, the. 
8860: 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f 75   ** starting bou
8870: 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20 6e  ndary type may n
8880: 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65 72  ot occur earlier
8890: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
88a0: 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a 2a  g list than.  **
88b0: 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75 6e   the ending boun
88c0: 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a 0a  dary type:.  **.
88d0: 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44    **   UNBOUNDED
88e0: 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20   PRECEDING.  ** 
88f0: 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49    <expr> PRECEDI
8900: 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45 4e  NG.  **   CURREN
8910: 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65 78  T ROW.  **   <ex
8920: 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  pr> FOLLOWING.  
8930: 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 46  **   UNBOUNDED F
8940: 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20  OLLOWING.  **.  
8950: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65 6e  ** The parser en
8960: 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42 4f  sures that "UNBO
8970: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 22  UNDED PRECEDING"
8980: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
8990: 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20 2a  as an ending.  *
89a0: 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64 20  * boundary, and 
89b0: 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44 20  than "UNBOUNDED 
89c0: 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e 6f  FOLLOWING" canno
89d0: 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20 73  t be used as a s
89e0: 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72 61  tarting.  ** fra
89f0: 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 2a  me boundary..  *
8a00: 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74 3d  /.  if( (eStart=
8a10: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 65  =TK_CURRENT && e
8a20: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
8a30: 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72 74  G).   || (eStart
8a40: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26  ==TK_FOLLOWING &
8a50: 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  & (eEnd==TK_PREC
8a60: 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54  EDING || eEnd==T
8a70: 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29 7b  K_CURRENT)).  ){
8a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8a90: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
8aa0: 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65 20  supported frame 
8ab0: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 22 29 3b  specification");
8ac0: 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77  .    goto window
8ad0: 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20  AllocErr;.  }.. 
8ae0: 20 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a   pWin = (Window*
8af0: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
8b00: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
8b10: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29   sizeof(Window))
8b20: 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30 20  ;.  if( pWin==0 
8b30: 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c  ) goto windowAll
8b40: 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65  ocErr;.  pWin->e
8b50: 46 72 6d 54 79 70 65 20 3d 20 65 54 79 70 65 3b  FrmType = eType;
8b60: 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20  .  pWin->eStart 
8b70: 3d 20 65 53 74 61 72 74 3b 0a 20 20 70 57 69 6e  = eStart;.  pWin
8b80: 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20  ->eEnd = eEnd;. 
8b90: 20 69 66 28 20 65 45 78 63 6c 75 64 65 3d 3d 30   if( eExclude==0
8ba0: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
8bb0: 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d  Disabled(pParse-
8bc0: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 57 69 6e 64  >db, SQLITE_Wind
8bd0: 6f 77 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 65  owFunc) ){.    e
8be0: 45 78 63 6c 75 64 65 20 3d 20 54 4b 5f 4e 4f 3b  Exclude = TK_NO;
8bf0: 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 65 45 78  .  }.  pWin->eEx
8c00: 63 6c 75 64 65 20 3d 20 65 45 78 63 6c 75 64 65  clude = eExclude
8c10: 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d 70 6c 69  ;.  pWin->bImpli
8c20: 63 69 74 46 72 61 6d 65 20 3d 20 62 49 6d 70 6c  citFrame = bImpl
8c30: 69 63 69 74 46 72 61 6d 65 3b 0a 20 20 70 57 69  icitFrame;.  pWi
8c40: 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  n->pEnd = sqlite
8c50: 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70  3WindowOffsetExp
8c60: 72 28 70 50 61 72 73 65 2c 20 70 45 6e 64 29 3b  r(pParse, pEnd);
8c70: 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20  .  pWin->pStart 
8c80: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f  = sqlite3WindowO
8c90: 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65  ffsetExpr(pParse
8ca0: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
8cb0: 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69 6e 64 6f  urn pWin;..windo
8cc0: 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20 73 71 6c  wAllocErr:.  sql
8cd0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8ce0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29  Parse->db, pEnd)
8cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
8d00: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8d10: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
8d20: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8d30: 41 74 74 61 63 68 20 50 41 52 54 49 54 49 4f 4e  Attach PARTITION
8d40: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
8d50: 61 75 73 65 73 20 70 50 61 72 74 69 74 69 6f 6e  auses pPartition
8d60: 20 61 6e 64 20 70 4f 72 64 65 72 42 79 20 74 6f   and pOrderBy to
8d70: 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57 69 6e 2e   window.** pWin.
8d80: 20 41 6c 73 6f 2c 20 69 66 20 70 61 72 61 6d 65   Also, if parame
8d90: 74 65 72 20 70 42 61 73 65 20 69 73 20 6e 6f 74  ter pBase is not
8da0: 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57 69 6e 2d   NULL, set pWin-
8db0: 3e 7a 42 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  >zBase to the.**
8dc0: 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 75 6c 2d   equivalent nul-
8dd0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
8de0: 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71  g..*/.Window *sq
8df0: 6c 69 74 65 33 57 69 6e 64 6f 77 41 73 73 65 6d  lite3WindowAssem
8e00: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
8e10: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
8e20: 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70 72 4c 69  *pWin, .  ExprLi
8e30: 73 74 20 2a 70 50 61 72 74 69 74 69 6f 6e 2c 20  st *pPartition, 
8e40: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
8e50: 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b 65 6e 20  derBy, .  Token 
8e60: 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69 66 28 20  *pBase.){.  if( 
8e70: 70 57 69 6e 20 29 7b 0a 20 20 20 20 70 57 69 6e  pWin ){.    pWin
8e80: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 70  ->pPartition = p
8e90: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 70  Partition;.    p
8ea0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Win->pOrderBy = 
8eb0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66  pOrderBy;.    if
8ec0: 28 20 70 42 61 73 65 20 29 7b 0a 20 20 20 20 20  ( pBase ){.     
8ed0: 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 73   pWin->zBase = s
8ee0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
8ef0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 42 61 73  pParse->db, pBas
8f00: 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e 6e 29 3b  e->z, pBase->n);
8f10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
8f20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8f30: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
8f40: 2d 3e 64 62 2c 20 70 50 61 72 74 69 74 69 6f 6e  ->db, pPartition
8f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
8f60: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
8f70: 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
8f80: 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
8f90: 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pWin;.}../*.** 
8fa0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 68 61 73  Window *pWin has
8fb0: 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
8fc0: 65 64 20 66 72 6f 6d 20 61 20 57 49 4e 44 4f 57  ed from a WINDOW
8fd0: 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e 65 20 70   clause. Tokne p
8fe0: 42 61 73 65 0a 2a 2a 20 69 73 20 74 68 65 20 62  Base.** is the b
8ff0: 61 73 65 20 77 69 6e 64 6f 77 2e 20 45 61 72 6c  ase window. Earl
9000: 69 65 72 20 77 69 6e 64 6f 77 73 20 66 72 6f 6d  ier windows from
9010: 20 74 68 65 20 73 61 6d 65 20 57 49 4e 44 4f 57   the same WINDOW
9020: 20 63 6c 61 75 73 65 20 61 72 65 0a 2a 2a 20 73   clause are.** s
9030: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6c 69 6e  tored in the lin
9040: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
9050: 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e 65 78 74  g at pWin->pNext
9060: 57 69 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  Win. This functi
9070: 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20 75 70 64  on.** either upd
9080: 61 74 65 73 20 2a 70 57 69 6e 20 61 63 63 6f 72  ates *pWin accor
9090: 64 69 6e 67 20 74 6f 20 74 68 65 20 62 61 73 65  ding to the base
90a0: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 2c 20   specification, 
90b0: 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65 61 76 65  or else.** leave
90c0: 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  s an error in pP
90d0: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
90e0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61 69 6e  lite3WindowChain
90f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9100: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 57 69  Window *pWin, Wi
9110: 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b 0a 20 20  ndow *pList){.  
9120: 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20  if( pWin->zBase 
9130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
9140: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9150: 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 45 78  .    Window *pEx
9160: 69 73 74 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64  ist = windowFind
9170: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
9180: 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20  pWin->zBase);.  
9190: 20 20 69 66 28 20 70 45 78 69 73 74 20 29 7b 0a    if( pExist ){.
91a0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
91b0: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20   *zErr = 0;.    
91c0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
91d0: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 69  rrors */.      i
91e0: 66 28 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74  f( pWin->pPartit
91f0: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ion ){.        z
9200: 45 72 72 20 3d 20 22 50 41 52 54 49 54 49 4f 4e  Err = "PARTITION
9210: 20 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20 20   clause";.      
9220: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 69 73 74  }else if( pExist
9230: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 57  ->pOrderBy && pW
9240: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  in->pOrderBy ){.
9250: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22          zErr = "
9260: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22  ORDER BY clause"
9270: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9280: 28 20 70 45 78 69 73 74 2d 3e 62 49 6d 70 6c 69  ( pExist->bImpli
9290: 63 69 74 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  citFrame==0 ){. 
92a0: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 66         zErr = "f
92b0: 72 61 6d 65 20 73 70 65 63 69 66 69 63 61 74 69  rame specificati
92c0: 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on";.      }.   
92d0: 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20     if( zErr ){. 
92e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
92f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
9300: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
9310: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 25 73 20  not override %s 
9320: 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20  of window: %s", 
9330: 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a 42 61 73  zErr, pWin->zBas
9340: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
9350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9360: 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69    pWin->pPartiti
9370: 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  on = sqlite3Expr
9380: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 78 69  ListDup(db, pExi
9390: 73 74 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  st->pPartition, 
93a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
93b0: 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79  pExist->pOrderBy
93c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
93d0: 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 72 64  sert( pWin->pOrd
93e0: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
93f0: 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65       pWin->pOrde
9400: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
9410: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 78  rListDup(db, pEx
9420: 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  ist->pOrderBy, 0
9430: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9440: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9450: 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e 7a 42 61  ee(db, pWin->zBa
9460: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 69  se);.        pWi
9470: 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b 0a 20 20  n->zBase = 0;.  
9480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
94a0: 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 57  window object pW
94b0: 69 6e 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  in to expression
94c0: 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   p..*/.void sqli
94d0: 74 65 33 57 69 6e 64 6f 77 41 74 74 61 63 68 28  te3WindowAttach(
94e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
94f0: 78 70 72 20 2a 70 2c 20 45 78 70 72 20 2a 70 46  xpr *p, Expr *pF
9500: 69 6c 74 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70  ilter, Window *p
9510: 57 69 6e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  Win){.  if( p ){
9520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9530: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
9540: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20  );.    if( pWin 
9550: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 79 2e 70 57  ){.      p->y.pW
9560: 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20  in = pWin;.     
9570: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
9580: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b  (p, EP_WinFunc);
9590: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77  .      pWin->pOw
95a0: 6e 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 69  ner = p;.      i
95b0: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
95c0: 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
95d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
95e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
95f0: 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43          "DISTINC
9600: 54 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  T is not support
9610: 65 64 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75  ed for window fu
9620: 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20  nctions");.     
9630: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 70   }.      pWin->p
9640: 46 69 6c 74 65 72 20 3d 20 70 46 69 6c 74 65 72  Filter = pFilter
9650: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9660: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
9670: 20 70 2d 3e 79 2e 70 46 69 6c 74 65 72 20 3d 20   p->y.pFilter = 
9680: 70 46 69 6c 74 65 72 3b 0a 20 20 20 20 20 20 45  pFilter;.      E
9690: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
96a0: 2c 20 45 50 5f 46 69 6c 74 65 72 29 3b 0a 20 20  , EP_Filter);.  
96b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
96c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
96d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
96e0: 20 70 57 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69   pWin);.    sqli
96f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
9700: 61 72 73 65 2d 3e 64 62 2c 20 70 46 69 6c 74 65  arse->db, pFilte
9710: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
9720: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
9730: 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65   two window obje
9740: 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  cts are identica
9750: 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  l, or non-zero o
9760: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65  therwise..** Ide
9770: 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62  ntical window ob
9780: 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f  jects can be pro
9790: 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67  cessed in a sing
97a0: 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20  le scan..*/.int 
97b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
97c0: 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
97d0: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20  se, Window *p1, 
97e0: 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69  Window *p2){.  i
97f0: 66 28 20 70 31 2d 3e 65 46 72 6d 54 79 70 65 21  f( p1->eFrmType!
9800: 3d 70 32 2d 3e 65 46 72 6d 54 79 70 65 20 29 20  =p2->eFrmType ) 
9810: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9820: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
9830: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
9840: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
9850: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
9860: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
9870: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 70 32 2d 3e  ->eExclude!=p2->
9880: 65 45 78 63 6c 75 64 65 20 29 20 72 65 74 75 72  eExclude ) retur
9890: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
98a0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
98b0: 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74  arse, p1->pStart
98c0: 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31  , p2->pStart, -1
98d0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
98e0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
98f0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
9900: 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e  1->pEnd, p2->pEn
9910: 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  d, -1) ) return 
9920: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9930: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
9940: 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p1->pPartition, 
9950: 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p2->pPartition, 
9960: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9980: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
9990: 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70  >pOrderBy, p2->p
99a0: 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72  OrderBy, -1) ) r
99b0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
99c0: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
99d0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79  his is called by
99e0: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
99f0: 63 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c  c before it call
9a00: 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  s sqlite3WhereBe
9a10: 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69  gin().** to begi
9a20: 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
9a30: 75 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72  ugh the sub-quer
9a40: 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73  y results. It is
9a50: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
9a60: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
9a70: 69 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ize registers an
9a80: 64 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62  d cursors used b
9a90: 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  y sqlite3WindowC
9aa0: 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  odeStep()..*/.vo
9ab0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
9ac0: 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a  CodeInit(Parse *
9ad0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
9ae0: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
9af0: 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a   *pWin;.  Vdbe *
9b00: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9b10: 62 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  be(pParse);..  /
9b20: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
9b30: 74 65 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ters to use for 
9b40: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 76 61 6c  PARTITION BY val
9b50: 75 65 73 2c 20 69 66 20 61 6e 79 2e 20 49 6e 69  ues, if any. Ini
9b60: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 73 61 69  tialize.  ** sai
9b70: 64 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 4e  d registers to N
9b80: 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
9b90: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
9ba0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70   ){.    int nExp
9bb0: 72 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  r = pMWin->pPart
9bc0: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
9bd0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74    pMWin->regPart
9be0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9bf0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
9c00: 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 3b 0a 20 20  Mem += nExpr;.  
9c10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9c20: 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
9c30: 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  0, pMWin->regPar
9c40: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
9c50: 74 2b 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a  t+nExpr-1);.  }.
9c60: 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65  .  pMWin->regOne
9c70: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
9c80: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
9c90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9ca0: 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e  eger, 1, pMWin->
9cb0: 72 65 67 4f 6e 65 29 3b 0a 0a 20 20 69 66 28 20  regOne);..  if( 
9cc0: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20  pMWin->eExclude 
9cd0: 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65  ){.    pMWin->re
9ce0: 67 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b  gStartRowid = ++
9cf0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9d00: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52    pMWin->regEndR
9d10: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
9d20: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e  >nMem;.    pMWin
9d30: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
9d40: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
9d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9d60: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9d70: 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
9d80: 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  rtRowid);.    sq
9d90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9da0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
9db0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
9dc0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
9dd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9de0: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69  OP_OpenDup, pMWi
9df0: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9e00: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9e10: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
9e20: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
9e30: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
9e40: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
9e50: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
9e60: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
9e70: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
9e80: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9e90: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
9ea0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
9eb0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ED ){.      /* T
9ec0: 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f  he inline versio
9ed0: 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20  ns of min() and 
9ee0: 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20  max() require a 
9ef0: 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c  single ephemeral
9f00: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
9f10: 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e  and 3 registers.
9f20: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
9f30: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
9f40: 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
9f50: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30     **   regApp+0
9f60: 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d  : slot to copy m
9f70: 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d  in()/max() argum
9f80: 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52  ent to for MakeR
9f90: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20  ecord.      **  
9fa0: 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67   regApp+1: integ
9fb0: 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f  er value used to
9fc0: 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65   ensure keys are
9fd0: 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a   unique.      **
9fe0: 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74     regApp+2: out
9ff0: 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72  put of MakeRecor
a000: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  d.      */.     
a010: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a020: 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d   = pWin->pOwner-
a030: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
a040: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
a050: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
a060: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
a070: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c  Parse, pList, 0,
a080: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d   0);.      pWin-
a090: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
a0a0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
a0b0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
a0c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
a0d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
a0e0: 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66  m += 3;.      if
a0f0: 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57  ( pKeyInfo && pW
a100: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
a110: 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  [1]=='i' ){.    
a120: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
a130: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
a140: 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
a150: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
a160: 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20  tOrder[0] = 1;. 
a170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a190: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
a1a0: 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  al, pWin->csrApp
a1b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
a1c0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
a1d0: 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  v, pKeyInfo, P4_
a1e0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
a1f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a200: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
a210: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
a220: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  +1);.    }.    e
a230: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
a240: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20  ==nth_valueName 
a250: 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  || p->zName==fir
a260: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  st_valueName ){.
a270: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
a280: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
a290: 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e  at pWin->regApp.
a2a0: 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75   These will be u
a2b0: 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  sed to.      ** 
a2c0: 73 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20  store the start 
a2d0: 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66  and end index of
a2e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
a2f0: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 57  me.  */.      pW
a300: 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61  in->regApp = pPa
a310: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a320: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
a330: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a340: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a350: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
a360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a370: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
a380: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a390: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
a3a0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
a3b0: 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  if( p->zName==le
a3c0: 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61  adName || p->zNa
a3d0: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20  me==lagName ){. 
a3e0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
a3f0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a400: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
a410: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a420: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d  P_OpenDup, pWin-
a430: 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e  >csrApp, pMWin->
a440: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a  iEphCsr);.    }.
a450: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    }.}..#define W
a460: 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49  INDOW_STARTING_I
a470: 4e 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49  NT  0.#define WI
a480: 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20  NDOW_ENDING_INT 
a490: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e     1.#define WIN
a4a0: 44 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e  DOW_NTH_VALUE_IN
a4b0: 54 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  T 2.#define WIND
a4c0: 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20  OW_STARTING_NUM 
a4d0: 20 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   3.#define WINDO
a4e0: 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20  W_ENDING_NUM    
a4f0: 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  4../*.** A "PREC
a500: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  EDING <expr>" (e
a510: 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c  Cond==0) or "FOL
a520: 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  LOWING <expr>" (
a530: 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65  eCond==1) or the
a540: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
a550: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a560: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20   to nth_value() 
a570: 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a  (eCond==2) has j
a580: 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c  ust been.** eval
a590: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
a5a0: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
a5b0: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
a5c0: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
a5d0: 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f  es VM.** code to
a5e0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
a5f0: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
a600: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
a610: 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a  and throws an.**
a620: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
a630: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
a640: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
a650: 65 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a  eckValue(Parse *
a660: 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c  pParse, int reg,
a670: 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73   int eCond){.  s
a680: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a690: 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20   *azErr[] = {.  
a6a0: 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e    "frame startin
a6b0: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
a6c0: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
a6d0: 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66  integer",.    "f
a6e0: 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73  rame ending offs
a6f0: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
a700: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
a710: 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20  r",.    "second 
a720: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f  argument to nth_
a730: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20  value must be a 
a740: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
a750: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74  ",.    "frame st
a760: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  arting offset mu
a770: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
a780: 74 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20  tive number",.  
a790: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a7a0: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a7b0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75   non-negative nu
a7c0: 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74  mber",.  };.  st
a7d0: 61 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d  atic int aOp[] =
a7e0: 20 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c   { OP_Ge, OP_Ge,
a7f0: 20 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f   OP_Gt, OP_Ge, O
a800: 50 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a  P_Ge };.  Vdbe *
a810: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a820: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a830: 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69  t regZero = sqli
a840: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a850: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
a860: 20 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f   eCond>=0 && eCo
a870: 6e 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45  nd<ArraySize(azE
a880: 72 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  rr) );.  sqlite3
a890: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a8a0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
a8b0: 5a 65 72 6f 29 3b 0a 20 20 69 66 28 20 65 43 6f  Zero);.  if( eCo
a8c0: 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53 54 41 52 54  nd>=WINDOW_START
a8d0: 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 69  ING_NUM ){.    i
a8e0: 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20 73  nt regString = s
a8f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a900: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
a910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a920: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a930: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
a940: 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  "", P4_STATIC);.
a950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a960: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
a970: 72 65 67 53 74 72 69 6e 67 2c 20 73 71 6c 69 74  regString, sqlit
a980: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a990: 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20  r(v)+2, reg);.  
a9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a9b0: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
a9c0: 41 46 46 5f 4e 55 4d 45 52 49 43 7c 53 51 4c 49  AFF_NUMERIC|SQLI
a9d0: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
a9e0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a9f0: 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (v);.    assert(
aa00: 20 65 43 6f 6e 64 3d 3d 33 20 7c 7c 20 65 43 6f   eCond==3 || eCo
aa10: 6e 64 3d 3d 34 20 29 3b 0a 20 20 20 20 56 64 62  nd==4 );.    Vdb
aa20: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
aa30: 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20 20 20 56 64  Cond==3);.    Vd
aa40: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
aa50: 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20 20 7d 65 6c  eCond==4);.  }el
aa60: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
aa70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
aa80: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20  MustBeInt, reg, 
aa90: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
aaa0: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
aab0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
aac0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
aad0: 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64  Cond==0 || eCond
aae0: 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20  ==1 || eCond==2 
aaf0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
ab00: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
ab10: 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
ab20: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
ab30: 3d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  =1);.    VdbeCov
ab40: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
ab50: 3d 3d 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ==2);.  }.  sqli
ab60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ab70: 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67   aOp[eCond], reg
ab80: 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62  Zero, sqlite3Vdb
ab90: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
aba0: 32 2c 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43  2, reg);.  VdbeC
abb0: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
abc0: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b  If(v, eCond==0);
abd0: 20 2f 2a 20 4e 55 4c 4c 20 63 61 73 65 20 63 61   /* NULL case ca
abe0: 70 74 75 72 65 64 20 62 79 20 2a 2f 0a 20 20 56  ptured by */.  V
abf0: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
ac00: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
ac10: 3d 31 29 3b 20 2f 2a 20 20 20 74 68 65 20 4f 50  =1); /*   the OP
ac20: 5f 4d 75 73 74 42 65 49 6e 74 20 2a 2f 0a 20 20  _MustBeInt */.  
ac30: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
ac40: 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64  rNullIf(v, eCond
ac50: 3d 3d 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==2);.  VdbeCove
ac60: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28  rageNeverNullIf(
ac70: 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 20 2f 2a  v, eCond==3); /*
ac80: 20 4e 55 4c 4c 20 63 61 73 65 20 63 61 75 67 68   NULL case caugh
ac90: 74 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 6f  t by */.  VdbeCo
aca0: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
acb0: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 20  f(v, eCond==4); 
acc0: 2f 2a 20 20 20 74 68 65 20 4f 50 5f 47 65 20 2a  /*   the OP_Ge *
acd0: 2f 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62  /.  sqlite3MayAb
ace0: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73  ort(pParse);.  s
acf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ad00: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
ad10: 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62  ITE_ERROR, OE_Ab
ad20: 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ort);.  sqlite3V
ad30: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
ad40: 76 6f 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e  void*)azErr[eCon
ad50: 64 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  d], P4_STATIC);.
ad60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
ad70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
ad80: 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  regZero);.}../*.
ad90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
ada0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
adb0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
adc0: 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20  window-function 
add0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
ade0: 74 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  th the object pa
adf0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
ae00: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
ae10: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
ae20: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
ae30: 41 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20  ArgCount(Window 
ae40: 2a 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69  *pWin){.  ExprLi
ae50: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e  st *pList = pWin
ae60: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
ae70: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69  t;.  return (pLi
ae80: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
ae90: 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r : 0);.}../*.**
aea0: 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64   Generate VM cod
aeb0: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68  e to invoke eith
aec0: 65 72 20 78 53 74 65 70 28 29 20 28 69 66 20 62  er xStep() (if b
aed0: 49 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f 72  Inverse is 0) or
aee0: 20 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69   .** xInverse (i
aef0: 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f  f bInverse is no
af00: 6e 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68  n-zero) for each
af10: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
af20: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
af30: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
af40: 20 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66   at pMWin. Or, f
af50: 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  or built-in wind
af60: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ow functions.** 
af70: 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20  that do not use 
af80: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e  the standard fun
af90: 63 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72  ction API, gener
afa0: 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64  ate the required
afb0: 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f  .** inline VM co
afc0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  de..**.** If arg
afd0: 75 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72 65  ument csr is gre
afe0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
aff0: 61 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72  al to 0, then ar
b000: 67 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a  gument reg is.**
b010: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
b020: 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ter in an array 
b030: 6f 66 20 72 65 67 69 73 74 65 72 73 20 67 75 61  of registers gua
b040: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61  ranteed to be la
b050: 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f  rge.** enough to
b060: 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20   hold the array 
b070: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  of arguments for
b080: 20 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20   each function. 
b090: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
b0a0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72  the arguments ar
b0b0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b0c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
b0d0: 20 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65   of csr into the
b0e0: 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
b0f0: 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e  isters before in
b100: 76 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65  voking OP_AggSte
b110: 70 20 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72  p or OP_AggInver
b120: 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  se.**.** Or, if 
b130: 63 73 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  csr is less than
b140: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
b150: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
b160: 72 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20  rs at reg is.** 
b170: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
b180: 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d  d with all colum
b190: 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ns from the curr
b1a0: 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73  ent row of the s
b1b0: 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
b1c0: 49 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50  If argument regP
b1d0: 61 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a  artSize is non-z
b1e0: 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
b1f0: 61 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  a register conta
b200: 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d  ining the.** num
b210: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
b220: 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 74 69  he current parti
b230: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b240: 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74  void windowAggSt
b250: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
b260: 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  rse, .  Window *
b270: 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20  pMWin,          
b280: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65          /* Linke
b290: 64 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77  d list of window
b2a0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
b2b0: 69 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20 20  int csr,        
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74  /* Read argument
b2e0: 73 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73  s from this curs
b2f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76  or */.  int bInv
b300: 65 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  erse,           
b310: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
b320: 74 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72  to invoke xInver
b330: 73 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53  se instead of xS
b340: 74 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  tep */.  int reg
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b370: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a  y of registers *
b380: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
b390: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
b3a0: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
b3b0: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
b3c0: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
b3d0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
b3e0: 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44  tWin){.    FuncD
b3f0: 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
b400: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 6e 74  ->pFunc;.    int
b410: 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74   regArg;.    int
b420: 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72   nArg = windowAr
b430: 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20  gCount(pWin);.  
b440: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 66 6f    int i;..    fo
b450: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
b460: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
b470: 21 3d 31 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  !=1 || pFunc->zN
b480: 61 6d 65 21 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame!=nth_valueNa
b490: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        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 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
b4c0: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
b4d0: 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20  +i, reg+i);.    
b4e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b500: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
b510: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
b520: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69   pWin->iArgCol+i
b530: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20  , reg+i);.      
b540: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 41  }.    }.    regA
b550: 72 67 20 3d 20 72 65 67 3b 0a 0a 20 20 20 20 69  rg = reg;..    i
b560: 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
b570: 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20  rtRowid==0.     
b580: 26 26 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  && (pFunc->funcF
b590: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
b5a0: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
b5b0: 20 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61 72   && (pWin->eStar
b5c0: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29  t!=TK_UNBOUNDED)
b5d0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
b5e0: 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73  t addrIsNull = s
b5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b600: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
b610: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56 64  egArg);.      Vd
b620: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b630: 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73       if( bInvers
b640: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
b650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b660: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
b670: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
b680: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
b690: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b6a0: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72   OP_SCopy, regAr
b6b0: 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29  g, pWin->regApp)
b6c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b6d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b6e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57  P_MakeRecord, pW
b6f0: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70  in->regApp, 2, p
b700: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
b710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b720: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b730: 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d  IdxInsert, pWin-
b740: 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72  >csrApp, pWin->r
b750: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
b760: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b770: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b780: 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45  Int(v, OP_SeekGE
b790: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
b7a0: 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20  0, regArg, 1);. 
b7b0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
b7c0: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
b7d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b7e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b7f0: 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e  P_Delete, pWin->
b800: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20  csrApp);.       
b810: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b820: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
b830: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b840: 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )-2);.      }.  
b850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b860: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
b870: 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  sNull);.    }els
b880: 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41  e if( pWin->regA
b890: 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pp ){.      asse
b8a0: 72 74 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  rt( pFunc->zName
b8b0: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
b8c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
b8d0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
b8e0: 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  t_valueName.    
b8f0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
b900: 74 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c  t( bInverse==0 |
b910: 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b  | bInverse==1 );
b920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b930: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
b940: 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  ddImm, pWin->reg
b950: 41 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20  App+1-bInverse, 
b960: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  1);.    }else if
b970: 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 21  ( pFunc->xSFunc!
b980: 3d 6e 6f 6f 70 53 74 65 70 46 75 6e 63 20 29 7b  =noopStepFunc ){
b990: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
b9a0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  f = 0;.      if(
b9b0: 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29   pWin->pFilter )
b9c0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b9d0: 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  gTmp;.        as
b9e0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c  sert( nArg==0 ||
b9f0: 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77   nArg==pWin->pOw
ba00: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  ner->x.pList->nE
ba10: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61  xpr );.        a
ba20: 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70  ssert( nArg || p
ba30: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
ba40: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
ba50: 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69     regTmp = sqli
ba60: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ba70: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
ba80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ba90: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
baa0: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
bab0: 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a  l+nArg,regTmp);.
bac0: 20 20 20 20 20 20 20 20 61 64 64 72 49 66 20 3d          addrIf =
bad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bae0: 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
baf0: 72 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20  regTmp, 0, 1);. 
bb00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
bb10: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
bb20: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
bb30: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
bb40: 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gTmp);.      }. 
bb50: 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e       if( pFunc->
bb60: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
bb70: 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
bb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c   ){.        Coll
bb90: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
bba0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
bbb0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  >0 );.        pC
bbc0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
bbd0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
bbe0: 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  e, pWin->pOwner-
bbf0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
bc00: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
bc10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
bc20: 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
bc30: 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68  0,0,0, (const ch
bc40: 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  ar*)pColl, P4_CO
bc50: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
bc60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bc70: 65 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65  eAddOp3(v, bInve
bc80: 72 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72  rse? OP_AggInver
bc90: 73 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c  se : OP_AggStep,
bca0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
bcb0: 20 20 20 20 20 20 20 20 20 20 62 49 6e 76 65 72            bInver
bcc0: 73 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  se, regArg, pWin
bcd0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
bce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
bcf0: 70 65 6e 64 50 34 28 76 2c 20 70 46 75 6e 63 2c  pendP4(v, pFunc,
bd00: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
bd10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
bd20: 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
bd30: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
bd40: 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33  addrIf ) sqlite3
bd50: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bd60: 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20  addrIf);.    }. 
bd70: 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74   }.}..typedef st
bd80: 72 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41  ruct WindowCodeA
bd90: 72 67 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  rg WindowCodeArg
bda0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
bdb0: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
bdc0: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
bdd0: 3b 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43  ;.struct WindowC
bde0: 73 72 41 6e 64 52 65 67 20 7b 0a 20 20 69 6e 74  srAndReg {.  int
bdf0: 20 63 73 72 3b 0a 20 20 69 6e 74 20 72 65 67 3b   csr;.  int reg;
be00: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 57 69 6e 64  .};..struct Wind
be10: 6f 77 43 6f 64 65 41 72 67 20 7b 0a 20 20 50 61  owCodeArg {.  Pa
be20: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 57  rse *pParse;.  W
be30: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 3b 0a 20 20  indow *pMWin;.  
be40: 56 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20 69  Vdbe *pVdbe;.  i
be50: 6e 74 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 69  nt regGosub;.  i
be60: 6e 74 20 61 64 64 72 47 6f 73 75 62 3b 0a 20 20  nt addrGosub;.  
be70: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e  int regArg;.  in
be80: 74 20 65 44 65 6c 65 74 65 3b 0a 0a 20 20 57 69  t eDelete;..  Wi
be90: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 73 74  ndowCsrAndReg st
bea0: 61 72 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72  art;.  WindowCsr
beb0: 41 6e 64 52 65 67 20 63 75 72 72 65 6e 74 3b 0a  AndReg current;.
bec0: 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65    WindowCsrAndRe
bed0: 67 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  g end;.};../*.**
bee0: 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79   Values that may
bef0: 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68   be passed as th
bf00: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
bf10: 74 20 74 6f 20 77 69 6e 64 6f 77 43 6f 64 65 4f  t to windowCodeO
bf20: 70 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  p()..*/.#define 
bf30: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
bf40: 57 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  W 1.#define WIND
bf50: 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32 0a  OW_AGGINVERSE 2.
bf60: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
bf70: 47 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a 0a  GGSTEP    3../*.
bf80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63  ** Generate VM c
bf90: 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20  ode to read the 
bfa0: 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 70 65  window frames pe
bfb0: 65 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 63  er values from c
bfc0: 75 72 73 6f 72 20 63 73 72 20 69 6e 74 6f 0a 2a  ursor csr into.*
bfd0: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  * an array of re
bfe0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
bff0: 20 61 74 20 72 65 67 2e 0a 2a 2f 0a 73 74 61 74   at reg..*/.stat
c000: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
c010: 61 64 50 65 65 72 56 61 6c 75 65 73 28 0a 20 20  adPeerValues(.  
c020: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
c030: 2c 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20 69  ,.  int csr,.  i
c040: 6e 74 20 72 65 67 0a 29 7b 0a 20 20 57 69 6e 64  nt reg.){.  Wind
c050: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
c060: 4d 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  MWin;.  ExprList
c070: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
c080: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
c090: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
c0a0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
c0b0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 2d 3e  lite3GetVdbe(p->
c0c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 45 78 70  pParse);.    Exp
c0d0: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
c0e0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
c0f0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 4f 66  ;.    int iColOf
c100: 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  f = pMWin->nBuff
c110: 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f  erCol + (pPart ?
c120: 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
c130: 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  0);.    int i;. 
c140: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
c150: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
c160: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
c170: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c180: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
c190: 69 43 6f 6c 4f 66 66 2b 69 2c 20 72 65 67 2b 69  iColOff+i, reg+i
c1a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
c1b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
c1c0: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
c1d0: 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29   either xValue()
c1e0: 20 28 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78 46   (bFin==0) or xF
c1f0: 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46  inalize().** (bF
c200: 69 6e 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20  in==1) for each 
c210: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
c220: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
c230: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a  st starting at.*
c240: 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72  * pMWin. Or, for
c250: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
c260: 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20  -functions that 
c270: 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73  do not use the s
c280: 74 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20  tandard.** API, 
c290: 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 71 75  generate the equ
c2a0: 69 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e  ivalent VM code.
c2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c2c0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 57  windowAggFinal(W
c2d0: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c  indowCodeArg *p,
c2e0: 20 69 6e 74 20 62 46 69 6e 29 7b 0a 20 20 50 61   int bFin){.  Pa
c2f0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
c300: 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f  >pParse;.  Windo
c310: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
c320: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
c330: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c340: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
c350: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28  w *pWin;..  for(
c360: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
c370: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
c380: 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20  xtWin){.    if( 
c390: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
c3a0: 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20 26 26 20  owid==0.     && 
c3b0: 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75  (pWin->pFunc->fu
c3c0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
c3d0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
c3e0: 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53      && (pWin->eS
c3f0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
c400: 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED).    ){.     
c410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c420: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
c430: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
c440: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c450: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c460: 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73  P_Last, pWin->cs
c470: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rApp);.      Vdb
c480: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c4a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
c4b0: 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  mn, pWin->csrApp
c4c0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
c4d0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
c4e0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c4f0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
c500: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
c510: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c520: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
c530: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c540: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
c550: 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  id==0 );.    }el
c560: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41  se{.      int nA
c570: 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f  rg = windowArgCo
c580: 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 20  unt(pWin);.     
c590: 20 69 66 28 20 62 46 69 6e 20 29 7b 0a 20 20 20   if( bFin ){.   
c5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
c5c0: 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  Final, pWin->reg
c5d0: 41 63 63 75 6d 2c 20 6e 41 72 67 29 3b 0a 20 20  Accum, nArg);.  
c5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5f0: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69  eAppendP4(v, pWi
c600: 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  n->pFunc, P4_FUN
c610: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
c620: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c630: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69  (v, OP_Copy, pWi
c640: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69  n->regAccum, pWi
c650: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
c660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
c680: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
c690: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d  gAccum);.      }
c6a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
c6b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c6c0: 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c 70  v, OP_AggValue,p
c6d0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 6e 41  Win->regAccum,nA
c6e0: 72 67 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  rg,pWin->regResu
c6f0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
c700: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
c710: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
c720: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
c730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c740: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c750: 65 20 63 6f 64 65 20 74 6f 20 63 61 6c 63 75 6c  e code to calcul
c760: 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
c770: 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 77 69  values of all wi
c780: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69  ndow functions i
c790: 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e 70 4d 57 69  n the.** p->pMWi
c7a0: 6e 20 6c 69 73 74 20 62 79 20 64 6f 69 6e 67 20  n list by doing 
c7b0: 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 74  a full scan of t
c7c0: 68 65 20 63 75 72 72 65 6e 74 20 77 69 6e 64 6f  he current windo
c7d0: 77 20 66 72 61 6d 65 2e 20 53 74 6f 72 65 20 74  w frame. Store t
c7e0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
c7f0: 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52   the Window.regR
c800: 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2c  esult registers,
c810: 20 72 65 61 64 79 20 74 6f 20 72 65 74 75 72 6e   ready to return
c820: 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 6c 61   the upper.** la
c830: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  yer..*/.static v
c840: 6f 69 64 20 77 69 6e 64 6f 77 46 75 6c 6c 53 63  oid windowFullSc
c850: 61 6e 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  an(WindowCodeArg
c860: 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a   *p){.  Window *
c870: 70 57 69 6e 3b 0a 20 20 50 61 72 73 65 20 2a 70  pWin;.  Parse *p
c880: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
c890: 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e;.  Window *pMW
c8a0: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
c8b0: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56   Vdbe *v = p->pV
c8c0: 64 62 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67 43  dbe;..  int regC
c8d0: 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
c8e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
c8f0: 6e 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a  nt rowid value *
c900: 2f 0a 20 20 69 6e 74 20 72 65 67 43 50 65 65 72  /.  int regCPeer
c910: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c920: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70      /* Current p
c930: 65 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  eer values */.  
c940: 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30  int regRowid = 0
c950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c960: 2f 2a 20 41 67 67 53 74 65 70 20 72 6f 77 69 64  /* AggStep rowid
c970: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
c980: 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20  regPeer = 0;    
c990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c9a0: 67 67 53 74 65 70 20 70 65 65 72 20 76 61 6c 75  ggStep peer valu
c9b0: 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 65  es */..  int nPe
c9c0: 65 72 3b 0a 20 20 69 6e 74 20 6c 62 6c 4e 65 78  er;.  int lblNex
c9d0: 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 42 72 6b 3b  t;.  int lblBrk;
c9e0: 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b  .  int addrNext;
c9f0: 0a 20 20 69 6e 74 20 63 73 72 20 3d 20 70 4d 57  .  int csr = pMW
ca00: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 0a 20 20 6e  in->csrApp;..  n
ca10: 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 70  Peer = (pMWin->p
ca20: 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d  OrderBy ? pMWin-
ca30: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
ca40: 20 3a 20 30 29 3b 0a 0a 20 20 6c 62 6c 4e 65 78   : 0);..  lblNex
ca50: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
ca60: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
ca70: 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d 20 73 71 6c  ;.  lblBrk = sql
ca80: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ca90: 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  l(pParse);..  re
caa0: 67 43 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  gCRowid = sqlite
cab0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
cac0: 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  se);.  regRowid 
cad0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cae0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
caf0: 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20  f( nPeer ){.    
cb00: 72 65 67 43 50 65 65 72 20 3d 20 73 71 6c 69 74  regCPeer = sqlit
cb10: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
cb20: 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20  Parse, nPeer);. 
cb30: 20 20 20 72 65 67 50 65 65 72 20 3d 20 73 71 6c     regPeer = sql
cb40: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
cb50: 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b  (pParse, nPeer);
cb60: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
cb70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cb80: 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45  Rowid, pMWin->iE
cb90: 70 68 43 73 72 2c 20 72 65 67 43 52 6f 77 69 64  phCsr, regCRowid
cba0: 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50  );.  windowReadP
cbb0: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 70 4d 57  eerValues(p, pMW
cbc0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67  in->iEphCsr, reg
cbd0: 43 50 65 65 72 29 3b 0a 0a 20 20 66 6f 72 28 70  CPeer);..  for(p
cbe0: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
cbf0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
cc00: 74 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69 74  tWin){.    sqlit
cc10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cc20: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
cc30: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 7d  ->regAccum);.  }
cc40: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
cc50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
cc60: 47 45 2c 20 63 73 72 2c 20 6c 62 6c 42 72 6b 2c  GE, csr, lblBrk,
cc70: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
cc80: 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43 6f  Rowid);.  VdbeCo
cc90: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64  verage(v);.  add
cca0: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
ccb0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ccc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ccd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
cce0: 69 64 2c 20 63 73 72 2c 20 72 65 67 52 6f 77 69  id, csr, regRowi
ccf0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
cd00: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74  eAddOp3(v, OP_Gt
cd10: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
cd20: 6f 77 69 64 2c 20 6c 62 6c 42 72 6b 2c 20 72 65  owid, lblBrk, re
cd30: 67 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43  gRowid);.  VdbeC
cd40: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
cd50: 28 76 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69  (v);..  if( pMWi
cd60: 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
cd70: 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 73  CURRENT ){.    s
cd80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cd90: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43 52  (v, OP_Eq, regCR
cda0: 6f 77 69 64 2c 20 6c 62 6c 4e 65 78 74 2c 20 72  owid, lblNext, r
cdb0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 56 64  egRowid);.    Vd
cdc0: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
cdd0: 75 6c 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20  ull(v);.  }else 
cde0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c  if( pMWin->eExcl
cdf0: 75 64 65 21 3d 54 4b 5f 4e 4f 20 29 7b 0a 20 20  ude!=TK_NO ){.  
ce00: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
ce10: 69 6e 74 20 61 64 64 72 45 71 20 3d 20 30 3b 0a  int addrEq = 0;.
ce20: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
ce30: 79 49 6e 66 6f 20 3d 20 30 3b 0a 0a 20 20 20 20  yInfo = 0;..    
ce40: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  if( pMWin->pOrde
ce50: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  rBy ){.      pKe
ce60: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
ce70: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
ce80: 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  st(pParse, pMWin
ce90: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30  ->pOrderBy, 0, 0
cea0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ceb0: 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
cec0: 3d 3d 54 4b 5f 54 49 45 53 20 29 7b 0a 20 20 20  ==TK_TIES ){.   
ced0: 20 20 20 61 64 64 72 45 71 20 3d 20 73 71 6c 69     addrEq = sqli
cee0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cef0: 20 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69   OP_Eq, regCRowi
cf00: 64 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  d, 0, regRowid);
cf10: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
cf20: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b  ageNeverNull(v);
cf30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
cf40: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
cf50: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
cf60: 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65  alues(p, csr, re
cf70: 67 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  gPeer);.      sq
cf80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cf90: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
cfa0: 65 67 50 65 65 72 2c 20 72 65 67 43 50 65 65 72  egPeer, regCPeer
cfb0: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20  , nPeer);.      
cfc0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
cfd0: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
cfe0: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
cff0: 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  FO);.      addr 
d000: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d010: 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
d020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d030: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
d040: 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e 65 78 74  p, addr, lblNext
d050: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 56  , addr);.      V
d060: 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28  dbeCoverageEqNe(
d070: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
d080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d090: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
d0a0: 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a  o, 0, lblNext);.
d0b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 64      }.    if( ad
d0c0: 64 72 45 71 20 29 20 73 71 6c 69 74 65 33 56 64  drEq ) sqlite3Vd
d0d0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d0e0: 64 72 45 71 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  drEq);.  }..  wi
d0f0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
d100: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20  se, pMWin, csr, 
d110: 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 0a  0, p->regArg);..
d120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d130: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
d140: 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Next);.  sqlite3
d150: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d160: 5f 4e 65 78 74 2c 20 63 73 72 2c 20 61 64 64 72  _Next, csr, addr
d170: 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43 6f 76  Next);.  VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
d190: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d1a0: 76 2c 20 61 64 64 72 4e 65 78 74 2d 31 29 3b 0a  v, addrNext-1);.
d1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d1c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78  pHere(v, addrNex
d1d0: 74 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  t+1);.  sqlite3R
d1e0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d1f0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
d200: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
d210: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
d220: 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20 20 69   regCRowid);.  i
d230: 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20  f( nPeer ){.    
d240: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d250: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d260: 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b  regPeer, nPeer);
d270: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d280: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d290: 72 73 65 2c 20 72 65 67 43 50 65 65 72 2c 20 6e  rse, regCPeer, n
d2a0: 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  Peer);.  }..  wi
d2b0: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c 20  ndowAggFinal(p, 
d2c0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  1);.}../*.** Inv
d2d0: 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74  oke the sub-rout
d2e0: 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75 62 20  ine at regGosub 
d2f0: 28 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f  (generated by co
d300: 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20  de in select.c) 
d310: 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  to.** return the
d320: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
d330: 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20  Window.iEphCsr. 
d340: 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75  If all window fu
d350: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61  nctions are.** a
d360: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
d370: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
d380: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
d390: 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  API, a single.**
d3a0: 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75   OP_Gosub instru
d3b0: 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61  ction is all tha
d3c0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  t this routine g
d3d0: 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72 61 20  enerates. Extra 
d3e0: 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70  VM code.** for p
d3f0: 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e  er-row processin
d400: 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61  g is only genera
d410: 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  ted for the foll
d420: 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77  owing built-in w
d430: 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f  indow.** functio
d440: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f  ns:.**.**   nth_
d450: 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72  value().**   fir
d460: 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20  st_value().**   
d470: 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28  lag().**   lead(
d480: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
d490: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
d4a0: 52 6f 77 28 57 69 6e 64 6f 77 43 6f 64 65 41 72  Row(WindowCodeAr
d4b0: 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  g *p){.  Window 
d4c0: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
d4d0: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  n;.  Vdbe *v = p
d4e0: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66 28 20  ->pVdbe;..  if( 
d4f0: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
d500: 6f 77 69 64 20 29 7b 0a 20 20 20 20 77 69 6e 64  owid ){.    wind
d510: 6f 77 46 75 6c 6c 53 63 61 6e 28 70 29 3b 0a 20  owFullScan(p);. 
d520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 72 73   }else{.    Pars
d530: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
d540: 50 61 72 73 65 3b 0a 20 20 20 20 57 69 6e 64 6f  Parse;.    Windo
d550: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 20 20 66 6f  w *pWin;..    fo
d560: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
d570: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
d580: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
d590: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
d5a0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
d5b0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
d5c0: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
d5d0: 61 6d 65 0a 20 20 20 20 20 20 20 7c 7c 20 70 46  ame.       || pF
d5e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
d5f0: 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  t_valueName.    
d600: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
d610: 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72   csr = pWin->csr
d620: 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  App;.        int
d630: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
d640: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
d650: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  se);.        int
d660: 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65   tmpReg = sqlite
d670: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
d680: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
d690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d6a0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
d6b0: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
d6c0: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
d6d0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
d6e0: 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20  _valueName ){.  
d6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d700: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d710: 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e 2d 3e 69 45  Column,pMWin->iE
d720: 70 68 43 73 72 2c 70 57 69 6e 2d 3e 69 41 72 67  phCsr,pWin->iArg
d730: 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20  Col+1,tmpReg);. 
d740: 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43           windowC
d750: 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65  heckValue(pParse
d760: 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b 0a 20 20  , tmpReg, 2);.  
d770: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d780: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d790: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d7a0: 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65  nteger, 1, tmpRe
d7b0: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
d7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
d7e0: 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d  d, tmpReg, pWin-
d7f0: 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29  >regApp, tmpReg)
d800: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d810: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d820: 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41  P_Gt, pWin->regA
d830: 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65  pp+1, lbl, tmpRe
d840: 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
d850: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
d860: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
d870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d880: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
d890: 20 63 73 72 2c 20 30 2c 20 74 6d 70 52 65 67 29   csr, 0, tmpReg)
d8a0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
d8b0: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
d8c0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
d8d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d8e0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
d8f0: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c  , pWin->iArgCol,
d900: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
d910: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d920: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d930: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
d940: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
d950: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
d960: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
d970: 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
d980: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
d990: 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  leadName || pFun
d9a0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
d9b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
d9c0: 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f   nArg = pWin->pO
d9d0: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
d9e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
d9f0: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
da00: 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  rApp;.        in
da10: 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56  t lbl = sqlite3V
da20: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
da30: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
da40: 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74  t tmpReg = sqlit
da50: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
da60: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
da70: 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e  t iEph = pMWin->
da80: 69 45 70 68 43 73 72 3b 0a 20 20 0a 20 20 20 20  iEphCsr;.  .    
da90: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29      if( nArg<3 )
daa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
dab0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
dac0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
dad0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
dae0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
daf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
db00: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
db10: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 70 57 69  Column, iEph,pWi
db20: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 70 57 69  n->iArgCol+2,pWi
db30: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
db40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
db50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db60: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
db70: 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20  iEph, tmpReg);. 
db80: 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
db90: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  2 ){.          i
dba0: 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d  nt val = (pFunc-
dbb0: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
dbc0: 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20   ? 1 : -1);.    
dbd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dbe0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
dbf0: 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61  dImm, tmpReg, va
dc00: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  l);.        }els
dc10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
dc20: 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e   op = (pFunc->zN
dc30: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20  ame==leadName ? 
dc40: 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62 74  OP_Add : OP_Subt
dc50: 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ract);.         
dc60: 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d 20 73   int tmpReg2 = s
dc70: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
dc80: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
dc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dca0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
dcb0: 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e  mn, iEph, pWin->
dcc0: 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65  iArgCol+1, tmpRe
dcd0: 67 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  g2);.          s
dce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
dcf0: 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c  (v, op, tmpReg2,
dd00: 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29   tmpReg, tmpReg)
dd10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dd20: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
dd30: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
dd40: 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
dd50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dd60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dd70: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c  _SeekRowid, csr,
dd80: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
dd90: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
dda0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
ddb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ddc0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
ddd0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
dde0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
ddf0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ult);.        sq
de00: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
de10: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
de20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
de30: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
de40: 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  rse, tmpReg);.  
de50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
de60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de70: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
de80: 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20 70 2d   p->regGosub, p-
de90: 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a  >addrGosub);.}..
dea0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
deb0: 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65 20 61  ode to set the a
dec0: 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
ded0: 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ter for each win
dee0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  dow function.** 
def0: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
df00: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
df10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
df20: 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65   to NULL. And pe
df30: 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75  rform.** any equ
df40: 69 76 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69  ivalent initiali
df50: 7a 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  zation required 
df60: 62 79 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20  by any built-in 
df70: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
df80: 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  .** in the list.
df90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
dfa0: 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50  indowInitAccum(P
dfb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
dfc0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20  ndow *pMWin){.  
dfd0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
dfe0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
dff0: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ;.  int regArg;.
e000: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
e010: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
e020: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
e030: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
e040: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
e050: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
e060: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
e070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e080: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
e090: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  , 0, pWin->regAc
e0a0: 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d  cum);.    nArg =
e0b0: 20 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f   MAX(nArg, windo
e0c0: 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29  wArgCount(pWin))
e0d0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
e0e0: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d  >regStartRowid==
e0f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
e100: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
e110: 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 46  _valueName || pF
e120: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
e130: 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20  t_valueName ){. 
e140: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e150: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e160: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
e170: 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20  >regApp);.      
e180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e190: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e1a0: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
e1b0: 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  pp+1);.      }..
e1c0: 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
e1d0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e1e0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
e1f0: 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70  ) && pWin->csrAp
e200: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  p ){.        ass
e210: 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72  ert( pWin->eStar
e220: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
e230: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e240: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e250: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
e260: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
e270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e280: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e290: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
e2a0: 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20  >regApp+1);.    
e2b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e2c0: 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d  regArg = pParse-
e2d0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
e2e0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b  e->nMem += nArg;
e2f0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72 67  .  return regArg
e300: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  ;.}../* .** Retu
e310: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
e320: 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73 68 6f  urrent frame sho
e330: 75 6c 64 20 62 65 20 63 61 63 68 65 64 20 69 6e  uld be cached in
e340: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
e350: 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20 69 66  able,.** even if
e360: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 78 49   there are no xI
e370: 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73 20 72  nverse() calls r
e380: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
e390: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 61 63  ic int windowCac
e3a0: 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77 20 2a  heFrame(Window *
e3b0: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
e3c0: 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28 20 70 4d   *pWin;.  if( pM
e3d0: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
e3e0: 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  id ) return 1;. 
e3f0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
e400: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
e410: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
e420: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
e430: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
e440: 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 7a     if( (pFunc->z
e450: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
e460: 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46  ame).     || (pF
e470: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
e480: 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20  t_valueName).   
e490: 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61    || (pFunc->zNa
e4a0: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20 20  me==leadName).  
e4b0: 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
e4c0: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20  ame==lagName).  
e4d0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
e4e0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
e4f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e500: 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20 72  .** regOld and r
e510: 65 67 4e 65 77 20 61 72 65 20 65 61 63 68 20 74  egNew are each t
e520: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
e530: 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
e540: 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65 72 42   size.** pOrderB
e550: 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73 20 66  y->nExpr. This f
e560: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
e570: 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 61 72  s code to compar
e580: 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61 72 72  e the two.** arr
e590: 61 79 73 20 6f 66 20 72 65 67 69 73 74 65 72 73  ays of registers
e5a0: 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
e5b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61  tion sequences a
e5c0: 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61 72 69  nd other compari
e5d0: 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  son.** parameter
e5e0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  s specified by p
e5f0: 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a 2a 20  OrderBy. .**.** 
e600: 49 66 20 74 68 65 20 74 77 6f 20 61 72 72 61 79  If the two array
e610: 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2c  s are not equal,
e620: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
e630: 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70 69 65   regNew is copie
e640: 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c 64 20  d to .** regOld 
e650: 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c  and control fall
e660: 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68 65 72  s through. Other
e670: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  wise, if the con
e680: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72  tents of the arr
e690: 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75 61 6c  ays.** are equal
e6a0: 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69 73 20  , an OP_Goto is 
e6b0: 65 78 65 63 75 74 65 64 2e 20 54 68 65 20 61 64  executed. The ad
e6c0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
e6d0: 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Goto is returned
e6e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e6f0: 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72   windowIfNewPeer
e700: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e710: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
e720: 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 72  OrderBy,.  int r
e730: 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20  egNew,          
e740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e750: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
e760: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
e770: 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20 20 20  int regOld,     
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
e7a0: 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65 73 20  y of old values 
e7b0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 20 20 20  */.  int addr   
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
e7e0: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
e7f0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e800: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
e810: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
e820: 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f 72    int nVal = pOr
e830: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
e840: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
e850: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
e860: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
e870: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
e880: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  y, 0, 0);.    sq
e890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
e8a0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
e8b0: 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20 6e  egOld, regNew, n
e8c0: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
e8d0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
e8e0: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
e8f0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
e900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e910: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
e920: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56   .      sqlite3V
e930: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e940: 29 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c 69 74  )+1, addr, sqlit
e950: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e960: 72 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a 20 20  r(v)+1.    );.  
e970: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71    VdbeCoverageEq
e980: 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ne(v);.    sqlit
e990: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e9a0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 2c  OP_Copy, regNew,
e9b0: 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d 31 29   regOld, nVal-1)
e9c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e9e0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
e9f0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
ea00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ea10: 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
ea20: 61 72 74 20 6f 66 20 67 65 6e 65 72 61 74 69 6e  art of generatin
ea30: 67 20 56 4d 20 70 72 6f 67 72 61 6d 73 20 66 6f  g VM programs fo
ea40: 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66 66 73 65  r RANGE.** offse
ea50: 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c  t PRECEDING/FOLL
ea60: 4f 57 49 4e 47 20 66 72 61 6d 65 20 62 6f 75 6e  OWING frame boun
ea70: 64 61 72 69 65 73 2e 20 41 73 73 75 6d 69 6e 67  daries. Assuming
ea80: 20 22 41 53 43 22 20 6f 72 64 65 72 20 66 6f 72   "ASC" order for
ea90: 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59  .** the ORDER BY
eaa0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 77 69 6e   term in the win
eab0: 64 6f 77 2c 20 69 74 20 67 65 6e 65 72 61 74 65  dow, it generate
eac0: 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e  s code equivalen
ead0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  t to:.**.**   if
eae0: 28 20 63 73 72 31 2e 70 65 65 72 56 61 6c 20 2b  ( csr1.peerVal +
eaf0: 20 72 65 67 56 61 6c 20 3e 3d 20 63 73 72 32 2e   regVal >= csr2.
eb00: 70 65 65 72 56 61 6c 20 29 20 67 6f 74 6f 20 6c  peerVal ) goto l
eb10: 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70 65 63  bl;.**.** A spec
eb20: 69 61 6c 20 74 79 70 65 20 6f 66 20 61 72 69 74  ial type of arit
eb30: 68 6d 65 74 69 63 20 69 73 20 75 73 65 64 20 73  hmetic is used s
eb40: 75 63 68 20 74 68 61 74 20 69 66 20 63 73 72 2e  uch that if csr.
eb50: 70 65 65 72 56 61 6c 20 69 73 20 6e 6f 74 0a 2a  peerVal is not.*
eb60: 2a 20 61 20 6e 75 6d 65 72 69 63 20 74 79 70 65  * a numeric type
eb70: 20 28 72 65 61 6c 20 6f 72 20 69 6e 74 65 67 65   (real or intege
eb80: 72 29 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  r), then the res
eb90: 75 6c 74 20 6f 66 20 74 68 65 20 61 64 64 69 74  ult of the addit
eba0: 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 63 6f 70 79  ion is.** a copy
ebb0: 20 6f 66 20 63 73 72 31 2e 70 65 65 72 56 61 6c   of csr1.peerVal
ebc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ebd0: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
ebe0: 54 65 73 74 28 0a 20 20 57 69 6e 64 6f 77 43 6f  Test(.  WindowCo
ebf0: 64 65 41 72 67 20 2a 70 2c 20 0a 20 20 69 6e 74  deArg *p, .  int
ec00: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec20: 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47 74 20   OP_Ge or OP_Gt 
ec30: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c 20 0a  */.  int csr1, .
ec40: 20 20 69 6e 74 20 72 65 67 56 61 6c 2c 20 0a 20    int regVal, . 
ec50: 20 69 6e 74 20 63 73 72 32 2c 0a 20 20 69 6e 74   int csr2,.  int
ec60: 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73 65 20   lbl.){.  Parse 
ec70: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
ec80: 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
ec90: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
eca0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
ecb0: 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg1 = sqlite3Get
ecc0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ecd0: 0a 20 20 69 6e 74 20 72 65 67 32 20 3d 20 73 71  .  int reg2 = sq
ece0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
ecf0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61  pParse);.  int a
ed00: 72 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b 0a 20  rith = OP_Add;. 
ed10: 20 69 6e 74 20 61 64 64 72 47 65 3b 0a 0a 20 20   int addrGe;..  
ed20: 69 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20  int regString = 
ed30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
ed40: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f  .  assert( op==O
ed50: 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  P_Ge || op==OP_G
ed60: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  t || op==OP_Le )
ed70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
ed80: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26  MWin->pOrderBy &
ed90: 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64  & p->pMWin->pOrd
eda0: 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
edb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d 57 69 6e  ;.  if( p->pMWin
edc0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  ->pOrderBy->a[0]
edd0: 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  .sortOrder ){.  
ede0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
edf0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65        case OP_Ge
ee00: 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 62 72  : op = OP_Le; br
ee10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ee20: 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c  OP_Gt: op = OP_L
ee30: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  t; break;.      
ee40: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
ee50: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70   op==OP_Le ); op
ee60: 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65 61 6b 3b   = OP_Ge; break;
ee70: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 69 74 68  .    }.    arith
ee80: 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 0a   = OP_Subtract;.
ee90: 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 52 65 61    }..  windowRea
eea0: 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63  dPeerValues(p, c
eeb0: 73 72 31 2c 20 72 65 67 31 29 3b 0a 20 20 77 69  sr1, reg1);.  wi
eec0: 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75  ndowReadPeerValu
eed0: 65 73 28 70 2c 20 63 73 72 32 2c 20 72 65 67 32  es(p, csr2, reg2
eee0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
eef0: 66 20 74 68 65 20 70 65 65 72 20 76 61 6c 75 65  f the peer value
ef00: 20 66 6f 72 20 63 73 72 31 20 76 61 6c 75 65 20   for csr1 value 
ef10: 69 73 20 61 20 74 65 78 74 20 6f 72 20 62 6c 6f  is a text or blo
ef20: 62 20 62 79 20 63 6f 6d 70 61 72 69 6e 67 0a 20  b by comparing. 
ef30: 20 2a 2a 20 69 74 20 74 6f 20 74 68 65 20 73 6d   ** it to the sm
ef40: 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
ef50: 73 74 72 69 6e 67 20 2d 20 27 27 2e 20 49 66 20  string - ''. If 
ef60: 69 74 20 69 73 2c 20 6a 75 6d 70 20 6f 76 65 72  it is, jump over
ef70: 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 41 64 64   the.  ** OP_Add
ef80: 20 6f 72 20 4f 50 5f 53 75 62 74 72 61 63 74 20   or OP_Subtract 
ef90: 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 70 72  operation and pr
efa0: 6f 63 65 65 64 20 64 69 72 65 63 74 6c 79 20 74  oceed directly t
efb0: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
efc0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  . */.  sqlite3Vd
efd0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
efe0: 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 53 74  tring8, 0, regSt
eff0: 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20 50 34 5f  ring, 0, "", P4_
f000: 53 54 41 54 49 43 29 3b 0a 20 20 61 64 64 72 47  STATIC);.  addrG
f010: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
f020: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
f030: 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20 72 65  regString, 0, re
f040: 67 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  g1);.  VdbeCover
f050: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
f060: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
f070: 72 69 74 68 2c 20 72 65 67 56 61 6c 2c 20 72 65  rith, regVal, re
f080: 67 31 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c  g1, reg1);.  sql
f090: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f0a0: 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20 20 73  (v, addrGe);.  s
f0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f0c0: 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c 20 6c 62  (v, op, reg2, lb
f0d0: 6c 2c 20 72 65 67 31 29 3b 20 56 64 62 65 43 6f  l, reg1); VdbeCo
f0e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
f0f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
f100: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
f110: 51 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  Q);.  assert( op
f120: 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f  ==OP_Ge || op==O
f130: 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  P_Gt || op==OP_L
f140: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  t || op==OP_Le )
f150: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d  ;.  testcase(op=
f160: 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
f170: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
f180: 50 5f 47 65 29 3b 0a 20 20 74 65 73 74 63 61 73  P_Ge);.  testcas
f190: 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
f1a0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
f1b0: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 74 65  op==OP_Lt);.  te
f1c0: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
f1d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
f1e0: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  f(v, op==OP_Le);
f1f0: 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  .  testcase(op==
f200: 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
f210: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
f220: 5f 47 74 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  _Gt);..  sqlite3
f230: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f240: 50 61 72 73 65 2c 20 72 65 67 31 29 3b 0a 20 20  Parse, reg1);.  
f250: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f260: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
f270: 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  g2);.}../*.** He
f280: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
f290: 72 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  r sqlite3WindowC
f2a0: 6f 64 65 53 74 65 70 28 29 2e 20 45 61 63 68 20  odeStep(). Each 
f2b0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
f2c0: 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e 65 72 61 74  ction.** generat
f2d0: 65 73 20 56 4d 20 63 6f 64 65 20 66 6f 72 20 61  es VM code for a
f2e0: 20 73 69 6e 67 6c 65 20 52 45 54 55 52 4e 5f 52   single RETURN_R
f2f0: 4f 57 2c 20 41 47 47 53 54 45 50 20 6f 72 20 41  OW, AGGSTEP or A
f300: 47 47 49 4e 56 45 52 53 45 20 0a 2a 2a 20 6f 70  GGINVERSE .** op
f310: 65 72 61 74 69 6f 6e 2e 20 52 65 66 65 72 20 74  eration. Refer t
f320: 6f 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  o the header com
f330: 6d 65 6e 74 20 66 6f 72 20 73 71 6c 69 74 65 33  ment for sqlite3
f340: 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29  WindowCodeStep()
f350: 20 66 6f 72 0a 2a 2a 20 64 65 74 61 69 6c 73 2e   for.** details.
f360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f370: 69 6e 64 6f 77 43 6f 64 65 4f 70 28 0a 20 57 69  indowCodeOp(. Wi
f380: 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20  ndowCodeArg *p, 
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3a0: 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
f3b0: 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c 20 20 20 20   */. int op,    
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 20 20 20 20 20 2f 2a 20 57 49 4e 44 4f 57 5f        /* WINDOW_
f3e0: 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53  RETURN_ROW, AGGS
f3f0: 54 45 50 20 6f 72 20 41 47 47 49 4e 56 45 52 53  TEP or AGGINVERS
f400: 45 20 2a 2f 0a 20 69 6e 74 20 72 65 67 43 6f 75  E */. int regCou
f410: 6e 74 64 6f 77 6e 2c 20 20 20 20 20 20 20 20 20  ntdown,         
f420: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f430: 65 72 20 66 6f 72 20 4f 50 5f 49 66 50 6f 73 20  er for OP_IfPos 
f440: 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f 0a 20 69 6e  countdown */. in
f450: 74 20 6a 75 6d 70 4f 6e 45 6f 66 20 20 20 20 20  t jumpOnEof     
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f470: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 73  * Jump here if s
f480: 74 65 70 70 65 64 20 63 75 72 73 6f 72 20 72 65  tepped cursor re
f490: 61 63 68 65 73 20 45 4f 46 20 2a 2f 0a 29 7b 0a  aches EOF */.){.
f4a0: 20 20 69 6e 74 20 63 73 72 2c 20 72 65 67 3b 0a    int csr, reg;.
f4b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
f4c0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  = p->pParse;.  W
f4d0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
f4e0: 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e 74 20 72  ->pMWin;.  int r
f4f0: 65 74 20 3d 20 30 3b 0a 20 20 56 64 62 65 20 2a  et = 0;.  Vdbe *
f500: 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 20 20  v = p->pVdbe;.  
f510: 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b 20  int addrIf = 0; 
f520: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
f530: 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  nue = 0;.  int a
f540: 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 69  ddrGoto = 0;.  i
f550: 6e 74 20 62 50 65 65 72 20 3d 20 28 70 4d 57 69  nt bPeer = (pMWi
f560: 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f  n->eFrmType!=TK_
f570: 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74 20 6c 62  ROWS);..  int lb
f580: 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  lDone = sqlite3V
f590: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
f5a0: 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  rse);.  int addr
f5b0: 4e 65 78 74 52 61 6e 67 65 20 3d 20 30 3b 0a 0a  NextRange = 0;..
f5c0: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
f5d0: 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  e - WINDOW_AGGIN
f5e0: 56 45 52 53 45 20 69 73 20 61 6c 77 61 79 73 20  VERSE is always 
f5f0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 66  a no-op if the f
f600: 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61 72 74 73  rame.  ** starts
f610: 20 77 69 74 68 20 55 4e 42 4f 55 4e 44 45 44 20   with UNBOUNDED 
f620: 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f 0a 20 20  PRECEDING. */.  
f630: 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41  if( op==WINDOW_A
f640: 47 47 49 4e 56 45 52 53 45 20 26 26 20 70 4d 57  GGINVERSE && pMW
f650: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
f660: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
f670: 61 73 73 65 72 74 28 20 72 65 67 43 6f 75 6e 74  assert( regCount
f680: 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75 6d 70 4f  down==0 && jumpO
f690: 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72  nEof==0 );.    r
f6a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f6b0: 69 66 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  if( regCountdown
f6c0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  >0 ){.    if( pM
f6d0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54  Win->eFrmType==T
f6e0: 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
f6f0: 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d   addrNextRange =
f700: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f710: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
f720: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49    assert( op==WI
f730: 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20  NDOW_AGGINVERSE 
f740: 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  || op==WINDOW_AG
f750: 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20 20 69  GSTEP );.      i
f760: 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  f( op==WINDOW_AG
f770: 47 49 4e 56 45 52 53 45 20 29 7b 0a 20 20 20 20  GINVERSE ){.    
f780: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
f790: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
f7a0: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
f7b0: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
f7c0: 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Test(.          
f7d0: 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d      p, OP_Le, p-
f7e0: 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  >current.csr, re
f7f0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73  gCountdown, p->s
f800: 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  tart.csr, lblDon
f810: 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
f820: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f830: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
f840: 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20  deRangeTest(.   
f850: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50             p, OP
f860: 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73  _Ge, p->start.cs
f870: 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c  r, regCountdown,
f880: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c   p->current.csr,
f890: 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20   lblDone.       
f8a0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
f8b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f8c0: 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
f8d0: 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20  angeTest(.      
f8e0: 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c 20        p, OP_Gt, 
f8f0: 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67 43  p->end.csr, regC
f900: 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72  ountdown, p->cur
f910: 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  rent.csr, lblDon
f920: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
f930: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f940: 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73        addrIf = s
f950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f960: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
f970: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31  gCountdown, 0, 1
f980: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
f990: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
f9a0: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 57    }..  if( op==W
f9b0: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
f9c0: 20 26 26 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74   && pMWin->regSt
f9d0: 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20  artRowid==0 ){. 
f9e0: 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61     windowAggFina
f9f0: 6c 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61  l(p, 0);.  }.  a
fa00: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
fa10: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fa20: 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69 74 63  Addr(v);.  switc
fa30: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
fa40: 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  e WINDOW_RETURN_
fa50: 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72 20 3d  ROW:.      csr =
fa60: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 3b   p->current.csr;
fa70: 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e  .      reg = p->
fa80: 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20 20 20  current.reg;.   
fa90: 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f     windowReturnO
faa0: 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20 20 20 20  neRow(p);.      
fab0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
fac0: 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
fad0: 53 45 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20  SE:.      csr = 
fae0: 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a 20 20  p->start.csr;.  
faf0: 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 73 74 61      reg = p->sta
fb00: 72 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 69 66  rt.reg;.      if
fb10: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
fb20: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  tRowid ){.      
fb30: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
fb40: 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29 3b 0a  >regEndRowid );.
fb50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fb60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fb70: 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72  AddImm, pMWin->r
fb80: 65 67 53 74 61 72 74 52 6f 77 69 64 2c 20 31 29  egStartRowid, 1)
fb90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fba0: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67         windowAgg
fbb0: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
fbc0: 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e 72  in, csr, 1, p->r
fbd0: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  egArg);.      }.
fbe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
fbf0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
fc00: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e   assert( op==WIN
fc10: 44 4f 57 5f 41 47 47 53 54 45 50 20 29 3b 0a 20  DOW_AGGSTEP );. 
fc20: 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 65 6e       csr = p->en
fc30: 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67  d.csr;.      reg
fc40: 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20   = p->end.reg;. 
fc50: 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
fc60: 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29 7b  regStartRowid ){
fc70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fc80: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
fc90: 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73  wid );.        s
fca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fcb0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
fcc0: 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69  MWin->regEndRowi
fcd0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  d, 1);.      }el
fce0: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  se{.        wind
fcf0: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
fd00: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30 2c  , pMWin, csr, 0,
fd10: 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 20 20 20   p->regArg);.   
fd20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fd30: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d  ;.  }..  if( op=
fd40: 3d 70 2d 3e 65 44 65 6c 65 74 65 20 29 7b 0a 20  =p->eDelete ){. 
fd50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd60: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
fd70: 65 2c 20 63 73 72 29 3b 0a 20 20 20 20 73 71 6c  e, csr);.    sql
fd80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
fd90: 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  (v, OPFLAG_SAVEP
fda0: 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 7d 0a 0a 20  OSITION);.  }.. 
fdb0: 20 69 66 28 20 6a 75 6d 70 4f 6e 45 6f 66 20 29   if( jumpOnEof )
fdc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fdd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
fde0: 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33  xt, csr, sqlite3
fdf0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
fe00: 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+2);.    VdbeC
fe10: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fe20: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ret = sqlite3Vdb
fe30: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
fe40: 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  to);.  }else{.  
fe50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe60: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
fe70: 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  csr, sqlite3Vdbe
fe80: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
fe90: 2b 62 50 65 65 72 29 3b 0a 20 20 20 20 56 64 62  +bPeer);.    Vdb
fea0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
feb0: 20 20 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20    if( bPeer ){. 
fec0: 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20       addrGoto = 
fed0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fee0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
fef0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
ff00: 62 50 65 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  bPeer ){.    int
ff10: 20 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e 2d 3e   nReg = (pMWin->
ff20: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
ff30: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
ff40: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
ff50: 72 65 67 54 6d 70 20 3d 20 28 6e 52 65 67 20 3f  regTmp = (nReg ?
ff60: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ff70: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65  ange(pParse, nRe
ff80: 67 29 20 3a 20 30 29 3b 0a 20 20 20 20 77 69 6e  g) : 0);.    win
ff90: 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65  dowReadPeerValue
ffa0: 73 28 70 2c 20 63 73 72 2c 20 72 65 67 54 6d 70  s(p, csr, regTmp
ffb0: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e  );.    windowIfN
ffc0: 65 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70  ewPeer(pParse, p
ffd0: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20  MWin->pOrderBy, 
ffe0: 72 65 67 54 6d 70 2c 20 72 65 67 2c 20 61 64 64  regTmp, reg, add
fff0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
10000 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10010 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
10020 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b 0a 20  regTmp, nReg);. 
10030 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72 4e 65   }..  if( addrNe
10040 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 73  xtRange ){.    s
10050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10060 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
10070 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29 3b 0a  addrNextRange);.
10080 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
10090 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
100a0 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69 66 28   lblDone);.  if(
100b0 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69   addrGoto ) sqli
100c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
100d0 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20  v, addrGoto);.  
100e0 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
100f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10100 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 72  (v, addrIf);.  r
10110 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 0a 2f  eturn ret;.}.../
10120 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
10130 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c 69  d return a dupli
10140 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e 64  cate of the Wind
10150 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61  ow object indica
10160 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74 68  ted by the.** th
10170 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 65  ird argument. Se
10180 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f 77  t the Window.pOw
10190 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ner field of the
101a0 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a 2a   new object to.*
101b0 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e  * pOwner..*/.Win
101c0 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
101d0 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  owDup(sqlite3 *d
101e0 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72 2c  b, Expr *pOwner,
101f0 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57   Window *p){.  W
10200 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b  indow *pNew = 0;
10210 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
10220 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   ){.    pNew = s
10230 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10240 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 69  ro(db, sizeof(Wi
10250 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20  ndow));.    if( 
10260 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
10270 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ew->zName = sqli
10280 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
10290 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  p->zName);.     
102a0 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d   pNew->pFilter =
102b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
102c0 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20  db, p->pFilter, 
102d0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
102e0 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e 63  pFunc = p->pFunc
102f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  ;.      pNew->pP
10300 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74  artition = sqlit
10310 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
10320 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  , p->pPartition,
10330 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
10340 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
10350 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
10360 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
10370 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10380 65 46 72 6d 54 79 70 65 20 3d 20 70 2d 3e 65 46  eFrmType = p->eF
10390 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e  rmType;.      pN
103a0 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45  ew->eEnd = p->eE
103b0 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nd;.      pNew->
103c0 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61  eStart = p->eSta
103d0 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rt;.      pNew->
103e0 65 45 78 63 6c 75 64 65 20 3d 20 70 2d 3e 65 45  eExclude = p->eE
103f0 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 70 4e  xclude;.      pN
10400 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  ew->pStart = sql
10410 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
10420 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20  p->pStart, 0);. 
10430 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20       pNew->pEnd 
10440 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
10450 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29  (db, p->pEnd, 0)
10460 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
10470 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20  wner = pOwner;. 
10480 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10490 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
104a0 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f   Return a copy o
104b0 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
104c0 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65  t of Window obje
104d0 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74 68  cts passed as th
104e0 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75  e.** second argu
104f0 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ment..*/.Window 
10500 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69  *sqlite3WindowLi
10510 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
10520 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
10530 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
10540 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20   Window *pRet = 
10550 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70  0;.  Window **pp
10560 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72   = &pRet;..  for
10570 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70  (pWin=p; pWin; p
10580 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
10590 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73  in){.    *pp = s
105a0 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28  qlite3WindowDup(
105b0 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20  db, 0, pWin);.  
105c0 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62    if( *pp==0 ) b
105d0 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26  reak;.    pp = &
105e0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e  ((*pp)->pNextWin
105f0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
10600 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
10610 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
10620 74 20 63 61 6e 20 62 65 20 64 65 74 65 72 6d 69  t can be determi
10630 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  ned at compile t
10640 69 6d 65 20 74 68 61 74 20 65 78 70 72 65 73 73  ime that express
10650 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20 65 76  ion .** pExpr ev
10660 61 6c 75 61 74 65 73 20 74 6f 20 61 20 76 61 6c  aluates to a val
10670 75 65 20 74 68 61 74 2c 20 77 68 65 6e 20 63 61  ue that, when ca
10680 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
10690 2c 20 69 73 20 67 72 65 61 74 65 72 20 0a 2a 2a  , is greater .**
106a0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61 6c 73   than zero. Fals
106b0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
106c0 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
106d0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
106e0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
106f0 65 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c 6c 6f  e Parse.db.mallo
10700 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c 61 67  cFailed .** flag
10710 20 61 6e 64 20 72 65 74 75 72 6e 73 20 7a 65 72   and returns zer
10720 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
10730 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72   windowExprGtZer
10740 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10750 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
10760 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20   int ret = 0;.  
10770 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10780 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69  arse->db;.  sqli
10790 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
107a0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  = 0;.  sqlite3Va
107b0 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20  lueFromExpr(db, 
107c0 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63 2c 20  pExpr, db->enc, 
107d0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
107e0 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20 69 66  IC, &pVal);.  if
107f0 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
10800 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
10810 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 20 3d  )>0 ){.    ret =
10820 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
10830 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
10840 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
10850 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
10860 57 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73  WhereBegin() has
10870 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
10880 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c  lled for the SEL
10890 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
108a0 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
108b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
108c0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
108d0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49  on is invoked. I
108e0 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63  t generates.** c
108f0 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ode to populate 
10900 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  the Window.regRe
10910 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f  sult register fo
10920 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
10930 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69  nction .** and i
10940 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
10950 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63  utine at instruc
10960 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f  tion addrGosub o
10970 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77  nce for each row
10980 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  ..** sqlite3Wher
10990 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73  eEnd() is always
109a0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
109b0 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a  eturning. .**.**
109c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   This function h
109d0 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64  andles several d
109e0 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
109f0 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c  f window frames,
10a00 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72   which.** requir
10a10 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  e slightly diffe
10a20 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  rent processing.
10a30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
10a40 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a  seudo code is.**
10a50 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
10a60 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73  nt window frames
10a70 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
10a80 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
10a90 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45  EN <expr1> PRECE
10aa0 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  DING AND <expr2>
10ab0 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
10ac0 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72   Other window fr
10ad0 61 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61  ame types use va
10ae0 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  riants of the fo
10af0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
10b00 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
10b10 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
10b20 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
10b30 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
10b40 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
10b50 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
10b60 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
10b70 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
10b80 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
10b90 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
10ba0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69  .**       if( fi
10bb0 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
10bc0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
10bd0 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72     // Rewind thr
10be0 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20  ee cursors, all 
10bf0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20  open on the eph 
10c00 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
10c10 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
10c20 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  ;.**         Rew
10c30 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a  ind(csrStart);.*
10c40 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
10c50 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a  (csrCurrent);.**
10c60 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20         .**      
10c70 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
10c80 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20  r2>          // 
10c90 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
10ca0 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  sion.**         
10cb0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
10cc0 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45  1>        // PRE
10cd0 43 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f  CEDING expressio
10ce0 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  n.**       }else
10cf0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20  {.**         // 
10d00 46 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  First time this 
10d10 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c  branch is taken,
10d20 20 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63   the eph table c
10d30 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20  ontains two .** 
10d40 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e          // rows.
10d50 20 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   The first row i
10d60 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c  n the partition,
10d70 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65   which all three
10d80 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20   cursors.**     
10d90 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79      // currently
10da0 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74   point to, and t
10db0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77  he following row
10dc0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  ..**         AGG
10dd0 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
10de0 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
10df0 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
10e00 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
10e20 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10e30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10e40 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20  AGGINVERSE.**   
10e50 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
10e60 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10e70 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
10e80 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
10e90 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
10ea0 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
10eb0 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
10ec0 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20   ROW.**         
10ed0 69 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69  if( csrCurrent i
10ee0 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a  s EOF ) break;.*
10ef0 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72  *         if( (r
10f00 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10f10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67  .**           Ag
10f20 67 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72  gInverse(csrStar
10f30 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
10f40 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
10f50 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
10f60 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
10f70 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f   pseudo-code abo
10f80 76 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c  ve uses the foll
10f90 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a  owing shorthand:
10fa0 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50  .**.**   AGGSTEP
10fb0 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20  :    invoke the 
10fc0 61 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28  aggregate xStep(
10fd0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  ) function for e
10fe0 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
10ff0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ion.**          
11000 20 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65       with argume
11010 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  nts read from th
11020 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
11030 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20   cursor csrEnd, 
11040 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
11050 20 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f        step curso
11060 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64  r csrEnd forward
11070 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73   one row (i.e. s
11080 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
11090 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55  ))..**.**   RETU
110a0 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61  RN_ROW: return a
110b0 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c   row to the call
110c0 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
110d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
110e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
110f0 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66    current row of
11100 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20   csrCurrent and 
11110 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
11120 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20  e of all .**    
11130 20 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65             aggre
11140 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70  gates. Then step
11150 20 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65   cursor csrCurre
11160 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72  nt forward one r
11170 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49  ow..**.**   AGGI
11180 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74  NVERSE: invoke t
11190 68 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e  he aggregate xIn
111a0 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
111b0 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
111c0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
111d0 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74     functions wit
111e0 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64  h arguments read
111f0 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
11200 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a  t row of cursor.
11210 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11220 20 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20   csrStart. Then 
11230 73 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f  step csrStart fo
11240 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a  rward one row..*
11250 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
11260 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69  wo other ROWS wi
11270 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74  ndow frames that
11280 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67   are handled sig
11290 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69  nificantly.** di
112a0 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
112b0 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57  he above - "BETW
112c0 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45  EEN <expr> PRECE
112d0 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20  DING AND <expr> 
112e0 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e  PRECEDING".** an
112f0 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72  d "BETWEEN <expr
11300 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
11310 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
11320 22 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65  ". These are spe
11330 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62  cial .** cases b
11340 65 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e  ecause they chan
11350 67 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  ge the order in 
11360 77 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20  which the three 
11370 63 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72  cursors (csrStar
11380 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74  t,.** csrCurrent
11390 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65   and csrEnd) ite
113a0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
113b0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
113c0 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20  . Cases that.** 
113d0 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72  use UNBOUNDED or
113e0 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65   CURRENT ROW are
113f0 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61   much simpler va
11400 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20  riations on one 
11410 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65  of these.** thre
11420 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  e..**.**   ROWS 
11430 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
11440 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
11450 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
11460 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
11470 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
11480 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11490 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
114a0 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
114b0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
114c0 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
114d0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
114e0 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
114f0 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
11500 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
11510 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
11520 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
11530 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11540 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11550 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11560 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11570 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
11580 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
11590 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
115a0 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
115b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
115c0 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
115d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
115e0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
115f0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
11600 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
11610 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
11620 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
11630 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
11640 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
11650 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
11660 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68    }.**     flush
11670 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  :.**       if( (
11680 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
11690 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
116a0 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  EP.**       }.**
116b0 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
116c0 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  W.**.**.**   ROW
116d0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
116e0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
116f0 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
11700 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
11710 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
11720 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11730 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  n() ....**     i
11740 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
11750 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73   ){.**       Gos
11760 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
11770 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  }.**     Insert 
11780 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
11790 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69   table..**     i
117a0 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
117b0 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
117c0 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
117d0 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
117e0 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
117f0 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
11800 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
11810 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
11820 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e  regStart = regEn
11830 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20  d - <expr1>.**  
11840 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
11850 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
11860 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
11870 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11880 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11890 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
118a0 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
118b0 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
118c0 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
118d0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
118e0 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20    }.**   }.**   
118f0 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47  flush:.**     AG
11900 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69  GSTEP.**     whi
11910 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
11920 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
11930 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
11940 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
11950 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
11960 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
11970 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28    }.**       if(
11980 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
11990 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
119a0 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
119b0 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
119c0 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  reak.**       }.
119d0 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
119e0 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43  while( !eof csrC
119f0 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20  urrent ){.**    
11a00 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
11a10 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72       }.**.** For
11a20 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20   the most part, 
11a30 74 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f  the patterns abo
11a40 76 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74  ve are adapted t
11a50 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e  o support UNBOUN
11a60 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69  DED by.** assumi
11a70 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71  ng that it is eq
11a80 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66  uivalent to "inf
11a90 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f  inity PRECEDING/
11aa0 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a  FOLLOWING" and.*
11ab0 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79  * CURRENT ROW by
11ac0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
11ad0 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20  t is equivilent 
11ae0 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f  to "0 PRECEDING/
11af0 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54  FOLLOWING"..** T
11b00 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  his is optimized
11b10 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61   of course - bra
11b20 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20  nches that will 
11b30 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61  never be taken a
11b40 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  nd.** conditions
11b50 20 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73   that are always
11b60 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65   true are omitte
11b70 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f  d from the VM co
11b80 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20  de. The only.** 
11b90 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65  exceptional case
11ba0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   is:.**.**   ROW
11bb0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
11bc0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
11bd0 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
11be0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
11bf0 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
11c00 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
11c10 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11c20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11c30 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11c40 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11c50 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
11c60 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11c70 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
11c80 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11c90 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11ca0 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
11cb0 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
11cc0 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
11cd0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
11ce0 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
11cf0 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
11d00 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
11d10 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
11d20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
11d30 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
11d40 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
11d50 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
11d60 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
11d70 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
11d80 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
11d90 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
11da0 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20   ) break.**     
11db0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54    }.**       RET
11dc0 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
11dd0 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21  .**     while( !
11de0 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29  eof csrCurrent )
11df0 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52  {.**       RETUR
11e00 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a  N_ROW.**     }.*
11e10 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72  *.** Also requir
11e20 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ing special hand
11e30 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73  ling are the cas
11e40 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  es:.**.**   ROWS
11e50 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
11e60 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
11e70 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
11e80 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
11e90 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  EN <expr1> FOLLO
11ea0 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  WING AND <expr2>
11eb0 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
11ec0 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65   when (expr1 < e
11ed0 78 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64  xpr2). This is d
11ee0 65 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69  etected at runti
11ef0 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20  me, not by this 
11f00 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20  function..** To 
11f10 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65  handle this case
11f20 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64  , the pseudo-cod
11f30 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63  e programs depic
11f40 74 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f  ted above are mo
11f50 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74  dified.** slight
11f60 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  ly to be:.**.** 
11f70 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
11f80 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
11f90 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
11fa0 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70  **     if( new p
11fb0 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
11fc0 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
11fd0 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
11fe0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11ff0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12000 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74  **     if( first
12010 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
12020 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65  n ){.**       Re
12030 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
12040 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
12050 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
12060 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65  ent).**       re
12070 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
12080 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
12090 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
120a0 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c      if( regEnd <
120b0 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20   regStart ){.** 
120c0 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
120d0 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  OW.**         de
120e0 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63  lete eph table c
120f0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
12100 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20     continue.**  
12110 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e       }.**     ..
12120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
12130 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65  "continue" state
12140 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76  ment in the abov
12150 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e  e jumps to the n
12160 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a  ext iteration.**
12170 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
12180 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61  op - the one sta
12190 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
121a0 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a  hereBegin()..**.
121b0 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47  ** The various G
121c0 52 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20  ROUPS cases are 
121d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
121e0 67 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65  g the same patte
121f0 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20  rns as.** ROWS. 
12200 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d  The VM code is m
12210 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79  odified slightly
12220 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20   so that:.**.** 
12230 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72    1. The else br
12240 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e  anch in the main
12250 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61   loop is only ta
12260 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a  ken if the row j
12270 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65  ust.**      adde
12280 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  d to the ephemer
12290 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  al table is the 
122a0 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67  start of a new g
122b0 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20  roup. In.**     
122c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
122d0 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20   becomes:.**.** 
122e0 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70          ... loop
122f0 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
12300 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
12310 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ....**         i
12320 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
12330 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12340 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12350 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
12360 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
12370 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
12380 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  le..**         i
12390 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
123a0 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
123b0 20 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64            Rewind
123c0 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
123d0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
123e0 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
123f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
12400 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
12410 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53  *           regS
12420 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
12430 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  *         }else 
12440 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b  if( new group ){
12450 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e  .**           ..
12460 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  . .**         }.
12470 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
12480 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66     2. Instead of
12490 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69   processing a si
124a0 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52  ngle row, each R
124b0 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54  ETURN_ROW, AGGST
124c0 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41  EP or .**      A
124d0 47 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70  GGINVERSE step p
124e0 72 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72  rocesses the cur
124f0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
12500 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20  relevant cursor 
12510 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20  and.**      all 
12520 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20  subsequent rows 
12530 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
12540 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a   same group..**.
12550 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20  ** RANGE window 
12560 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74  frames are a lit
12570 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67  tle different ag
12580 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55  ain. As for GROU
12590 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  PS, the .** main
125a0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
125b0 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20  per group only. 
125c0 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20  And RETURN_ROW, 
125d0 41 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49  AGGSTEP and AGGI
125e0 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69  NVERSE.** deal i
125f0 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64  n groups instead
12600 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72   of rows. As for
12610 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53   ROWS and GROUPS
12620 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
12630 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73  e.** basic cases
12640 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20  :.**.**   RANGE 
12650 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
12660 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
12670 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  xpr2> FOLLOWING.
12680 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
12690 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
126a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
126b0 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
126c0 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
126d0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
126e0 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
126f0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
12700 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
12710 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
12720 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
12730 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
12740 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
12750 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
12760 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
12770 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
12780 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
12790 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
127a0 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
127b0 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
127c0 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
127d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
127e0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  TEP.**         w
127f0 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
12800 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20  t.key + regEnd) 
12810 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a  < csrEnd.key ){.
12820 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54  **           RET
12830 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
12840 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53       while( csrS
12850 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74  tart.key + regSt
12860 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e  art) < csrCurren
12870 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
12880 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
12890 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  SE.**           
128a0 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  }.**         }.*
128b0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
128c0 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
128d0 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45  .**       AGGSTE
128e0 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  P.**       while
128f0 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
12900 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20    RETURN ROW.** 
12910 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43          if( csrC
12920 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20  urrent is EOF ) 
12930 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
12940 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
12950 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
12960 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
12970 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
12980 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
12990 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
129a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
129b0 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49         }.**.** I
129c0 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61  n the above nota
129d0 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20  tion, "csr.key" 
129e0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e  means the curren
129f0 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f  t value of the O
12a00 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72  RDER BY .** expr
12a10 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73  ession (there is
12a20 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72   only ever 1 for
12a30 20 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73   a RANGE that us
12a40 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c  es an <expr> FOL
12a50 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78  LOWING.** or <ex
12a60 70 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65  pr PRECEDING) re
12a70 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63  ad from cursor c
12a80 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  sr..**.**   RANG
12a90 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
12aa0 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
12ab0 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
12ac0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
12ad0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
12ae0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
12af0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
12b00 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12b10 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12b20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12b30 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12b40 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12b50 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12b60 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12b70 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12b80 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12b90 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12ba0 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12bb0 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
12bc0 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
12bd0 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
12be0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
12bf0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12c00 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
12c10 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e{.**         if
12c20 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20  ( (csrEnd.key + 
12c30 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43 75  regEnd) <= csrCu
12c40 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20  rrent.key ){.** 
12c50 20 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45            AGGSTE
12c60 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  P.**         }.*
12c70 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  *         while(
12c80 20 28 63 73 72 53 74 61 72 74 2e 6b 65 79 20 2b   (csrStart.key +
12c90 20 72 65 67 53 74 61 72 74 29 20 3c 20 63 73 72   regStart) < csr
12ca0 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
12cb0 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49  *           AGGI
12cc0 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20  NVERSE.**       
12cd0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52    }.**         R
12ce0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12cf0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
12d00 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20       flush:.**  
12d10 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
12d20 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  End.key + regEnd
12d30 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e 74 2e  ) <= csrCurrent.
12d40 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
12d50 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
12d60 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68     }.**       wh
12d70 69 6c 65 28 20 28 63 73 72 53 74 61 72 74 2e 6b  ile( (csrStart.k
12d80 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20 3c  ey + regStart) <
12d90 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20   csrCurrent.key 
12da0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  ){.**         AG
12db0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
12dc0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54    }.**       RET
12dd0 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20  URN_ROW.**.**   
12de0 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65  RANGE BETWEEN <e
12df0 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  xpr1> FOLLOWING 
12e00 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c  AND <expr2> FOLL
12e10 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
12e20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
12e30 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
12e40 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
12e50 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72       if( new par
12e60 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
12e70 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
12e80 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12e90 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
12ea0 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
12eb0 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  le..**       if(
12ec0 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61   first row of pa
12ed0 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
12ee0 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
12ef0 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
12f00 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
12f10 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
12f20 20 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d          regEnd =
12f30 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
12f40 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
12f50 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20  expr1>.**       
12f60 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20  }else{.**       
12f70 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
12f80 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
12f90 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65  Current.key + re
12fa0 67 45 6e 64 29 20 3c 20 63 73 72 45 6e 64 2e 6b  gEnd) < csrEnd.k
12fb0 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ey ){.**        
12fc0 20 20 20 77 68 69 6c 65 28 20 28 63 73 72 43 75     while( (csrCu
12fd0 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 53  rrent.key + regS
12fe0 74 61 72 74 29 20 3e 20 63 73 72 53 74 61 72 74  tart) > csrStart
12ff0 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
13000 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
13010 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
13020 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45  .**           RE
13030 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
13040 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
13050 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
13060 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20   flush:.**      
13070 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
13080 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
13090 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
130a0 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
130b0 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20 63 73  + regStart) > cs
130c0 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a  rStart.key ){.**
130d0 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
130e0 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
130f0 20 20 20 69 66 28 20 65 6f 66 20 29 20 62 72 65     if( eof ) bre
13100 61 6b 20 22 77 68 69 6c 65 28 20 31 20 29 22 20  ak "while( 1 )" 
13110 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20 20 20 20 20  loop..**        
13120 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
13130 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
13140 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69    }.**       whi
13150 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75 72 72  le( !eof csrCurr
13160 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ent ){.**       
13170 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
13180 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68        }.**.** Th
13190 65 20 74 65 78 74 20 61 62 6f 76 65 20 6c 65 61  e text above lea
131a0 76 65 73 20 6f 75 74 20 6d 61 6e 79 20 64 65 74  ves out many det
131b0 61 69 6c 73 2e 20 52 65 66 65 72 20 74 6f 20 74  ails. Refer to t
131c0 68 65 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  he code and comm
131d0 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f 77 20 66 6f  ents.** below fo
131e0 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 74  r a more complet
131f0 65 20 70 69 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  e picture..*/.vo
13200 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
13210 43 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72 73  CodeStep(.  Pars
13220 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
13240 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
13250 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 2f 2a 20 52 65 77 72 69 74 74 65 6e 20 53    /* Rewritten S
13280 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13290 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
132a0 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  pWInfo,         
132b0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
132c0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
132d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
132e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  */.  int regGosu
132f0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
13300 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13310 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20 2a 2f   for OP_Gosub */
13320 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75 62 20 68     /* OP_Gosub h
13350 65 72 65 20 74 6f 20 72 65 74 75 72 6e 20 65 61  ere to return ea
13360 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57  ch row */.){.  W
13370 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
13380 2d 3e 70 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69  ->pWin;.  ExprLi
13390 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
133a0 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  MWin->pOrderBy;.
133b0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
133c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
133d0 65 29 3b 0a 20 20 69 6e 74 20 63 73 72 57 72 69  e);.  int csrWri
133e0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
133f0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
13400 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
13410 20 65 70 68 2e 20 74 61 62 6c 65 20 2a 2f 0a 20   eph. table */. 
13420 20 69 6e 74 20 63 73 72 49 6e 70 75 74 20 3d 20   int csrInput = 
13430 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
13440 75 72 73 6f 72 3b 20 20 20 20 20 2f 2a 20 43 75  ursor;     /* Cu
13450 72 73 6f 72 20 6f 66 20 73 75 62 2d 73 65 6c 65  rsor of sub-sele
13460 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  ct */.  int nInp
13470 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ut = p->pSrc->a[
13480 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 20  0].pTab->nCol;  
13490 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
134a0 6f 6c 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ols returned by 
134b0 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  sub */.  int iIn
134c0 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
134f0 20 74 68 72 6f 75 67 68 20 73 75 62 20 63 6f 6c   through sub col
13500 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  s */.  int addrN
13510 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
13520 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13530 73 20 6f 66 20 4f 50 5f 4e 65 20 2a 2f 0a 20 20  s of OP_Ne */.  
13540 69 6e 74 20 61 64 64 72 47 6f 73 75 62 46 6c 75  int addrGosubFlu
13550 73 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sh = 0;         
13560 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
13570 5f 47 6f 73 75 62 20 74 6f 20 66 6c 75 73 68 3a  _Gosub to flush:
13580 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e   */.  int addrIn
13590 74 65 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  teger = 0;      
135a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
135b0 20 6f 66 20 4f 50 5f 49 6e 74 65 67 65 72 20 2a   of OP_Integer *
135c0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6d 70 74  /.  int addrEmpt
135d0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
135e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
135f0 66 20 4f 50 5f 52 65 77 69 6e 64 20 69 6e 20 66  f OP_Rewind in f
13600 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 72  lush: */.  int r
13610 65 67 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20  egStart = 0;    
13620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
13630 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 50 52  lue of <expr> PR
13640 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  ECEDING */.  int
13650 20 72 65 67 45 6e 64 20 3d 20 30 3b 20 20 20 20   regEnd = 0;    
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13670 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20  Value of <expr> 
13680 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69  FOLLOWING */.  i
13690 6e 74 20 72 65 67 4e 65 77 3b 20 20 20 20 20 20  nt regNew;      
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
136b0 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73  * Array of regis
136c0 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 6e 65 77  ters holding new
136d0 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20   input row */.  
136e0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13700 2f 2a 20 72 65 67 4e 65 77 20 61 72 72 61 79 20  /* regNew array 
13710 69 6e 20 72 65 63 6f 72 64 20 66 6f 72 6d 20 2a  in record form *
13720 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  /.  int regRowid
13730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13740 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
13750 20 72 65 67 52 65 63 6f 72 64 20 69 6e 20 65 70   regRecord in ep
13760 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  h table */.  int
13770 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 30 3b   regNewPeer = 0;
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13790 50 65 65 72 20 76 61 6c 75 65 73 20 66 6f 72 20  Peer values for 
137a0 6e 65 77 20 72 6f 77 20 28 70 61 72 74 20 6f 66  new row (part of
137b0 20 72 65 67 4e 65 77 29 20 2a 2f 0a 20 20 69 6e   regNew) */.  in
137c0 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20  t regPeer = 0;  
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
137e0 20 50 65 65 72 20 76 61 6c 75 65 73 20 66 6f 72   Peer values for
137f0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   current row */.
13800 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61    int regFlushPa
13810 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rt = 0;         
13820 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
13830 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70  r "Gosub flush_p
13840 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 57  artition" */.  W
13850 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 73 3b 20  indowCodeArg s; 
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13870 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
13880 20 66 6f 72 20 73 75 62 2d 72 6f 75 74 69 6e 65   for sub-routine
13890 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 57 68  s */.  int lblWh
138a0 65 72 65 45 6e 64 3b 20 20 20 20 20 20 20 20 20  ereEnd;         
138b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
138c0 6a 75 73 74 20 62 65 66 6f 72 65 20 73 71 6c 69  just before sqli
138d0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 63 6f  te3WhereEnd() co
138e0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
138f0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
13900 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20  TK_PRECEDING || 
13910 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
13920 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20  K_CURRENT .     
13930 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
13940 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
13950 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
13960 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
13970 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
13980 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
13990 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57  FOLLOWING || pMW
139a0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
139b0 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  RENT .       || 
139c0 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
139d0 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 70 4d 57  UNBOUNDED || pMW
139e0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
139f0 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 20 20 61  CEDING .  );.  a
13a00 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
13a10 78 63 6c 75 64 65 3d 3d 30 20 7c 7c 20 70 4d 57  xclude==0 || pMW
13a20 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b  in->eExclude==TK
13a30 5f 43 55 52 52 45 4e 54 0a 20 20 20 20 20 20 20  _CURRENT.       
13a40 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13a50 64 65 3d 3d 54 4b 5f 47 52 4f 55 50 20 7c 7c 20  de==TK_GROUP || 
13a60 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d  pMWin->eExclude=
13a70 3d 54 4b 5f 54 49 45 53 0a 20 20 20 20 20 20 20  =TK_TIES.       
13a80 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13a90 64 65 3d 3d 54 4b 5f 4e 4f 0a 20 20 29 3b 0a 0a  de==TK_NO.  );..
13aa0 20 20 6c 62 6c 57 68 65 72 65 45 6e 64 20 3d 20    lblWhereEnd = 
13ab0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
13ac0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
13ad0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
13ae0 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a  context object *
13af0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  /.  memset(&s, 0
13b00 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 43  , sizeof(WindowC
13b10 6f 64 65 41 72 67 29 29 3b 0a 20 20 73 2e 70 50  odeArg));.  s.pP
13b20 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
13b30 20 73 2e 70 4d 57 69 6e 20 3d 20 70 4d 57 69 6e   s.pMWin = pMWin
13b40 3b 0a 20 20 73 2e 70 56 64 62 65 20 3d 20 76 3b  ;.  s.pVdbe = v;
13b50 0a 20 20 73 2e 72 65 67 47 6f 73 75 62 20 3d 20  .  s.regGosub = 
13b60 72 65 67 47 6f 73 75 62 3b 0a 20 20 73 2e 61 64  regGosub;.  s.ad
13b70 64 72 47 6f 73 75 62 20 3d 20 61 64 64 72 47 6f  drGosub = addrGo
13b80 73 75 62 3b 0a 20 20 73 2e 63 75 72 72 65 6e 74  sub;.  s.current
13b90 2e 63 73 72 20 3d 20 70 4d 57 69 6e 2d 3e 69 45  .csr = pMWin->iE
13ba0 70 68 43 73 72 3b 0a 20 20 63 73 72 57 72 69 74  phCsr;.  csrWrit
13bb0 65 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  e = s.current.cs
13bc0 72 2b 31 3b 0a 20 20 73 2e 73 74 61 72 74 2e 63  r+1;.  s.start.c
13bd0 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63  sr = s.current.c
13be0 73 72 2b 32 3b 0a 20 20 73 2e 65 6e 64 2e 63 73  sr+2;.  s.end.cs
13bf0 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  r = s.current.cs
13c00 72 2b 33 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  r+3;..  /* Figur
13c10 65 20 6f 75 74 20 77 68 65 6e 20 72 6f 77 73 20  e out when rows 
13c20 6d 61 79 20 62 65 20 64 65 6c 65 74 65 64 20 66  may be deleted f
13c30 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65 72 61  rom the ephemera
13c40 6c 20 74 61 62 6c 65 2e 20 54 68 65 72 65 0a 20  l table. There. 
13c50 20 2a 2a 20 61 72 65 20 66 6f 75 72 20 6f 70 74   ** are four opt
13c60 69 6f 6e 73 20 2d 20 74 68 65 79 20 6d 61 79 20  ions - they may 
13c70 6e 65 76 65 72 20 62 65 20 64 65 6c 65 74 65 64  never be deleted
13c80 20 28 65 44 65 6c 65 74 65 3d 3d 30 29 2c 20 74   (eDelete==0), t
13c90 68 65 79 20 6d 61 79 20 0a 20 20 2a 2a 20 62 65  hey may .  ** be
13ca0 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f 6e   deleted as soon
13cb0 20 61 73 20 74 68 65 79 20 61 72 65 20 6e 6f 20   as they are no 
13cc0 6c 6f 6e 67 65 72 20 70 61 72 74 20 6f 66 20 74  longer part of t
13cd0 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 0a  he window frame.
13ce0 20 20 2a 2a 20 28 65 44 65 6c 65 74 65 3d 3d 57    ** (eDelete==W
13cf0 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
13d00 29 2c 20 74 68 65 79 20 6d 61 79 20 62 65 20 64  ), they may be d
13d10 65 6c 65 74 65 64 20 61 73 20 61 66 74 65 72 20  eleted as after 
13d20 74 68 65 20 72 6f 77 20 0a 20 20 2a 2a 20 68 61  the row .  ** ha
13d30 73 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  s been returned 
13d40 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 28 57  to the caller (W
13d50 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
13d60 29 2c 20 6f 72 20 74 68 65 79 20 6d 61 79 0a 20  ), or they may. 
13d70 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
13d80 66 74 65 72 20 74 68 65 79 20 65 6e 74 65 72 20  fter they enter 
13d90 74 68 65 20 66 72 61 6d 65 20 28 57 49 4e 44 4f  the frame (WINDO
13da0 57 5f 41 47 47 53 54 45 50 29 2e 20 2a 2f 0a 20  W_AGGSTEP). */. 
13db0 20 73 77 69 74 63 68 28 20 70 4d 57 69 6e 2d 3e   switch( pMWin->
13dc0 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 63 61  eStart ){.    ca
13dd0 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 3a  se TK_FOLLOWING:
13de0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
13df0 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52  ->eFrmType!=TK_R
13e00 41 4e 47 45 0a 20 20 20 20 20 20 20 26 26 20 77  ANGE.       && w
13e10 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72 6f 28  indowExprGtZero(
13e20 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70  pParse, pMWin->p
13e30 53 74 61 72 74 29 0a 20 20 20 20 20 20 29 7b 0a  Start).      ){.
13e40 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74          s.eDelet
13e50 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  e = WINDOW_RETUR
13e60 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20  N_ROW;.      }. 
13e70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13e80 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  case TK_UNBOUNDE
13e90 44 3a 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e  D:.      if( win
13ea0 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28 70 4d  dowCacheFrame(pM
13eb0 57 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Win)==0 ){.     
13ec0 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45     if( pMWin->eE
13ed0 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
13ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
13ef0 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70  ( pMWin->eFrmTyp
13f00 65 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20 20 20  e!=TK_RANGE.    
13f10 20 20 20 20 20 20 20 26 26 20 77 69 6e 64 6f 77         && window
13f20 45 78 70 72 47 74 5a 65 72 6f 28 70 50 61 72 73  ExprGtZero(pPars
13f30 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 29 0a  e, pMWin->pEnd).
13f40 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
13f50 20 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65           s.eDele
13f60 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47 47 53  te = WINDOW_AGGS
13f70 54 45 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  TEP;.          }
13f80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13f90 20 20 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c            s.eDel
13fa0 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54  ete = WINDOW_RET
13fb0 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20  URN_ROW;.       
13fc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13fd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
13fe0 75 6c 74 3a 0a 20 20 20 20 20 20 73 2e 65 44 65  ult:.      s.eDe
13ff0 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47  lete = WINDOW_AG
14000 47 49 4e 56 45 52 53 45 3b 0a 20 20 20 20 20 20  GINVERSE;.      
14010 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
14020 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
14030 65 72 73 20 66 6f 72 20 74 68 65 20 61 72 72 61  ers for the arra
14040 79 20 6f 66 20 76 61 6c 75 65 73 20 66 72 6f 6d  y of values from
14050 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c 20   the sub-query, 
14060 74 68 65 0a 20 20 2a 2a 20 73 61 6d 76 65 20 76  the.  ** samve v
14070 61 6c 75 65 73 20 69 6e 20 72 65 63 6f 72 64 20  alues in record 
14080 66 6f 72 6d 2c 20 61 6e 64 20 74 68 65 20 72 6f  form, and the ro
14090 77 69 64 20 75 73 65 64 20 74 6f 20 69 6e 73 65  wid used to inse
140a0 72 74 20 73 61 69 64 20 72 65 63 6f 72 64 0a 20  rt said record. 
140b0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 65 70 68   ** into the eph
140c0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a  emeral table.  *
140d0 2f 0a 20 20 72 65 67 4e 65 77 20 3d 20 70 50 61  /.  regNew = pPa
140e0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70  rse->nMem+1;.  p
140f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
14100 49 6e 70 75 74 3b 0a 20 20 72 65 67 52 65 63 6f  Input;.  regReco
14110 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
14120 4d 65 6d 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  Mem;.  regRowid 
14130 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14140 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 77  ;..  /* If the w
14150 69 6e 64 6f 77 20 66 72 61 6d 65 20 63 6f 6e 74  indow frame cont
14160 61 69 6e 73 20 61 6e 20 22 3c 65 78 70 72 3e 20  ains an "<expr> 
14170 50 52 45 43 45 44 49 4e 47 22 20 6f 72 20 22 3c  PRECEDING" or "<
14180 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  expr> FOLLOWING"
14190 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 61 6c  .  ** clause, al
141a0 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 73  locate registers
141b0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
141c0 73 75 6c 74 73 20 6f 66 20 65 76 61 6c 75 61 74  sults of evaluat
141d0 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 3c 65  ing each.  ** <e
141e0 78 70 72 3e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  xpr>.  */.  if( 
141f0 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
14200 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70  K_PRECEDING || p
14210 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
14220 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
14230 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70    regStart = ++p
14240 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
14250 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
14260 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
14270 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
14280 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
14290 0a 20 20 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b  .    regEnd = ++
142a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
142b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
142c0 69 73 20 6e 6f 74 20 61 20 22 52 4f 57 53 20 42  is not a "ROWS B
142d0 45 54 57 45 45 4e 20 2e 2e 2e 22 20 66 72 61 6d  ETWEEN ..." fram
142e0 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  e, then allocate
142f0 20 61 72 72 61 79 73 20 6f 66 0a 20 20 2a 2a 20   arrays of.  ** 
14300 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 6f  registers to sto
14310 72 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  re copies of the
14320 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
14330 73 69 6f 6e 73 20 28 70 65 65 72 20 76 61 6c 75  sions (peer valu
14340 65 73 29 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  es) .  ** for th
14350 65 20 6d 61 69 6e 20 6c 6f 6f 70 2c 20 61 6e 64  e main loop, and
14360 20 66 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   for each cursor
14370 20 28 73 74 61 72 74 2c 20 63 75 72 72 65 6e 74   (start, current
14380 20 61 6e 64 20 65 6e 64 29 2e 20 2a 2f 0a 20 20   and end). */.  
14390 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54  if( pMWin->eFrmT
143a0 79 70 65 21 3d 54 4b 5f 52 4f 57 53 20 29 7b 0a  ype!=TK_ROWS ){.
143b0 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20      int nPeer = 
143c0 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64  (pOrderBy ? pOrd
143d0 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29  erBy->nExpr : 0)
143e0 3b 0a 20 20 20 20 72 65 67 4e 65 77 50 65 65 72  ;.    regNewPeer
143f0 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d 57 69   = regNew + pMWi
14400 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20  n->nBufferCol;. 
14410 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50     if( pMWin->pP
14420 61 72 74 69 74 69 6f 6e 20 29 20 72 65 67 4e 65  artition ) regNe
14430 77 50 65 65 72 20 2b 3d 20 70 4d 57 69 6e 2d 3e  wPeer += pMWin->
14440 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70  pPartition->nExp
14450 72 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20 3d  r;.    regPeer =
14460 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
14470 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
14480 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20  Mem += nPeer;.  
14490 20 20 73 2e 73 74 61 72 74 2e 72 65 67 20 3d 20    s.start.reg = 
144a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20  pParse->nMem+1; 
144b0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
144c0 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e 63  = nPeer;.    s.c
144d0 75 72 72 65 6e 74 2e 72 65 67 20 3d 20 70 50 61  urrent.reg = pPa
144e0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 70 50 61  rse->nMem+1; pPa
144f0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
14500 65 72 3b 0a 20 20 20 20 73 2e 65 6e 64 2e 72 65  er;.    s.end.re
14510 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
14520 2b 31 3b 20 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;     pParse->
14530 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20  nMem += nPeer;. 
14540 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   }..  /* Load th
14550 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
14560 66 6f 72 20 74 68 65 20 72 6f 77 20 72 65 74 75  for the row retu
14570 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  rned by the sub-
14580 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69 6e 74 6f  select.  ** into
14590 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
145a0 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
145b0 61 74 20 72 65 67 4e 65 77 2e 20 41 73 73 65 6d  at regNew. Assem
145c0 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a 20 20  ble them into.  
145d0 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 6e 20 72  ** a record in r
145e0 65 67 69 73 74 65 72 20 72 65 67 52 65 63 6f 72  egister regRecor
145f0 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 49 6e 70  d. */.  for(iInp
14600 75 74 3d 30 3b 20 69 49 6e 70 75 74 3c 6e 49 6e  ut=0; iInput<nIn
14610 70 75 74 3b 20 69 49 6e 70 75 74 2b 2b 29 7b 0a  put; iInput++){.
14620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14630 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
14640 6d 6e 2c 20 63 73 72 49 6e 70 75 74 2c 20 69 49  mn, csrInput, iI
14650 6e 70 75 74 2c 20 72 65 67 4e 65 77 2b 69 49 6e  nput, regNew+iIn
14660 70 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  put);.  }.  sqli
14670 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14680 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
14690 72 65 67 4e 65 77 2c 20 6e 49 6e 70 75 74 2c 20  regNew, nInput, 
146a0 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f  regRecord);..  /
146b0 2a 20 41 6e 20 69 6e 70 75 74 20 72 6f 77 20 68  * An input row h
146c0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 65 61  as just been rea
146d0 64 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  d into an array 
146e0 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61  of registers sta
146f0 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 72 65  rting.  ** at re
14700 67 4e 65 77 2e 20 49 66 20 74 68 65 20 77 69 6e  gNew. If the win
14710 64 6f 77 20 68 61 73 20 61 20 50 41 52 54 49 54  dow has a PARTIT
14720 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74 68 69 73  ION clause, this
14730 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74 65 73   block generates
14740 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64 65 20 74   .  ** VM code t
14750 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 69  o check if the i
14760 6e 70 75 74 20 72 6f 77 20 69 73 20 74 68 65 20  nput row is the 
14770 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70  start of a new p
14780 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  artition..  ** I
14790 66 20 73 6f 2c 20 69 74 20 64 6f 65 73 20 61 6e  f so, it does an
147a0 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 61 6e 20   OP_Gosub to an 
147b0 61 64 64 72 65 73 73 20 74 6f 20 62 65 20 66 69  address to be fi
147c0 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72 2e 20 54  lled in later. T
147d0 68 65 0a 20 20 2a 2a 20 61 64 64 72 65 73 73 20  he.  ** address 
147e0 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73 75 62 20  of the OP_Gosub 
147f0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6c 6f 63  is stored in loc
14800 61 6c 20 76 61 72 69 61 62 6c 65 20 61 64 64 72  al variable addr
14810 47 6f 73 75 62 46 6c 75 73 68 2e 20 2a 2f 0a 20  GosubFlush. */. 
14820 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72   if( pMWin->pPar
14830 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  tition ){.    in
14840 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70 72  t addr;.    Expr
14850 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
14860 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
14870 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d  .    int nPart =
14880 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b 0a 20   pPart->nExpr;. 
14890 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72     int regNewPar
148a0 74 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d 57  t = regNew + pMW
148b0 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a  in->nBufferCol;.
148c0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
148d0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
148e0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
148f0 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  st(pParse, pPart
14900 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 72 65  , 0, 0);..    re
14910 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70  gFlushPart = ++p
14920 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
14930 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14940 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14950 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
14960 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
14970 61 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20 20 20  art, nPart);.   
14980 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
14990 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
149a0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
149b0 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
149c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
149d0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
149e0 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b  addr+4, addr+2);
149f0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
14a00 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 61 64  eEqNe(v);.    ad
14a10 64 72 47 6f 73 75 62 46 6c 75 73 68 20 3d 20 73  drGosubFlush = s
14a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14a30 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
14a40 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20  gFlushPart);.   
14a50 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
14a60 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72   "call flush_par
14a70 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20 20 73  tition"));.    s
14a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14a90 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
14aa0 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
14ab0 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31  regPart, nPart-1
14ac0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  );.  }..  /* Ins
14ad0 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
14ae0 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  into the ephemer
14af0 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  al table */.  sq
14b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14b10 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
14b20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77  csrWrite, regRow
14b30 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
14b40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
14b50 6e 73 65 72 74 2c 20 63 73 72 57 72 69 74 65 2c  nsert, csrWrite,
14b60 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52   regRecord, regR
14b70 6f 77 69 64 29 3b 0a 20 20 61 64 64 72 4e 65 20  owid);.  addrNe 
14b80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14b90 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 70 4d  Op3(v, OP_Ne, pM
14ba0 57 69 6e 2d 3e 72 65 67 4f 6e 65 2c 20 30 2c 20  Win->regOne, 0, 
14bb0 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56 64 62  regRowid);.  Vdb
14bc0 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
14bd0 6c 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ll(v);..  /* Thi
14be0 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66  s block is run f
14bf0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  or the first row
14c00 20 6f 66 20 65 61 63 68 20 70 61 72 74 69 74 69   of each partiti
14c10 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67  on */.  s.regArg
14c20 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63   = windowInitAcc
14c30 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  um(pParse, pMWin
14c40 29 3b 0a 0a 20 20 69 66 28 20 72 65 67 53 74 61  );..  if( regSta
14c50 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
14c60 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
14c70 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c  , pMWin->pStart,
14c80 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20   regStart);.    
14c90 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65  windowCheckValue
14ca0 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61 72  (pParse, regStar
14cb0 74 2c 20 30 20 2b 20 28 70 4d 57 69 6e 2d 3e 65  t, 0 + (pMWin->e
14cc0 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  FrmType==TK_RANG
14cd0 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d  E ? 3 : 0));.  }
14ce0 0a 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b  .  if( regEnd ){
14cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
14d00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57  Code(pParse, pMW
14d10 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64  in->pEnd, regEnd
14d20 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
14d30 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  ckValue(pParse, 
14d40 72 65 67 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57  regEnd, 1 + (pMW
14d50 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b  in->eFrmType==TK
14d60 5f 52 41 4e 47 45 20 3f 20 33 20 3a 20 30 29 29  _RANGE ? 3 : 0))
14d70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
14d80 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 70 4d 57 69  in->eStart==pMWi
14d90 6e 2d 3e 65 45 6e 64 20 26 26 20 72 65 67 53 74  n->eEnd && regSt
14da0 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  art ){.    int o
14db0 70 20 3d 20 28 28 70 4d 57 69 6e 2d 3e 65 53 74  p = ((pMWin->eSt
14dc0 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
14dd0 47 29 20 3f 20 4f 50 5f 47 65 20 3a 20 4f 50 5f  G) ? OP_Ge : OP_
14de0 4c 65 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Le);.    int add
14df0 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rGe = sqlite3Vdb
14e00 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
14e10 65 67 53 74 61 72 74 2c 20 30 2c 20 72 65 67 45  egStart, 0, regE
14e20 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nd);.    VdbeCov
14e30 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
14e40 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  (v, op==OP_Ge); 
14e50 2f 2a 20 4e 65 76 65 72 4e 75 6c 6c 20 62 65 63  /* NeverNull bec
14e60 61 75 73 65 20 62 6f 75 6e 64 20 3c 65 78 70 72  ause bound <expr
14e70 3e 20 2a 2f 0a 20 20 20 20 56 64 62 65 43 6f 76  > */.    VdbeCov
14e80 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
14e90 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20  (v, op==OP_Le); 
14ea0 2f 2a 20 20 20 76 61 6c 75 65 73 20 70 72 65 76  /*   values prev
14eb0 69 6f 75 73 6c 79 20 63 68 65 63 6b 65 64 20 2a  iously checked *
14ec0 2f 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46  /.    windowAggF
14ed0 69 6e 61 6c 28 26 73 2c 20 30 29 3b 0a 20 20 20  inal(&s, 0);.   
14ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ef0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
14f00 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20   s.current.csr, 
14f10 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
14f20 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
14f30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74  );.    windowRet
14f40 75 72 6e 4f 6e 65 52 6f 77 28 26 73 29 3b 0a 20  urnOneRow(&s);. 
14f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14f60 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
14f70 53 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e  Sorter, s.curren
14f80 74 2e 63 73 72 29 3b 0a 20 20 20 20 73 71 6c 69  t.csr);.    sqli
14f90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14fa0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c   OP_Goto, 0, lbl
14fb0 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 20 20 73  WhereEnd);.    s
14fc0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14fd0 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20  re(v, addrGe);. 
14fe0 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
14ff0 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
15000 57 49 4e 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65  WING && pMWin->e
15010 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47  FrmType!=TK_RANG
15020 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b 0a 20  E && regEnd ){. 
15030 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
15040 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
15050 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69  WING );.    sqli
15060 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15070 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65   OP_Subtract, re
15080 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20  gStart, regEnd, 
15090 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a  regStart);.  }..
150a0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
150b0 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
150c0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
150d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
150e0 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61 72 74  _Rewind, s.start
150f0 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20 20 56 64  .csr, 1);.    Vd
15100 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
15110 61 6b 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 73  aken(v);.  }.  s
15120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15130 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73  (v, OP_Rewind, s
15140 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 31 29  .current.csr, 1)
15150 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
15160 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20  NeverTaken(v);. 
15170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15180 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
15190 20 73 2e 65 6e 64 2e 63 73 72 2c 20 31 29 3b 0a   s.end.csr, 1);.
151a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
151b0 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 69  verTaken(v);.  i
151c0 66 28 20 72 65 67 50 65 65 72 20 26 26 20 70 4f  f( regPeer && pO
151d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
151e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
151f0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
15200 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
15210 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
15220 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
15230 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15240 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20  _Copy, regPeer, 
15250 73 2e 73 74 61 72 74 2e 72 65 67 2c 20 70 4f 72  s.start.reg, pOr
15260 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
15270 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15280 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
15290 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 63 75  y, regPeer, s.cu
152a0 72 72 65 6e 74 2e 72 65 67 2c 20 70 4f 72 64 65  rrent.reg, pOrde
152b0 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  rBy->nExpr-1);. 
152c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152d0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
152e0 20 72 65 67 50 65 65 72 2c 20 73 2e 65 6e 64 2e   regPeer, s.end.
152f0 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  reg, pOrderBy->n
15300 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Expr-1);.  }..  
15310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15320 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15330 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 0a   lblWhereEnd);..
15340 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15350 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65 29  pHere(v, addrNe)
15360 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e  ;..  /* Beginnin
15370 67 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 65  g of the block e
15380 78 65 63 75 74 65 64 20 66 6f 72 20 74 68 65 20  xecuted for the 
15390 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
153a0 71 75 65 6e 74 20 72 6f 77 73 2e 20 2a 2f 0a 20  quent rows. */. 
153b0 20 69 66 28 20 72 65 67 50 65 65 72 20 29 7b 0a   if( regPeer ){.
153c0 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65 77 50      windowIfNewP
153d0 65 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  eer(pParse, pOrd
153e0 65 72 42 79 2c 20 72 65 67 4e 65 77 50 65 65 72  erBy, regNewPeer
153f0 2c 20 72 65 67 50 65 65 72 2c 20 6c 62 6c 57 68  , regPeer, lblWh
15400 65 72 65 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 69  ereEnd);.  }.  i
15410 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
15420 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
15430 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  {.    windowCode
15440 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15450 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20  GSTEP, 0, 0);.  
15460 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
15470 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d!=TK_UNBOUNDED 
15480 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  ){.      if( pMW
15490 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b  in->eFrmType==TK
154a0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
154b0 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
154c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
154d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
154e0 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
154f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15500 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15510 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61      windowCodeRa
15520 6e 67 65 54 65 73 74 28 26 73 2c 20 4f 50 5f 47  ngeTest(&s, OP_G
15530 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  e, s.current.csr
15540 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e  , regEnd, s.end.
15550 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  csr, lbl);.     
15560 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15570 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15580 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
15590 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e   0);.        win
155a0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
155b0 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
155c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
155d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
155e0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
155f0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
15600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15610 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
15620 62 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  bl);.      }else
15630 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  {.        window
15640 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15650 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65  W_RETURN_ROW, re
15660 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  gEnd, 0);.      
15670 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15680 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
15690 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
156a0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
156b0 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  }.  }else.  if( 
156c0 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
156d0 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
156e0 20 69 6e 74 20 62 52 50 53 20 3d 20 28 70 4d 57   int bRPS = (pMW
156f0 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
15700 52 45 43 45 44 49 4e 47 20 26 26 20 70 4d 57 69  RECEDING && pMWi
15710 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f  n->eFrmType==TK_
15720 52 41 4e 47 45 29 3b 0a 20 20 20 20 77 69 6e 64  RANGE);.    wind
15730 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15740 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72 65 67  DOW_AGGSTEP, reg
15750 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  End, 0);.    if(
15760 20 62 52 50 53 20 29 20 77 69 6e 64 6f 77 43 6f   bRPS ) windowCo
15770 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15780 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
15790 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 77 69  tart, 0);.    wi
157a0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
157b0 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
157c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
157d0 20 21 62 52 50 53 20 29 20 77 69 6e 64 6f 77 43   !bRPS ) windowC
157e0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
157f0 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
15800 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  Start, 0);.  }el
15810 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  se{.    int addr
15820 20 3d 20 30 3b 0a 20 20 20 20 77 69 6e 64 6f 77   = 0;.    window
15830 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15840 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29  W_AGGSTEP, 0, 0)
15850 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
15860 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd!=TK_UNBOUN
15870 44 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DED ){.      if(
15880 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
15890 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
158a0 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
158b0 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  0;.        addr 
158c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
158d0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
158e0 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
158f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 62 6c  ){.          lbl
15900 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15910 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
15920 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f  .          windo
15930 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 26  wCodeRangeTest(&
15940 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72  s, OP_Ge, s.curr
15950 65 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c  ent.csr, regEnd,
15960 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29   s.end.csr, lbl)
15970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15980 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
15990 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
159a0 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20  RN_ROW, 0, 0);. 
159b0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
159c0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
159d0 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
159e0 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  art, 0);.       
159f0 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
15a00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15a10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15a20 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
15a30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15a40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15a50 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
15a60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15a70 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e{.        if( r
15a80 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  egEnd ){.       
15a90 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
15aa0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15ab0 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
15ac0 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
15ad0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
15ae0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15af0 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
15b00 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
15b10 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a  URN_ROW, 0, 0);.
15b20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
15b30 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15b40 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
15b50 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
15b60 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 20 73    if( regEnd ) s
15b70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15b80 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
15b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15ba0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
15bb0 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f 70 20  main input loop 
15bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
15bd0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15be0 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20  lblWhereEnd);.  
15bf0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
15c00 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 46  pWInfo);..  /* F
15c10 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
15c20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72   if( pMWin->pPar
15c30 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 61 64  tition ){.    ad
15c40 64 72 49 6e 74 65 67 65 72 20 3d 20 73 71 6c 69  drInteger = sqli
15c50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15c60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
15c70 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
15c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15c90 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
15ca0 73 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a  subFlush);.  }..
15cb0 20 20 61 64 64 72 45 6d 70 74 79 20 3d 20 73 71    addrEmpty = sq
15cc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15cd0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73  v, OP_Rewind, cs
15ce0 72 57 72 69 74 65 29 3b 0a 20 20 56 64 62 65 43  rWrite);.  VdbeC
15cf0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66  overage(v);.  if
15d00 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
15d10 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20  K_PRECEDING ){. 
15d20 20 20 20 69 6e 74 20 62 52 50 53 20 3d 20 28 70     int bRPS = (p
15d30 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
15d40 5f 50 52 45 43 45 44 49 4e 47 20 26 26 20 70 4d  _PRECEDING && pM
15d50 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54  Win->eFrmType==T
15d60 4b 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 77 69  K_RANGE);.    wi
15d70 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15d80 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72  INDOW_AGGSTEP, r
15d90 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 69  egEnd, 0);.    i
15da0 66 28 20 62 52 50 53 20 29 20 77 69 6e 64 6f 77  f( bRPS ) window
15db0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15dc0 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
15dd0 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
15de0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
15df0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
15e00 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c  OW, 0, 0);.  }el
15e10 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  se if( pMWin->eS
15e20 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
15e30 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  NG ){.    int ad
15e40 64 72 53 74 61 72 74 3b 0a 20 20 20 20 69 6e 74  drStart;.    int
15e50 20 61 64 64 72 42 72 65 61 6b 31 3b 0a 20 20 20   addrBreak1;.   
15e60 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 32 3b   int addrBreak2;
15e70 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65  .    int addrBre
15e80 61 6b 33 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43  ak3;.    windowC
15e90 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15ea0 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b  _AGGSTEP, 0, 0);
15eb0 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
15ec0 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  eFrmType==TK_RAN
15ed0 47 45 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  GE ){.      addr
15ee0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15ef0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15f00 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
15f10 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak2 = windowCode
15f20 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15f30 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
15f40 72 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64  rt, 1);.      ad
15f50 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f  drBreak1 = windo
15f60 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15f70 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
15f80 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  , 1);.    }else.
15f90 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
15fa0 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
15fb0 44 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53  D ){.      addrS
15fc0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
15fd0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15fe0 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
15ff0 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k1 = windowCodeO
16000 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
16010 55 52 4e 5f 52 4f 57 2c 20 72 65 67 53 74 61 72  URN_ROW, regStar
16020 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64  t, 1);.      add
16030 72 42 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77  rBreak2 = window
16040 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
16050 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 30 2c  W_AGGINVERSE, 0,
16060 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
16070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
16080 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
16090 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 20  LLOWING );.     
160a0 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c   addrStart = sql
160b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
160c0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64  ddr(v);.      ad
160d0 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f  drBreak1 = windo
160e0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
160f0 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72  OW_RETURN_ROW, r
16100 65 67 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20  egEnd, 1);.     
16110 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69   addrBreak2 = wi
16120 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
16130 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
16140 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a  , regStart, 1);.
16150 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16170 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
16180 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
16190 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
161a0 2c 20 61 64 64 72 42 72 65 61 6b 32 29 3b 0a 20  , addrBreak2);. 
161b0 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
161c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
161d0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 61 64  tAddr(v);.    ad
161e0 64 72 42 72 65 61 6b 33 20 3d 20 77 69 6e 64 6f  drBreak3 = windo
161f0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
16200 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
16210 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
16220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16230 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
16240 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
16250 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
16260 2c 20 61 64 64 72 42 72 65 61 6b 31 29 3b 0a 20  , addrBreak1);. 
16270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16280 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
16290 65 61 6b 33 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eak3);.  }else{.
162a0 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61      int addrBrea
162b0 6b 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  k;.    int addrS
162c0 74 61 72 74 3b 0a 20 20 20 20 77 69 6e 64 6f 77  tart;.    window
162d0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
162e0 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29  W_AGGSTEP, 0, 0)
162f0 3b 0a 20 20 20 20 61 64 64 72 53 74 61 72 74 20  ;.    addrStart 
16300 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16310 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
16320 20 61 64 64 72 42 72 65 61 6b 20 3d 20 77 69 6e   addrBreak = win
16330 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
16340 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
16350 20 30 2c 20 31 29 3b 0a 20 20 20 20 77 69 6e 64   0, 1);.    wind
16360 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
16370 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
16380 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
16390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
163b0 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
163c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
163d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
163e0 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  eak);.  }.  sqli
163f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16400 76 2c 20 61 64 64 72 45 6d 70 74 79 29 3b 0a 0a  v, addrEmpty);..
16410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16420 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
16430 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74  orter, s.current
16440 2e 63 73 72 29 3b 0a 20 20 69 66 28 20 70 4d 57  .csr);.  if( pMW
16450 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
16460 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  {.    if( pMWin-
16470 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29  >regStartRowid )
16480 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
16490 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
164a0 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69  Integer, 1, pMWi
164b0 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
164c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
164d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
164e0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57  _Integer, 0, pMW
164f0 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 29  in->regEndRowid)
16500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16510 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
16520 76 2c 20 61 64 64 72 49 6e 74 65 67 65 72 2c 20  v, addrInteger, 
16530 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16540 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
16550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16560 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
16570 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
16580 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
16590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
165a0 4f 57 46 55 4e 43 20 2a 2f 0a                    OWFUNC */.