/ Hex Artifact Content
Login

Artifact 0519e5a03ebbcf22ab692410d4b25f28cc2d0e4e37e6288ca1eb0820276d67ba:


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 2f 2a 0a 2a  liteInt.h"../*.*
0190: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
01a0: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e   of built-in win
01b0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 6f 77  dow function row
01c0: 5f 6e 75 6d 62 65 72 28 29 2e 20 41 73 73 75 6d  _number(). Assum
01d0: 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 77  es that the.** w
01e0: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
01f0: 62 65 65 6e 20 63 6f 65 72 63 65 64 20 74 6f 3a  been coerced to:
0200: 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45  .**.**   ROWS BE
0210: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
0220: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
0230: 52 52 45 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61  RRENT ROW.*/.sta
0240: 74 69 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d  tic void row_num
0250: 62 65 72 53 74 65 70 46 75 6e 63 28 0a 20 20 73  berStepFunc(.  s
0260: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0270: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
0280: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
0290: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
02a0: 69 36 34 20 2a 70 20 3d 20 28 69 36 34 2a 29 73  i64 *p = (i64*)s
02b0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
02c0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
02d0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
02e0: 28 20 70 20 29 20 28 2a 70 29 2b 2b 3b 0a 7d 0a  ( p ) (*p)++;.}.
02f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
0300: 6e 75 6d 62 65 72 49 6e 76 65 72 73 65 46 75 6e  numberInverseFun
0310: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
0320: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
0330: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
0340: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
0350: 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  .){.}.static voi
0360: 64 20 72 6f 77 5f 6e 75 6d 62 65 72 56 61 6c 75  d row_numberValu
0370: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
0380: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
0390: 69 36 34 20 2a 70 20 3d 20 28 69 36 34 2a 29 73  i64 *p = (i64*)s
03a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
03b0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
03c0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 73 71  izeof(*p));.  sq
03d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
03e0: 36 34 28 70 43 74 78 2c 20 28 70 20 3f 20 2a 70  64(pCtx, (p ? *p
03f0: 20 3a 20 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : 0));.}../*.**
0400: 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
0410: 74 79 70 65 20 75 73 65 64 20 62 79 20 72 61 6e  type used by ran
0420: 6b 28 29 20 61 6e 64 20 64 65 6e 73 65 5f 72 61  k() and dense_ra
0430: 6e 6b 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  nk()..*/.struct 
0440: 43 61 6c 6c 43 6f 75 6e 74 20 7b 0a 20 20 69 36  CallCount {.  i6
0450: 34 20 6e 56 61 6c 75 65 3b 0a 20 20 69 36 34 20  4 nValue;.  i64 
0460: 6e 53 74 65 70 3b 0a 20 20 69 36 34 20 6e 54 6f  nStep;.  i64 nTo
0470: 74 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  tal;.};../*.** I
0480: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0490: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
04a0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 6e 73 65 5f   function dense_
04b0: 72 61 6e 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  rank()..*/.stati
04c0: 63 20 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e  c void dense_ran
04d0: 6b 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c  kStepFunc(.  sql
04e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
04f0: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
0500: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
0510: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74   **apArg.){.  st
0520: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a  ruct CallCount *
0530: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
0540: 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69   CallCount*)sqli
0550: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
0560: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
0570: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
0580: 20 29 20 70 2d 3e 6e 53 74 65 70 20 3d 20 31 3b   ) p->nStep = 1;
0590: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  .}.static void d
05a0: 65 6e 73 65 5f 72 61 6e 6b 49 6e 76 65 72 73 65  ense_rankInverse
05b0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
05c0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
05d0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
05e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
05f0: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
0600: 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 56  void dense_rankV
0610: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
0620: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
0630: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
0640: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
0650: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
0660: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
0670: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
0680: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
0690: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
06a0: 20 70 2d 3e 6e 53 74 65 70 20 29 7b 0a 20 20 20   p->nStep ){.   
06b0: 20 20 20 70 2d 3e 6e 56 61 6c 75 65 2b 2b 3b 0a     p->nValue++;.
06c0: 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
06d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
06e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
06f0: 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e 56 61 6c  64(pCtx, p->nVal
0700: 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ue);.  }.}../*.*
0710: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
0720: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e   of built-in win
0730: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e  dow function ran
0740: 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  k()..*/.static v
0750: 6f 69 64 20 72 61 6e 6b 53 74 65 70 46 75 6e 63  oid rankStepFunc
0760: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
0770: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
0780: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
0790: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
07a0: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
07b0: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
07c0: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
07d0: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
07e0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
07f0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
0800: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
0810: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
0820: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
0830: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
0840: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
0850: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
0860: 63 20 76 6f 69 64 20 72 61 6e 6b 49 6e 76 65 72  c void rankInver
0870: 73 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  seFunc(.  sqlite
0880: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
0890: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
08a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
08b0: 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69  apArg.){.}.stati
08c0: 63 20 76 6f 69 64 20 72 61 6e 6b 56 61 6c 75 65  c void rankValue
08d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
08e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
08f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
0900: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
0910: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
0920: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
0930: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
0940: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
0950: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
0960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
0970: 74 78 2c 20 70 2d 3e 6e 56 61 6c 75 65 29 3b 0a  tx, p->nValue);.
0980: 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20      p->nValue = 
0990: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
09a0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
09b0: 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  f built-in windo
09c0: 77 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 63 65  w function perce
09d0: 6e 74 5f 72 61 6e 6b 28 29 2e 0a 2a 2f 0a 73 74  nt_rank()..*/.st
09e0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
09f0: 74 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a  t_rankStepFunc(.
0a00: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0a10: 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  t *pCtx, .  int 
0a20: 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nArg,.  sqlite3_
0a30: 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b  value **apArg.){
0a40: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
0a50: 75 6e 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  unt *p;.  assert
0a60: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20  ( nArg==1 );..  
0a70: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
0a80: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
0a90: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
0aa0: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
0ab0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
0ac0: 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c     if( p->nTotal
0ad0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
0ae0: 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74 65 33  nTotal = sqlite3
0af0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 41  _value_int64(apA
0b00: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[0]);.    }.  
0b10: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
0b20: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
0b30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
0b40: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
0b50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
0b60: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
0b70: 74 5f 72 61 6e 6b 49 6e 76 65 72 73 65 46 75 6e  t_rankInverseFun
0b80: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
0b90: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
0ba0: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
0bb0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
0bc0: 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  .){.}.static voi
0bd0: 64 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61  d percent_rankVa
0be0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
0bf0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
0c00: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
0c10: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
0c20: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
0c30: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
0c40: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
0c50: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
0c60: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
0c70: 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b 0a 20  p->nTotal>1 ){. 
0c80: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
0c90: 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 56 61 6c  (double)(p->nVal
0ca0: 75 65 2d 31 29 20 2f 20 28 64 6f 75 62 6c 65 29  ue-1) / (double)
0cb0: 28 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20  (p->nTotal-1);. 
0cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
0cd0: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
0ce0: 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r);.    }else{.
0cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
0d00: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
0d10: 2c 20 31 30 30 2e 30 29 3b 0a 20 20 20 20 7d 0a  , 100.0);.    }.
0d20: 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20      p->nValue = 
0d30: 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
0d40: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53   void cume_distS
0d50: 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  tepFunc(.  sqlit
0d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
0d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
0d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
0da0: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b  ct CallCount *p;
0db0: 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d  .  assert( nArg=
0dc0: 3d 31 20 29 3b 0a 0a 20 20 70 20 3d 20 28 73 74  =1 );..  p = (st
0dd0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
0de0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
0df0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
0e00: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
0e10: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
0e20: 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a  p->nTotal==0 ){.
0e30: 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20        p->nTotal 
0e40: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
0e50: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
0e60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53  .    }.    p->nS
0e70: 74 65 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tep++;.  }.}.sta
0e80: 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69  tic void cume_di
0e90: 73 74 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20  stInverseFunc(. 
0ea0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
0eb0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
0ec0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
0ed0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
0ee0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 75  }.static void cu
0ef0: 6d 65 5f 64 69 73 74 56 61 6c 75 65 46 75 6e 63  me_distValueFunc
0f00: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
0f10: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
0f20: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
0f30: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
0f40: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
0f50: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
0f60: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
0f70: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
0f80: 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20  .    double r = 
0f90: 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74 65  (double)(p->nSte
0fa0: 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d  p) / (double)(p-
0fb0: 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73 71  >nTotal);.    sq
0fc0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
0fd0: 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20  ble(pCtx, r);.  
0fe0: 7d 0a 7d 0a 0a 73 74 72 75 63 74 20 4e 74 69 6c  }.}..struct Ntil
0ff0: 65 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 54 6f  eCtx {.  i64 nTo
1000: 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
1010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
1020: 6c 20 72 6f 77 73 20 69 6e 20 70 61 72 74 69 74  l rows in partit
1030: 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 50 61  ion */.  i64 nPa
1040: 72 61 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ram;            
1050: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 61           /* Para
1060: 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
1070: 6e 74 69 6c 65 28 4e 29 20 2a 2f 0a 20 20 69 36  ntile(N) */.  i6
1080: 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a0: 20 43 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   Current row */.
10b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  };../*.** Implem
10c0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6e 74 69 6c  entation of ntil
10d0: 65 28 29 2e 20 54 68 69 73 20 61 73 73 75 6d 65  e(). This assume
10e0: 73 20 74 68 61 74 20 74 68 65 20 77 69 6e 64 6f  s that the windo
10f0: 77 20 66 72 61 6d 65 20 68 61 73 0a 2a 2a 20 62  w frame has.** b
1100: 65 65 6e 20 63 6f 65 72 63 65 64 20 74 6f 3a 0a  een coerced to:.
1110: 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 55 4e 42  **.**   ROWS UNB
1120: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
1130: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
1140: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1150: 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 28 0a 20  ntileStepFunc(. 
1160: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1170: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1180: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1190: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
11a0: 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74    struct NtileCt
11b0: 78 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  x *p;.  assert( 
11c0: 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 70 20 3d  nArg==2 );.  p =
11d0: 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74   (struct NtileCt
11e0: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
11f0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
1200: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
1210: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
1220: 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20  f( p->nTotal==0 
1230: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72  ){.      p->nPar
1240: 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  am = sqlite3_val
1250: 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30  ue_int64(apArg[0
1260: 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f  ]);.      p->nTo
1270: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1280: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1290: 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
12a0: 2d 3e 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20  ->nParam<=0 ){. 
12b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
12c0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20  esult_error(.   
12d0: 20 20 20 20 20 20 20 20 20 70 43 74 78 2c 20 22           pCtx, "
12e0: 61 72 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c  argument of ntil
12f0: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69  e must be a posi
1300: 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d  tive integer", -
1310: 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  1.        );.   
1320: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1330: 2d 3e 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a  ->iRow++;.  }.}.
1340: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c  static void ntil
1350: 65 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20 20  eInverseFunc(.  
1360: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1370: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
1380: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1390: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d  lue **apArg.){.}
13a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74 69  .static void nti
13b0: 6c 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  leValueFunc(sqli
13c0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
13d0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 69  x){.  struct Nti
13e0: 6c 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  leCtx *p;.  p = 
13f0: 28 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78  (struct NtileCtx
1400: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1410: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1420: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1430: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 50 61   if( p && p->nPa
1440: 72 61 6d 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  ram>0 ){.    int
1450: 20 6e 53 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f   nSize = (p->nTo
1460: 74 61 6c 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29  tal / p->nParam)
1470: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3d  ;.    if( nSize=
1480: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1490: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
14a0: 28 70 43 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b  (pCtx, p->iRow);
14b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14c0: 20 20 69 36 34 20 6e 4c 61 72 67 65 20 3d 20 70    i64 nLarge = p
14d0: 2d 3e 6e 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50  ->nTotal - p->nP
14e0: 61 72 61 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20  aram*nSize;.    
14f0: 20 20 69 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e    i64 iSmall = n
1500: 4c 61 72 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b  Large*(nSize+1);
1510: 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 20  .      i64 iRow 
1520: 3d 20 70 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20  = p->iRow-1;..  
1530: 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 4c 61      assert( (nLa
1540: 72 67 65 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20  rge*(nSize+1) + 
1550: 28 70 2d 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67  (p->nParam-nLarg
1560: 65 29 2a 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54  e)*nSize)==p->nT
1570: 6f 74 61 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69  otal );..      i
1580: 66 28 20 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29  f( iRow<iSmall )
1590: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15a0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
15b0: 43 74 78 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e  Ctx, 1 + iRow/(n
15c0: 53 69 7a 65 2b 31 29 29 3b 0a 20 20 20 20 20 20  Size+1));.      
15d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
15e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
15f0: 74 36 34 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c  t64(pCtx, 1 + nL
1600: 61 72 67 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d  arge + (iRow-iSm
1610: 61 6c 6c 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20  all)/nSize);.   
1620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1630: 0a 0a 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c  ..struct LastVal
1640: 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69 74 65  ueCtx {.  sqlite
1650: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
1660: 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f   int nVal;.};../
1670: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1680: 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75  ion of last_valu
1690: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
16a0: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 53 74  oid last_valueSt
16b0: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
16c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
16d0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
16e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
16f0: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
1700: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
1710: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
1720: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 29   LastValueCtx *)
1730: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1740: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
1750: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1760: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
1770: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
1780: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
1790: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
17a0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
17b0: 5d 29 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 2b  ]);.    p->nVal+
17c0: 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  +;.  }.}.static 
17d0: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
17e0: 6e 76 65 72 73 65 46 75 6e 63 28 0a 20 20 73 71  nverseFunc(.  sq
17f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1800: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
1810: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1820: 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73  e **apArg.){.  s
1830: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
1840: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1850: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
1860: 78 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  x *)sqlite3_aggr
1870: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1880: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1890: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
18a0: 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69  p->nVal--;.    i
18b0: 66 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b  f( p->nVal==0 ){
18c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
18d0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
18e0: 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61  l);.      p->pVa
18f0: 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
1900: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1910: 61 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75  ast_valueValueFu
1920: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
1930: 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72  xt *pCtx){.  str
1940: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
1950: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
1960: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
1970: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1980: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1990: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
19a0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61   if( p && p->pVa
19b0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
19c0: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43  _result_value(pC
19d0: 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20  tx, p->pVal);.  
19e0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
19f0: 6c 61 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  last_valueFinali
1a00: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
1a10: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
1a20: 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75   struct LastValu
1a30: 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28  eCtx *p;.  p = (
1a40: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
1a50: 43 74 78 20 2a 29 73 71 6c 69 74 65 33 5f 61 67  Ctx *)sqlite3_ag
1a60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1a70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1a80: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
1a90: 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  >pVal ){.    sql
1aa0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
1ab0: 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29  e(pCtx, p->pVal)
1ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
1ad0: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
1ae0: 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d  );.    p->pVal =
1af0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
1b00: 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65  c void nth_value
1b10: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
1b20: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
1b30: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
1b40: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1b50: 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61  **apArg.){.}.sta
1b60: 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c  tic void nth_val
1b70: 75 65 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20  ueInverseFunc(. 
1b80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1b90: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1ba0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1bb0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1bc0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  }.static void nt
1bd0: 68 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e 63  h_valueValueFunc
1be0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1bf0: 20 2a 70 43 74 78 29 7b 0a 7d 0a 0a 73 74 61 74   *pCtx){.}..stat
1c00: 69 63 20 76 6f 69 64 20 66 69 72 73 74 5f 76 61  ic void first_va
1c10: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c30: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c40: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c50: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a  ue **apArg.){.}.
1c60: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 72 73  static void firs
1c70: 74 5f 76 61 6c 75 65 49 6e 76 65 72 73 65 46 75  t_valueInverseFu
1c80: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
1c90: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
1ca0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
1cb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
1cc0: 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  g.){.}.static vo
1cd0: 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65 56 61  id first_valueVa
1ce0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
1cf0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
1d00: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  }..static void l
1d10: 65 61 64 53 74 65 70 46 75 6e 63 28 0a 20 20 73  eadStepFunc(.  s
1d20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1d30: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1d40: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1d50: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a  ue **apArg.){.}.
1d60: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61 64  static void lead
1d70: 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20 20 73  InverseFunc(.  s
1d80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1d90: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1da0: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1db0: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a  ue **apArg.){.}.
1dc0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61 64  static void lead
1dd0: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
1de0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
1df0: 7b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  {.}..static void
1e00: 20 6c 61 67 53 74 65 70 46 75 6e 63 28 0a 20 20   lagStepFunc(.  
1e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e20: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
1e30: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1e40: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d  lue **apArg.){.}
1e50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 67  .static void lag
1e60: 49 6e 76 65 72 73 65 46 75 6e 63 28 0a 20 20 73  InverseFunc(.  s
1e70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1e80: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1e90: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1ea0: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a  ue **apArg.){.}.
1eb0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 67 56  static void lagV
1ec0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
1ed0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
1ee0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  .}..#define WIND
1ef0: 4f 57 46 55 4e 43 28 6e 61 6d 65 2c 6e 41 72 67  OWFUNC(name,nArg
1f00: 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20  ,extra) {       
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f30: 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45  .  nArg, (SQLITE
1f40: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8|SQLITE_FUN
1f50: 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c  C_WINDOW|extra),
1f60: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f80: 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63  name ## StepFunc
1f90: 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46  , name ## ValueF
1fa0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
1fb0: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
1fc0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d           \.  nam
1fd0: 65 20 23 23 20 49 6e 76 65 72 73 65 46 75 6e 63  e ## InverseFunc
1fe0: 2c 20 23 6e 61 6d 65 20 20 20 20 20 20 20 20 20  , #name         
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69        \.}..#defi
2020: 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 46 28 6e  ne WINDOWFUNCF(n
2030: 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29 20  ame,nArg,extra) 
2040: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20        \.  nArg, 
2070: 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c  (SQLITE_UTF8|SQL
2080: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c  ITE_FUNC_WINDOW|
2090: 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20  extra), 0, 0,   
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53     \.  name ## S
20c0: 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  tepFunc, name ##
20d0: 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20 6e   FinalizeFunc, n
20e0: 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63  ame ## ValueFunc
20f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2100: 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76 65  \.  name ## Inve
2110: 72 73 65 46 75 6e 63 2c 20 23 6e 61 6d 65 20 20  rseFunc, #name  
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
2150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
2160: 20 74 68 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20   those built-in 
2170: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
2180: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 6c   that are not al
2190: 73 6f 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  so aggregates..*
21a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
21b0: 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f  ndowFunctions(vo
21c0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 46 75  id){.  static Fu
21d0: 6e 63 44 65 66 20 61 57 69 6e 64 6f 77 46 75 6e  ncDef aWindowFun
21e0: 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e  cs[] = {.    WIN
21f0: 44 4f 57 46 55 4e 43 28 72 6f 77 5f 6e 75 6d 62  DOWFUNC(row_numb
2200: 65 72 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57  er, 0, 0),.    W
2210: 49 4e 44 4f 57 46 55 4e 43 28 64 65 6e 73 65 5f  INDOWFUNC(dense_
2220: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
2230: 20 57 49 4e 44 4f 57 46 55 4e 43 28 72 61 6e 6b   WINDOWFUNC(rank
2240: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
2250: 44 4f 57 46 55 4e 43 28 70 65 72 63 65 6e 74 5f  DOWFUNC(percent_
2260: 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45 5f  rank, 0, SQLITE_
2270: 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
2280: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
2290: 43 28 63 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20  C(cume_dist, 0, 
22a0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
22b0: 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57 49  OW_SIZE),.    WI
22c0: 4e 44 4f 57 46 55 4e 43 28 6e 74 69 6c 65 2c 20  NDOWFUNC(ntile, 
22d0: 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57  1, SQLITE_FUNC_W
22e0: 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20  INDOW_SIZE),.   
22f0: 20 57 49 4e 44 4f 57 46 55 4e 43 46 28 6c 61 73   WINDOWFUNCF(las
2300: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
2310: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6e      WINDOWFUNC(n
2320: 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30 29 2c  th_value, 2, 0),
2330: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  .    WINDOWFUNC(
2340: 66 69 72 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20  first_value, 1, 
2350: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
2360: 4e 43 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c 20  NC(lead, 1, 0), 
2370: 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64 2c  WINDOWFUNC(lead,
2380: 20 32 2c 20 30 29 2c 20 57 49 4e 44 4f 57 46 55   2, 0), WINDOWFU
2390: 4e 43 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c 0a  NC(lead, 3, 0),.
23a0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c      WINDOWFUNC(l
23b0: 61 67 2c 20 31 2c 20 30 29 2c 20 20 57 49 4e 44  ag, 1, 0),  WIND
23c0: 4f 57 46 55 4e 43 28 6c 61 67 2c 20 32 2c 20 30  OWFUNC(lag, 2, 0
23d0: 29 2c 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c  ),  WINDOWFUNC(l
23e0: 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d 3b 0a  ag, 3, 0),.  };.
23f0: 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42    sqlite3InsertB
2400: 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57 69 6e  uiltinFuncs(aWin
2410: 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61 79 53  dowFuncs, ArrayS
2420: 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e 63 73  ize(aWindowFuncs
2430: 29 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ));.}..void sqli
2440: 74 65 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28  te3WindowUpdate(
2450: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2460: 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69  , .  Window *pLi
2470: 73 74 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70  st, .  Window *p
2480: 57 69 6e 2c 20 0a 20 20 46 75 6e 63 44 65 66 20  Win, .  FuncDef 
2490: 2a 70 46 75 6e 63 0a 29 7b 0a 20 20 69 66 28 20  *pFunc.){.  if( 
24a0: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pWin->zName ){. 
24b0: 20 20 20 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20     Window *p;.  
24c0: 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
24d0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69 6e 29  ; p=p->pNextWin)
24e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
24f0: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
2500: 61 6d 65 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  ame, pWin->zName
2510: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2520: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 3d 3d 30    }.    if( p==0
2530: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2540: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2550: 2c 20 22 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f  , "no such windo
2560: 77 3a 20 25 73 22 2c 20 70 57 69 6e 2d 3e 7a 4e  w: %s", pWin->zN
2570: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2580: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  rn;.    }.    pW
2590: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d  in->pPartition =
25a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25b0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
25c0: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30  p->pPartition, 0
25d0: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72  );.    pWin->pOr
25e0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
25f0: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
2600: 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
2610: 42 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  By, 0);.    pWin
2620: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
2630: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
2640: 2d 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c  ->db, p->pStart,
2650: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70   0);.    pWin->p
2660: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70  End = sqlite3Exp
2670: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
2680: 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20   p->pEnd, 0);.  
2690: 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d    pWin->eStart =
26a0: 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20   p->eStart;.    
26b0: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pWin->eEnd = p->
26c0: 65 45 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eEnd;.  }.  if( 
26d0: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
26e0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57   & SQLITE_FUNC_W
26f0: 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c  INDOW ){.    sql
2700: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2710: 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70  e->db;.    if( p
2720: 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a  Win->pFilter ){.
2730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2740: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
2750: 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45 52           "FILTER
2760: 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79   clause may only
2770: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 67   be used with ag
2780: 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66  gregate window f
2790: 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20 20 20  unctions".      
27a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  );.    }else.   
27b0: 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75   if( pFunc->xSFu
27c0: 6e 63 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 53 74  nc==row_numberSt
27d0: 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63 2d  epFunc || pFunc-
27e0: 3e 78 53 46 75 6e 63 3d 3d 6e 74 69 6c 65 53 74  >xSFunc==ntileSt
27f0: 65 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  epFunc ){.      
2800: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2810: 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61  e(db, pWin->pSta
2820: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
2830: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
2840: 20 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20   pWin->pEnd);.  
2850: 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74      pWin->pStart
2860: 20 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20   = pWin->pEnd = 
2870: 30 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65  0;.      pWin->e
2880: 54 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53 3b 0a  Type = TK_ROWS;.
2890: 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61        pWin->eSta
28a0: 72 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  rt = TK_UNBOUNDE
28b0: 44 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65  D;.      pWin->e
28c0: 45 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54  End = TK_CURRENT
28d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
28e0: 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75   if( pFunc->xSFu
28f0: 6e 63 3d 3d 64 65 6e 73 65 5f 72 61 6e 6b 53 74  nc==dense_rankSt
2900: 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63 2d  epFunc || pFunc-
2910: 3e 78 53 46 75 6e 63 3d 3d 72 61 6e 6b 53 74 65  >xSFunc==rankSte
2920: 70 46 75 6e 63 0a 20 20 20 20 20 7c 7c 20 70 46  pFunc.     || pF
2930: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 70 65 72  unc->xSFunc==per
2940: 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46 75 6e  cent_rankStepFun
2950: 63 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75  c || pFunc->xSFu
2960: 6e 63 3d 3d 63 75 6d 65 5f 64 69 73 74 53 74 65  nc==cume_distSte
2970: 70 46 75 6e 63 0a 20 20 20 20 29 7b 0a 20 20 20  pFunc.    ){.   
2980: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2990: 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70  lete(db, pWin->p
29a0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
29b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
29c0: 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 3b  db, pWin->pEnd);
29d0: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74  .      pWin->pSt
29e0: 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70 45 6e 64  art = pWin->pEnd
29f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 69 6e   = 0;.      pWin
2a00: 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e  ->eType = TK_RAN
2a10: 47 45 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  GE;.      pWin->
2a20: 65 53 74 61 72 74 20 3d 20 54 4b 5f 55 4e 42 4f  eStart = TK_UNBO
2a30: 55 4e 44 45 44 3b 0a 20 20 20 20 20 20 70 57 69  UNDED;.      pWi
2a40: 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f 43 55 52  n->eEnd = TK_CUR
2a50: 52 45 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RENT;.    }.  }.
2a60: 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
2a70: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
2a80: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b 0a 73  WindowRewrite;.s
2a90: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
2aa0: 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ite {.  Window *
2ab0: 70 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  pWin;.  ExprList
2ac0: 20 2a 70 53 75 62 3b 0a 7d 3b 0a 0a 73 74 61 74   *pSub;.};..stat
2ad0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e  ic int selectWin
2ae0: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
2af0: 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  Cb(Walker *pWalk
2b00: 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
2b10: 65 63 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 57  ect){.  return W
2b20: 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 73 74 61  RC_Prune;.}..sta
2b30: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69  tic int selectWi
2b40: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
2b50: 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
2b60: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2b70: 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  .  struct Window
2b80: 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61  Rewrite *p = pWa
2b90: 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65  lker->u.pRewrite
2ba0: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
2bb0: 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
2bc0: 72 73 65 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  rse;..  switch( 
2bd0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20  pExpr->op ){..  
2be0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
2bf0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45  ON:.      if( pE
2c00: 78 70 72 2d 3e 70 57 69 6e 3d 3d 30 20 29 7b 0a  xpr->pWin==0 ){.
2c10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c30: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
2c40: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 57  ;.        for(pW
2c50: 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e  in=p->pWin; pWin
2c60: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
2c70: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
2c80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69    if( pExpr->pWi
2c90: 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  n==pWin ){.     
2ca0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 57         pExpr->pW
2cb0: 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 45 78  in->pOwner = pEx
2cc0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
2cd0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d00: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
2d10: 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20 20  rough.  */..    
2d20: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
2d30: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
2d40: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
2d50: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
2d60: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
2d70: 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74   p->pSub = sqlit
2d80: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2d90: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62  (pParse, p->pSub
2da0: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
2db0: 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20  f( p->pSub ){.  
2dc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
2dd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2de0: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d  xpr, EP_Static)=
2df0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  =0 );.        Ex
2e00: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2e10: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
2e20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e30: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
2e40: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
2e50: 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
2e60: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2e70: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
2e80: 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72      memset(pExpr
2e90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
2ea0: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ));..        pEx
2eb0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
2ec0: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  MN;.        pExp
2ed0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  r->iColumn = p->
2ee0: 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  pSub->nExpr-1;. 
2ef0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2f00: 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e  able = p->pWin->
2f10: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d  iEphCsr;.      }
2f20: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
2f30: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
2f40: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
2f60: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2f70: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 73 74 61 74 69  ntinue;.}..stati
2f80: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
2f90: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 0a  owRewriteEList(.
2fa0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2fb0: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e   .  Window *pWin
2fc0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
2fd0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
2fe0: 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65 20 65      /* Rewrite e
2ff0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
3000: 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70  is list */.  Exp
3010: 72 4c 69 73 74 20 2a 2a 70 70 53 75 62 20 20 20  rList **ppSub   
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3030: 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65  IN/OUT: Sub-sele
3040: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ct expression-li
3050: 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  st */.){.  Walke
3060: 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e  r sWalker;.  Win
3070: 64 6f 77 52 65 77 72 69 74 65 20 73 52 65 77 72  dowRewrite sRewr
3080: 69 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ite;.  int rc;..
3090: 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65    memset(&sWalke
30a0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61 6c  r, 0, sizeof(Wal
30b0: 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ker));.  memset(
30c0: 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73 69  &sRewrite, 0, si
30d0: 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72 69  zeof(WindowRewri
30e0: 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69 74  te));..  sRewrit
30f0: 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62 3b  e.pSub = *ppSub;
3100: 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69 6e  .  sRewrite.pWin
3110: 20 3d 20 70 57 69 6e 3b 0a 0a 20 20 73 57 61 6c   = pWin;..  sWal
3120: 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61  ker.pParse = pPa
3130: 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rse;.  sWalker.x
3140: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
3150: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
3160: 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c  teExprCb;.  sWal
3170: 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
3180: 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64  ack = selectWind
3190: 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43  owRewriteSelectC
31a0: 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  b;.  sWalker.u.p
31b0: 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77 72  Rewrite = &sRewr
31c0: 69 74 65 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ite;..  rc = sql
31d0: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
31e0: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73  (&sWalker, pELis
31f0: 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20  t);..  *ppSub = 
3200: 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a 20  sRewrite.pSub;. 
3210: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
3220: 74 61 74 69 63 20 45 78 70 72 4c 69 73 74 20 2a  tatic ExprList *
3230: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
3240: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3250: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
3260: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3270: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3280: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
3290: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
32a0: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
32b0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
32c0: 72 4c 69 73 74 20 2a 70 41 70 70 65 6e 64 20 20  rList *pAppend  
32d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
32e0: 76 61 6c 75 65 73 20 74 6f 20 61 70 70 65 6e 64  values to append
32f0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
3300: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 41 70 70  */.){.  if( pApp
3310: 65 6e 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  end ){.    int i
3320: 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 69 74 20  ;.    int nInit 
3330: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
3340: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
3350: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 70 70 65  for(i=0; i<pAppe
3360: 6e 64 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  nd->nExpr; i++){
3370: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
3380: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
3390: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
33a0: 41 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78  Append->a[i].pEx
33b0: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c  pr, 0);.      pL
33c0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
33d0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
33e0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
33f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
3400: 74 20 29 20 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e  t ) pList->a[nIn
3410: 69 74 2b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  it+i].sortOrder 
3420: 3d 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e  = pAppend->a[i].
3430: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
3440: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
3450: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ist;.}../*.** If
3460: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
3470: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
3480: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
3490: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76  ent does not inv
34a0: 6f 6b 65 0a 2a 2a 20 61 6e 79 20 53 51 4c 20 77  oke.** any SQL w
34b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2c  indow functions,
34c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34d0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
34e0: 77 69 73 65 2c 20 69 74 20 0a 2a 2a 20 72 65 77  wise, it .** rew
34f0: 72 69 74 65 73 20 74 68 65 20 53 45 4c 45 43 54  rites the SELECT
3500: 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
3510: 61 74 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  at window functi
3520: 6f 6e 20 78 53 74 65 70 20 66 75 6e 63 74 69 6f  on xStep functio
3530: 6e 73 0a 2a 2a 20 61 72 65 20 69 6e 76 6f 6b 65  ns.** are invoke
3540: 64 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  d in the correct
3550: 20 6f 72 64 65 72 2e 20 54 68 65 20 73 69 6d 70   order. The simp
3560: 6c 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  lest version of 
3570: 74 68 65 20 0a 2a 2a 20 74 72 61 6e 73 66 6f 72  the .** transfor
3580: 6d 61 74 69 6f 6e 20 69 73 3a 0a 2a 2a 0a 2a 2a  mation is:.**.**
3590: 20 20 20 53 45 4c 45 43 54 20 77 69 6e 28 61 72     SELECT win(ar
35a0: 67 73 2e 2e 2e 29 20 4f 56 45 52 20 28 3c 6c 69  gs...) OVER (<li
35b0: 73 74 31 3e 29 20 46 52 4f 4d 20 3c 73 72 63 3e  st1>) FROM <src>
35c0: 20 4f 52 44 45 52 20 42 59 20 3c 6c 69 73 74 32   ORDER BY <list2
35d0: 3e 0a 2a 2a 0a 2a 2a 20 74 6f 0a 2a 2a 0a 2a 2a  >.**.** to.**.**
35e0: 20 20 20 53 45 4c 45 43 54 20 77 69 6e 28 61 72     SELECT win(ar
35f0: 67 73 2e 2e 2e 29 20 46 52 4f 4d 20 28 0a 2a 2a  gs...) FROM (.**
3600: 20 20 20 20 20 53 45 4c 45 43 54 20 61 72 67 73       SELECT args
3610: 2e 2e 2e 20 46 52 4f 4d 20 3c 73 72 63 3e 20 4f  ... FROM <src> O
3620: 52 44 45 52 20 42 59 20 3c 6c 69 73 74 31 3e 0a  RDER BY <list1>.
3630: 2a 2a 20 20 20 29 20 4f 52 44 45 52 20 42 59 20  **   ) ORDER BY 
3640: 3c 6c 69 73 74 32 3e 0a 2a 2a 0a 2a 2a 20 77 68  <list2>.**.** wh
3650: 65 72 65 20 3c 73 72 63 3e 20 6d 61 79 20 63 6f  ere <src> may co
3660: 6e 74 61 69 6e 20 57 48 45 52 45 2c 20 47 52 4f  ntain WHERE, GRO
3670: 55 50 20 42 59 20 61 6e 64 20 48 41 56 49 4e 47  UP BY and HAVING
3680: 20 63 6c 61 75 73 65 73 2c 20 61 6e 64 20 3c 6c   clauses, and <l
3690: 69 73 74 31 3e 0a 2a 2a 20 69 73 20 74 68 65 20  ist1>.** is the 
36a0: 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66  concatenation of
36b0: 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20 42   the PARTITION B
36c0: 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63  Y and ORDER BY c
36d0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 0a 2a 2a  lauses in the.**
36e0: 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 0a 2a 2a   OVER clause..**
36f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
3700: 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50 61 72  indowRewrite(Par
3710: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
3720: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ct *p){.  int rc
3730: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3740: 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20  if( p->pWin ){. 
3750: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
3760: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
3770: 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  se);.    int i;.
3780: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
3790: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
37a0: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
37b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
37c0: 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
37d0: 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
37e0: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
37f0: 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65      Expr *pWhere
3800: 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
3810: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
3820: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
3830: 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 48  By;.    Expr *pH
3840: 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
3850: 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ng;.    ExprList
3860: 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20 20   *pSort = 0;..  
3870: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62    ExprList *pSub
3880: 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  list = 0;       
3890: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
38a0: 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65 72 79  st for sub-query
38b0: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
38c0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
38d0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20        /* Master 
38e0: 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a 2f  window object */
38f0: 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  .    Window *pWi
3900: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3910: 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62 6a     /* Window obj
3920: 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  ect iterator */.
3930: 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
3940: 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
3950: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  = 0;.    p->pGro
3960: 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  upBy = 0;.    p-
3970: 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a 20  >pHaving = 0;.. 
3980: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63     /* Assign a c
3990: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
39a0: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
39b0: 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66  able used to buf
39c0: 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a  fer rows..    **
39d0: 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   The OpenEphemer
39e0: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  al instruction i
39f0: 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61  s coded later, a
3a00: 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e  fter it is known
3a10: 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   how.    ** many
3a20: 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62   columns the tab
3a30: 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a  le will have.  *
3a40: 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70  /.    pMWin->iEp
3a50: 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  hCsr = pParse->n
3a60: 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 72 63 20 3d  Tab++;..    rc =
3a70: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
3a80: 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
3a90: 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 45 4c 69  , pMWin, p->pELi
3aa0: 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a  st, &pSublist);.
3ab0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
3ac0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
3ad0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
3ae0: 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
3af0: 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 4f 72 64  , pMWin, p->pOrd
3b00: 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74 29  erBy, &pSublist)
3b10: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
3b20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4d  eturn rc;.    pM
3b30: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20  Win->nBufferCol 
3b40: 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
3b50: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
3b60: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
3b70: 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  te the ORDER BY 
3b80: 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 73  clause for the s
3b90: 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20  ub-select. This 
3ba0: 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  is the concatena
3bb0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tion.    ** of t
3bc0: 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49 54  he window PARTIT
3bd0: 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
3be0: 20 63 6c 61 75 73 65 73 2e 20 41 70 70 65 6e 64   clauses. Append
3bf0: 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a   the same .    *
3c00: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  * expressions to
3c10: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
3c20: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
3c30: 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72   They are requir
3c40: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 66 69 67  ed to.    ** fig
3c50: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 62 6f  ure out where bo
3c60: 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70 61 72  undaries for par
3c70: 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73  titions and sets
3c80: 20 6f 66 20 70 65 65 72 20 72 6f 77 73 2e 20 20   of peer rows.  
3c90: 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20 73  */.    pSort = s
3ca0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3cb0: 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61  p(db, pMWin->pPa
3cc0: 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
3cd0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f 72 64   if( pMWin->pOrd
3ce0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70 53  erBy ){.      pS
3cf0: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
3d00: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
3d10: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
3d20: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a  OrderBy);.    }.
3d30: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65      pSublist = e
3d40: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73  xprListAppendLis
3d50: 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69  t(pParse, pSubli
3d60: 73 74 2c 20 70 53 6f 72 74 29 3b 0a 0a 20 20 20  st, pSort);..   
3d70: 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 61   /* Append the a
3d80: 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
3d90: 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  to each window f
3da0: 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a 20  unction to the. 
3db0: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
3dc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3dd0: 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  . Also allocate 
3de0: 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66 6f  two registers fo
3df0: 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77 69  r each.    ** wi
3e00: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d 20  ndow function - 
3e10: 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63 75  one for the accu
3e20: 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65 72  mulator, another
3e30: 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20 20   for interim.   
3e40: 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f   ** results.  */
3e50: 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  .    for(pWin=pM
3e60: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
3e70: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
3e80: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41 72  .      pWin->iAr
3e90: 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74  gCol = (pSublist
3ea0: 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78   ? pSublist->nEx
3eb0: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  pr : 0);.      p
3ec0: 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69  Sublist = exprLi
3ed0: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
3ee0: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
3ef0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
3f00: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  List);.      if(
3f10: 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29   pWin->pFilter )
3f20: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
3f30: 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65  pFilter = sqlite
3f40: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 69  3ExprDup(db, pWi
3f50: 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a  n->pFilter, 0);.
3f60: 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73 74          pSublist
3f70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
3f80: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
3f90: 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c 74   pSublist, pFilt
3fa0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
3fb0: 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75     pWin->regAccu
3fc0: 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
3fd0: 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  em;.      pWin->
3fe0: 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70 50  regResult = ++pP
3ff0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
4000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4010: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
4020: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
4030: 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  m);.    }..    p
4040: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sub = sqlite3Sel
4050: 65 63 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20  ectNew(.        
4060: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
4070: 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20  , pSrc, pWhere, 
4080: 70 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e  pGroupBy, pHavin
4090: 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20  g, pSort, 0, 0. 
40a0: 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72     );.    p->pSr
40b0: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
40c0: 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
40d0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
40e0: 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->pSrc ){.      
40f0: 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 20 20  int iTab;.      
4100: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
4110: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53  = 0;.      p->pS
4120: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
4130: 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20 73   = pSub;.      s
4140: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
4150: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
4160: 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20  e, p->pSrc);.   
4170: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
4180: 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61  pandSubquery(pPa
4190: 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e 61  rse, &p->pSrc->a
41a0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
41b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
41c0: 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
41d0: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65          pSub->se
41e0: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
41f0: 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  anded;.      }. 
4200: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
4210: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4220: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
4230: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
4240: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
4250: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
4260: 20 72 63 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c   rc;.}..void sql
4270: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
4280: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
4290: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndow *p){.  if( 
42a0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
42b0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
42c0: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
42d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
42e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
42f0: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
4300: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
4310: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
4320: 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
4330: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4340: 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71  p->pEnd);.    sq
4350: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4360: 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a  db, p->pStart);.
4370: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4380: 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  e(db, p->zName);
4390: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
43a0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
43b0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  ..void sqlite3Wi
43c0: 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 73  ndowListDelete(s
43d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
43e0: 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ow *p){.  while(
43f0: 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77   p ){.    Window
4400: 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65   *pNext = p->pNe
4410: 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  xtWin;.    sqlit
4420: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64  e3WindowDelete(d
4430: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
4440: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 57 69 6e  Next;.  }.}..Win
4450: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
4460: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
4470: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74   *pParse, .  int
4480: 20 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 65 53   eType,.  int eS
4490: 74 61 72 74 2c 20 45 78 70 72 20 2a 70 53 74 61  tart, Expr *pSta
44a0: 72 74 2c 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20  rt,.  int eEnd, 
44b0: 45 78 70 72 20 2a 70 45 6e 64 0a 29 7b 0a 20 20  Expr *pEnd.){.  
44c0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 28  Window *pWin = (
44d0: 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33 44  Window*)sqlite3D
44e0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
44f0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 57  se->db, sizeof(W
4500: 69 6e 64 6f 77 29 29 3b 0a 0a 20 20 69 66 28 20  indow));..  if( 
4510: 70 57 69 6e 20 29 7b 0a 20 20 20 20 70 57 69 6e  pWin ){.    pWin
4520: 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b  ->eType = eType;
4530: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72  .    pWin->eStar
4540: 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 20 20  t = eStart;.    
4550: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e  pWin->eEnd = eEn
4560: 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e  d;.    pWin->pEn
4570: 64 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 70 57  d = pEnd;.    pW
4580: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 53 74  in->pStart = pSt
4590: 61 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  art;.  }else{.  
45a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
45b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
45c0: 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pEnd);.    sqlit
45d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
45e0: 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29  rse->db, pStart)
45f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4600: 70 57 69 6e 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  pWin;.}..void sq
4610: 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61 63  lite3WindowAttac
4620: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
4630: 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f 77   Expr *p, Window
4640: 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20 70   *pWin){.  if( p
4650: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 69 6e 20   ){.    p->pWin 
4660: 3d 20 70 57 69 6e 3b 0a 20 20 7d 65 6c 73 65 7b  = pWin;.  }else{
4670: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64  .    sqlite3Wind
4680: 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  owDelete(pParse-
4690: 3e 64 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a  >db, pWin);.  }.
46a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
46b0: 30 20 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e  0 if the two win
46c0: 64 6f 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20  dow objects are 
46d0: 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f  identical, or no
46e0: 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65  n-zero otherwise
46f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4700: 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 50 61  WindowCompare(Pa
4710: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e  rse *pParse, Win
4720: 64 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20  dow *p1, Window 
4730: 2a 70 32 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e  *p2){.  if( p1->
4740: 65 54 79 70 65 21 3d 70 32 2d 3e 65 54 79 70 65  eType!=p2->eType
4750: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
4760: 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d 70  f( p1->eStart!=p
4770: 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74 75  2->eStart ) retu
4780: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
4790: 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29  eEnd!=p2->eEnd )
47a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
47b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
47c0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e  are(pParse, p1->
47d0: 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53 74 61  pStart, p2->pSta
47e0: 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  rt, -1) ) return
47f0: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
4800: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
4810: 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70  rse, p1->pEnd, p
4820: 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20 72  2->pEnd, -1) ) r
4830: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
4840: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
4850: 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72 74 69  mpare(p1->pParti
4860: 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69  tion, p2->pParti
4870: 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74 75  tion, -1) ) retu
4880: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
4890: 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
48a0: 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c  re(p1->pOrderBy,
48b0: 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d   p2->pOrderBy, -
48c0: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
48d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
48e0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
48f0: 41 67 67 49 6e 69 74 28 50 61 72 73 65 20 2a 70  AggInit(Parse *p
4900: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
4910: 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20  MWin){.  Window 
4920: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
4930: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
4940: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
4950: 69 6e 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  in){.    Vdbe *v
4960: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
4970: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 46  e(pParse);.    F
4980: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
4990: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
49a0: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
49b0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
49c0: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
49d0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
49e0: 45 44 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  ED ){.      Expr
49f0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57  List *pList = pW
4a00: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
4a10: 69 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ist;.      KeyIn
4a20: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
4a30: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
4a40: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
4a50: 2c 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  , pList, 0, 0);.
4a60: 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41        pWin->csrA
4a70: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  pp = pParse->nTa
4a80: 62 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  b++;.      pWin-
4a90: 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65  >regApp = pParse
4aa0: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
4ab0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
4ac0: 33 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  3;.      if( pKe
4ad0: 79 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70  yInfo && pWin->p
4ae0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d  Func->zName[1]==
4af0: 27 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61  'i' ){.        a
4b00: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
4b10: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d  >aSortOrder[0]==
4b20: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  0 );.        pKe
4b30: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4b40: 72 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20  r[0] = 1;.      
4b50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4b60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4b70: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
4b80: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b  Win->csrApp, 2);
4b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4ba0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b  beAppendP4(v, pK
4bb0: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
4bc0: 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  FO);.      sqlit
4bd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4be0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
4bf0: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
4c00: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
4c10: 66 28 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74  f( p->xSFunc==nt
4c20: 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20  h_valueStepFunc 
4c30: 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 66 69  || p->xSFunc==fi
4c40: 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  rst_valueStepFun
4c50: 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  c ){.      /* Al
4c60: 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73  locate two regis
4c70: 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72 65  ters at pWin->re
4c80: 67 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c 6c  gApp. These will
4c90: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20 20   be used to.    
4ca0: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 73    ** store the s
4cb0: 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e 64  tart and end ind
4cc0: 65 78 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ex of the curren
4cd0: 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20  t frame.  */.   
4ce0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
4cf0: 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20  ->iEphCsr );.   
4d00: 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20     pWin->regApp 
4d10: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4d20: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73  ;.      pWin->cs
4d30: 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rApp = pParse->n
4d40: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Tab++;.      pPa
4d50: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
4d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
4d80: 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72  enDup, pWin->csr
4d90: 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  App, pMWin->iEph
4da0: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Csr);.    }.    
4db0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 53 46 75  else if( p->xSFu
4dc0: 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63  nc==leadStepFunc
4dd0: 20 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6c   || p->xSFunc==l
4de0: 61 67 53 74 65 70 46 75 6e 63 20 29 7b 0a 20 20  agStepFunc ){.  
4df0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
4e00: 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20  n->iEphCsr );.  
4e10: 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70      pWin->csrApp
4e20: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
4e30: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
4e40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4e50: 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e  _OpenDup, pWin->
4e60: 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69  csrApp, pMWin->i
4e70: 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  EphCsr);.    }. 
4e80: 20 7d 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74   }.}..void sqlit
4e90: 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74  e3WindowCodeInit
4ea0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4eb0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20  Window *pWin){. 
4ec0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
4ed0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
4ee0: 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72 74 20 3d  );.  int nPart =
4ef0: 20 28 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   (pWin->pPartiti
4f00: 6f 6e 20 3f 20 70 57 69 6e 2d 3e 70 50 61 72 74  on ? pWin->pPart
4f10: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20 30  ition->nExpr : 0
4f20: 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20 28 70  );.  nPart += (p
4f30: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20  Win->pOrderBy ? 
4f40: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  pWin->pOrderBy->
4f50: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 69 66  nExpr : 0);.  if
4f60: 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20 20 70  ( nPart ){.    p
4f70: 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20 70  Win->regPart = p
4f80: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
4f90: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4fa0: 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20 73 71  += nPart;.    sq
4fb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fc0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
4fd0: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 57  Win->regPart, pW
4fe0: 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61 72  in->regPart+nPar
4ff0: 74 2d 31 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 64  t-1);.  }.  wind
5000: 6f 77 41 67 67 49 6e 69 74 28 70 50 61 72 73 65  owAggInit(pParse
5010: 2c 20 70 57 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74  , pWin);.}..stat
5020: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
5030: 65 63 6b 46 72 61 6d 65 56 61 6c 75 65 28 50 61  eckFrameValue(Pa
5040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
5050: 20 72 65 67 2c 20 69 6e 74 20 62 45 6e 64 29 7b   reg, int bEnd){
5060: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5070: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
5080: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
5090: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
50a0: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
50b0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
50c0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
50d0: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
50e0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
50f0: 74 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20 56 64  teger".  };.  Vd
5100: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
5110: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
5120: 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20    int regZero = 
5130: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
5140: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5150: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
5160: 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b  er, 0, regZero);
5170: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5180: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
5190: 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74  eInt, reg, sqlit
51a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
51b0: 72 28 76 29 2b 32 29 3b 0a 20 20 73 71 6c 69 74  r(v)+2);.  sqlit
51c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
51d0: 4f 50 5f 47 65 2c 20 72 65 67 5a 65 72 6f 2c 20  OP_Ge, regZero, 
51e0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
51f0: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
5200: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5210: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
5220: 74 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  t, SQLITE_ERROR,
5230: 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71   OE_Abort);.  sq
5240: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
5250: 34 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72  4(v, (void*)azEr
5260: 72 5b 62 45 6e 64 5d 2c 20 50 34 5f 53 54 41 54  r[bEnd], P4_STAT
5270: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  IC);.}../*.** Ge
5280: 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74  nerate VM code t
5290: 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20  o invoke either 
52a0: 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e 76  xStep() (if bInv
52b0: 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a  erse is 0) or .*
52c0: 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20 62  * xInverse (if b
52d0: 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a  Inverse is non-z
52e0: 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69  ero) for each wi
52f0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
5300: 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
5310: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
5320: 20 70 4d 57 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   pMWin..*/.stati
5330: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67  c void windowAgg
5340: 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
5350: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
5360: 20 2a 70 4d 57 69 6e 2c 20 0a 20 20 69 6e 74 20   *pMWin, .  int 
5370: 63 73 72 2c 0a 20 20 69 6e 74 20 62 49 6e 76 65  csr,.  int bInve
5380: 72 73 65 2c 20 0a 20 20 69 6e 74 20 72 65 67 2c  rse, .  int reg,
5390: 0a 20 20 69 6e 74 20 72 65 67 50 61 72 74 53 69  .  int regPartSi
53a0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
53b0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63     /* Register c
53c0: 6f 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f  ontaining size o
53d0: 66 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29  f partition */.)
53e0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
53f0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5400: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
5410: 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e  pWin;.  for(pWin
5420: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
5430: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
5440: 6e 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  n){.    int flag
5450: 73 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d  s = pWin->pFunc-
5460: 3e 66 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20 20  >funcFlags;.    
5470: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20  int regArg;.    
5480: 69 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d  int nArg = pWin-
5490: 3e 6e 41 72 67 3b 0a 0a 20 20 20 20 69 66 28 20  >nArg;..    if( 
54a0: 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  csr>=0 ){.      
54b0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
54c0: 28 69 3d 30 3b 20 69 3c 70 57 69 6e 2d 3e 6e 41  (i=0; i<pWin->nA
54d0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
54e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
54f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
5500: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
5510: 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a  gCol+i, reg+i);.
5520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
5530: 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20 20 20  gArg = reg;.    
5540: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
5550: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
5560: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
5570: 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a   if( nArg==0 ){.
5580: 20 20 20 20 20 20 20 20 20 20 72 65 67 41 72 67            regArg
5590: 20 3d 20 72 65 67 50 61 72 74 53 69 7a 65 3b 0a   = regPartSize;.
55a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
55b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
55c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
55d0: 5f 53 43 6f 70 79 2c 20 72 65 67 50 61 72 74 53  _SCopy, regPartS
55e0: 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29 3b 0a  ize, reg+nArg);.
55f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5600: 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20 20 20    nArg++;.      
5610: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5620: 20 20 20 61 73 73 65 72 74 28 20 21 28 66 6c 61     assert( !(fla
5630: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5640: 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20 29 3b  _WINDOW_SIZE) );
5650: 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d 20  .      regArg = 
5660: 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41 72 67  reg + pWin->iArg
5670: 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Col;.    }..    
5680: 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63  if( (pWin->pFunc
5690: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
56a0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
56b0: 29 20 0a 20 20 20 20 20 20 26 26 20 70 57 69 6e  ) .      && pWin
56c0: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
56d0: 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20  OUNDED .    ){. 
56e0: 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73       if( bInvers
56f0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
5700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5710: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
5720: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
5730: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5740: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5750: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72   OP_SCopy, regAr
5760: 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29  g, pWin->regApp)
5770: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5780: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5790: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57  P_MakeRecord, pW
57a0: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70  in->regApp, 2, p
57b0: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
57c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
57d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
57e0: 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d  IdxInsert, pWin-
57f0: 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72  >csrApp, pWin->r
5800: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
5810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5830: 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45  Int(v, OP_SeekGE
5840: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
5850: 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20  0, regArg, 1);. 
5860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5870: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
5880: 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72  elete, pWin->csr
5890: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
58a0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
58b0: 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  e(v, sqlite3Vdbe
58c0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32  CurrentAddr(v)-2
58d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
58e0: 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72  else if( pWin->r
58f0: 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  egApp ){.      a
5900: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 46 75  ssert( pWin->pFu
5910: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f  nc->xSFunc==nth_
5920: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20  valueStepFunc . 
5930: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69            || pWi
5940: 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  n->pFunc->xSFunc
5950: 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65  ==first_valueSte
5960: 70 46 75 6e 63 20 0a 20 20 20 20 20 20 29 3b 0a  pFunc .      );.
5970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 49        assert( bI
5980: 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20 62 49 6e  nverse==0 || bIn
5990: 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20 20 20 20  verse==1 );.    
59a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
59b0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
59c0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
59d0: 2d 62 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a 20  -bInverse, 1);. 
59e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69     }else if( pWi
59f0: 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  n->pFunc->xSFunc
5a00: 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20 0a  ==leadStepFunc .
5a10: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57             || pW
5a20: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  in->pFunc->xSFun
5a30: 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e 63 20 0a  c==lagStepFunc .
5a40: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
5a50: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
5a60: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  se{.      int ad
5a70: 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  drIf = 0;.      
5a80: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
5a90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
5aa0: 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20   regTmp;.       
5ab0: 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a 20 20   if( csr>0 ){.  
5ac0: 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d          regTmp =
5ad0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5ae0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5af0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5b00: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
5b10: 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d  lumn, csr, pWin-
5b20: 3e 69 41 72 67 43 6f 6c 2b 70 57 69 6e 2d 3e 6e  >iArgCol+pWin->n
5b30: 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20  Arg,regTmp);.   
5b40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5b50: 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20 72        regTmp = r
5b60: 65 67 41 72 67 20 2b 20 70 57 69 6e 2d 3e 6e 41  egArg + pWin->nA
5b70: 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rg;.        }.  
5b80: 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73        addrIf = s
5b90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5ba0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
5bb0: 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20  gTmp, 0, 1);.   
5bc0: 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29       if( csr>0 )
5bd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5be0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5bf0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  g(pParse, regTmp
5c00: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5c10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5c20: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
5c30: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
5c40: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
5c50: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
5c60: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
5c70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5c80: 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61  xprNNCollSeq(pPa
5c90: 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  rse, pWin->pOwne
5ca0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
5cb0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
5cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5cd0: 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
5ce0: 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20  , 0,0,0, (const 
5cf0: 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  char*)pColl, P4_
5d00: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5d10: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
5d20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5d30: 41 67 67 53 74 65 70 30 2c 20 62 49 6e 76 65 72  AggStep0, bInver
5d40: 73 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  se, regArg, pWin
5d50: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
5d60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
5d70: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
5d80: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
5d90: 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
5da0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
5db0: 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
5dc0: 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73    if( addrIf ) s
5dd0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5de0: 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20  re(v, addrIf);. 
5df0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
5e00: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67  ic void windowAg
5e10: 67 46 69 6e 61 6c 28 50 61 72 73 65 20 2a 70 50  gFinal(Parse *pP
5e20: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
5e30: 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e 61 6c 29  Win, int bFinal)
5e40: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
5e50: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5e60: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
5e70: 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70 57 69  pWin;..  for(pWi
5e80: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
5e90: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
5ea0: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 28 70 57  in){.    if( (pW
5eb0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
5ec0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
5ed0: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
5ee0: 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74   && pWin->eStart
5ef0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  !=TK_UNBOUNDED .
5f00: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
5f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5f20: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
5f30: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
5f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5f50: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
5f60: 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  st, pWin->csrApp
5f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5f80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5f90: 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63  _Column, pWin->c
5fa0: 73 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e  srApp, 0, pWin->
5fb0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
5fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
5fd0: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
5fe0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5ff0: 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 69 66 28  v)-2);.      if(
6000: 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20   bFinal ){.     
6010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6020: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
6030: 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73  Sorter, pWin->cs
6040: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rApp);.      }. 
6050: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69     }else if( pWi
6060: 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20  n->regApp ){.   
6070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6080: 28 20 62 46 69 6e 61 6c 3d 3d 30 20 29 7b 0a 20  ( bFinal==0 ){. 
6090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
60a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
60b0: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
60c0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
60d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
60e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
60f0: 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e  AggFinal, pWin->
6100: 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e  regAccum, pWin->
6110: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
6120: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
6130: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
6140: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
6150: 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29      if( bFinal )
6160: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6170: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6180: 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65  P_Copy, pWin->re
6190: 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65  gAccum, pWin->re
61a0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
61b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
61c0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
61d0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
61e0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
61f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6200: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
6210: 2d 31 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  -1, pWin->regRes
6220: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
6230: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
6240: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 50 61 72  c void windowPar
6250: 74 69 74 69 6f 6e 43 61 63 68 65 28 0a 20 20 50  titionCache(.  P
6260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
6270: 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65  Select *p,.  Whe
6280: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a  reInfo *pWInfo,.
6290: 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61    int regFlushPa
62a0: 72 74 2c 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75  rt,.  int lblFlu
62b0: 73 68 50 61 72 74 2c 0a 20 20 69 6e 74 20 2a 70  shPart,.  int *p
62c0: 52 65 67 53 69 7a 65 0a 29 7b 0a 20 20 57 69 6e  RegSize.){.  Win
62d0: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
62e0: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
62f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
6300: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
6310: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20  ow *pWin;.  int 
6320: 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72  iSubCsr = p->pSr
6330: 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
6340: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
6350: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
6360: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b 3b  ->nCol;.  int k;
6370: 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ..  int reg = pP
6380: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6390: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
63a0: 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
63b0: 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
63c0: 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65 67  cord+1;..  *pReg
63d0: 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69 64 3b  Size = regRowid;
63e0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
63f0: 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20  += nSub + 2;..  
6400: 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20 72  /* Martial the r
6410: 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ow returned by t
6420: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  he sub-select in
6430: 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 0a  to an array of .
6440: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e 20    ** registers. 
6450: 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
6460: 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  nSub; k++){.    
6470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6480: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6490: 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b  iSubCsr, k, reg+
64a0: 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  k);.  }.  sqlite
64b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
64c0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
64d0: 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65 63 6f  g, nSub, regReco
64e0: 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  rd);..  /* Check
64f0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
6500: 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70  start of a new p
6510: 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 73 6f 2c  artition. If so,
6520: 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66   call the.  ** f
6530: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73  lush_partition s
6540: 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20 2a 2f 0a  ub-routine.  */.
6550: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
6560: 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  rtition ){.    i
6570: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70  nt addr;.    Exp
6580: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
6590: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
65a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20  ;.    int nPart 
65b0: 3d 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74  = (pPart ? pPart
65c0: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
65d0: 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74    int regNewPart
65e0: 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e   = reg + pMWin->
65f0: 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20  nBufferCol;.    
6600: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
6610: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
6620: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
6630: 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c  Parse, pPart, 0,
6640: 20 30 29 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d   0);..    addr =
6650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6660: 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
6670: 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d  , regNewPart, pM
6680: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61  Win->regPart,nPa
6690: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
66a0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
66b0: 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
66c0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
66d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
66e0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
66f0: 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20  addr+2, addr+4, 
6700: 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 73 71 6c  addr+2);.    sql
6710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6720: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
6730: 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
6740: 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b  gPart, nPart-1);
6750: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6760: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
6770: 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
6780: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
6790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 66 66 65  .  }..  /* Buffe
67a0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
67b0: 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  w in the ephemer
67c0: 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73  al table. */.  s
67d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
67e0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
67f0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
6800: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71   regRowid);.  sq
6810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6820: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d  v, OP_Insert, pM
6830: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65  Win->iEphCsr, re
6840: 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69  gRecord, regRowi
6850: 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66  d);..  /* End of
6860: 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
6870: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
6880: 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
6890: 20 2f 2a 20 49 6e 76 6f 6b 65 20 22 66 6c 75 73   /* Invoke "flus
68a0: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 74 6f 20  h_partition" to 
68b0: 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 66 69  deal with the fi
68c0: 6e 61 6c 20 28 6f 72 20 6f 6e 6c 79 29 20 70 61  nal (or only) pa
68d0: 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  rtition */.  sql
68e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
68f0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46  , OP_Gosub, regF
6900: 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75  lushPart, lblFlu
6910: 73 68 50 61 72 74 29 3b 0a 7d 0a 0a 73 74 61 74  shPart);.}..stat
6920: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
6930: 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61  turnOneRow(.  Pa
6940: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57  rse *pParse,.  W
6950: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20  indow *pMWin,.  
6960: 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20  int regGosub,.  
6970: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
6980: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
6990: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
69a0: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
69b0: 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d  Win;.  for(pWin=
69c0: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
69d0: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
69e0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
69f0: 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46  pFunc = pWin->pF
6a00: 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75  unc;.    if( pFu
6a10: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f  nc->xSFunc==nth_
6a20: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20  valueStepFunc . 
6a30: 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53      || pFunc->xS
6a40: 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75  Func==first_valu
6a50: 65 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 29  eStepFunc .    )
6a60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72 20  {.      int csr 
6a70: 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a  = pWin->csrApp;.
6a80: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
6a90: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
6aa0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
6ab0: 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69  nt tmpReg = sqli
6ac0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6ad0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
6ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6af0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
6b00: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
6b10: 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63  .      if( pFunc
6b20: 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76 61  ->xSFunc==nth_va
6b30: 6c 75 65 53 74 65 70 46 75 6e 63 20 29 7b 0a 20  lueStepFunc ){. 
6b40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6b50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6b60: 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 69 45 70  olumn, pWin->iEp
6b70: 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67  hCsr, pWin->iArg
6b80: 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 29 3b 0a  Col+1, tmpReg);.
6b90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6bb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6bc0: 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65 67 29  eger, 1, tmpReg)
6bd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6bf0: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74 6d 70  3(v, OP_Add, tmp
6c00: 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Reg, pWin->regAp
6c10: 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  p, tmpReg);.    
6c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c30: 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 57  Op3(v, OP_Gt, pW
6c40: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c 62  in->regApp+1, lb
6c50: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
6c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c70: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
6c80: 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74  wid, csr, lbl, t
6c90: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  mpReg);.      sq
6ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6cb0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
6cc0: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
6cd0: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
6ce0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
6cf0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6d00: 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  l(v, lbl);.     
6d10: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6d20: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74  empReg(pParse, t
6d30: 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  mpReg);.    }.  
6d40: 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e 63    else if( pFunc
6d50: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74  ->xSFunc==leadSt
6d60: 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63 2d  epFunc || pFunc-
6d70: 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70  >xSFunc==lagStep
6d80: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 6e  Func ){.      in
6d90: 74 20 69 45 70 68 20 3d 20 70 57 69 6e 2d 3e 69  t iEph = pWin->i
6da0: 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69 6e  EphCsr;.      in
6db0: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
6dc0: 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rApp;.      int 
6dd0: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
6de0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
6df0: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20       int tmpReg 
6e00: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6e10: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
6e20: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 6e 41      if( pWin->nA
6e30: 72 67 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<3 ){.        
6e40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e50: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
6e60: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
6e70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6e80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6e90: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6ea0: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
6eb0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70  in->iArgCol+2, p
6ec0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
6ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6ef0: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45  (v, OP_Rowid, iE
6f00: 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  ph, tmpReg);.   
6f10: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 6e 41 72     if( pWin->nAr
6f20: 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69  g<2 ){.        i
6f30: 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d  nt val = (pFunc-
6f40: 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65  >xSFunc==leadSte
6f50: 70 46 75 6e 63 20 3f 20 31 20 3a 20 2d 31 29 3b  pFunc ? 1 : -1);
6f60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6f70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6f80: 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c  _AddImm, tmpReg,
6f90: 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c   val);.      }el
6fa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
6fb0: 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 78 53 46  op = (pFunc->xSF
6fc0: 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e  unc==leadStepFun
6fd0: 63 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f  c ? OP_Add : OP_
6fe0: 53 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20  Subtract);.     
6ff0: 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d     int tmpReg2 =
7000: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7010: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7030: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
7040: 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e  mn, iEph, pWin->
7050: 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65  iArgCol+1, tmpRe
7060: 67 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  g2);.        sql
7070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7080: 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20 74  , op, tmpReg2, t
7090: 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a  mpReg, tmpReg);.
70a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
70b0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
70c0: 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a  arse, tmpReg2);.
70d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
70e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
70f0: 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
7100: 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52  , csr, lbl, tmpR
7110: 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
7120: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7130: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
7140: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70  pWin->iArgCol, p
7150: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
7160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7170: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
7180: 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71  , lbl);.      sq
7190: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
71a0: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
71b0: 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eg);.    }.  }. 
71c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
71d0: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
71e0: 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
71f0: 73 75 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  sub);.}..static 
7200: 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72  void windowRetur
7210: 6e 52 6f 77 73 28 0a 20 20 50 61 72 73 65 20 2a  nRows(.  Parse *
7220: 70 50 61 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77  pParse,.  Window
7230: 20 2a 70 4d 57 69 6e 2c 0a 20 20 69 6e 74 20 72   *pMWin,.  int r
7240: 65 67 43 74 72 2c 0a 20 20 69 6e 74 20 62 46 69  egCtr,.  int bFi
7250: 6e 61 6c 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nal,.  int regGo
7260: 73 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72 47  sub,.  int addrG
7270: 6f 73 75 62 2c 0a 20 20 69 6e 74 20 72 65 67 49  osub,.  int regI
7280: 6e 76 41 72 67 2c 0a 20 20 69 6e 74 20 72 65 67  nvArg,.  int reg
7290: 49 6e 76 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  InvSize.){.  int
72a0: 20 61 64 64 72 3b 0a 20 20 56 64 62 65 20 2a 76   addr;.  Vdbe *v
72b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
72c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 77 69 6e  e(pParse);.  win
72d0: 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72  dowAggFinal(pPar
72e0: 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20  se, pMWin, 0);. 
72f0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
7300: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7310: 49 66 50 6f 73 2c 20 72 65 67 43 74 72 2c 20 73  IfPos, regCtr, s
7320: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
7330: 74 41 64 64 72 28 76 29 2b 32 20 2c 31 29 3b 0a  tAddr(v)+2 ,1);.
7340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7350: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
7360: 30 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77 52  0, 0);.  windowR
7370: 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72  eturnOneRow(pPar
7380: 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f  se, pMWin, regGo
7390: 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
73a0: 0a 20 20 69 66 28 20 72 65 67 49 6e 76 41 72 67  .  if( regInvArg
73b0: 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67   ){.    windowAg
73c0: 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
73d0: 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Win, pMWin->iEph
73e0: 43 73 72 2c 20 31 2c 20 72 65 67 49 6e 76 41 72  Csr, 1, regInvAr
73f0: 67 2c 20 72 65 67 49 6e 76 53 69 7a 65 29 3b 0a  g, regInvSize);.
7400: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
7410: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7420: 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  xt, pMWin->iEphC
7430: 73 72 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c  sr, addr);.  sql
7440: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
7450: 28 76 2c 20 61 64 64 72 2b 31 29 3b 20 20 20 2f  (v, addr+1);   /
7460: 2a 20 54 68 65 20 4f 50 5f 47 6f 74 6f 20 2a 2f  * The OP_Goto */
7470: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .}..static int w
7480: 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50  indowInitAccum(P
7490: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
74a0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20  ndow *pMWin){.  
74b0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
74c0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
74d0: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ;.  int regArg;.
74e0: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
74f0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
7500: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
7510: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
7520: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
7530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7540: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
7550: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
7560: 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d  m);.    nArg = M
7570: 41 58 28 6e 41 72 67 2c 20 70 57 69 6e 2d 3e 6e  AX(nArg, pWin->n
7580: 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Arg);.    if( pW
7590: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  in->pFunc->xSFun
75a0: 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70  c==nth_valueStep
75b0: 46 75 6e 63 0a 20 20 20 20 20 7c 7c 20 70 57 69  Func.     || pWi
75c0: 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  n->pFunc->xSFunc
75d0: 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65  ==first_valueSte
75e0: 70 46 75 6e 63 20 0a 20 20 20 20 29 7b 0a 20 20  pFunc .    ){.  
75f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7600: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7610: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
7620: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  gApp);.      sql
7630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7640: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7650: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29   pWin->regApp+1)
7660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7670: 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gArg = pParse->n
7680: 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d  Mem+1;.  pParse-
7690: 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20  >nMem += nArg;. 
76a0: 20 72 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a   return regArg;.
76b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 4f 57 53 20 42  }.../*.** ROWS B
76c0: 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
76d0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
76e0: 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  pr2> FOLLOWING.*
76f0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7720: 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 73 65  ------.**.** Pse
7730: 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 74 68 65  udo-code for the
7740: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
7750: 6f 66 20 74 68 69 73 20 77 69 6e 64 6f 77 20 66  of this window f
7760: 72 61 6d 65 20 74 79 70 65 20 69 73 20 61 73 0a  rame type is as.
7770: 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 73 71 6c 69  ** follows. sqli
7780: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
7790: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
77a0: 20 63 61 6c 6c 65 64 20 74 6f 20 67 65 6e 65 72   called to gener
77b0: 61 74 65 20 74 68 65 0a 2a 2a 20 74 6f 70 20 6f  ate the.** top o
77c0: 66 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20  f the main loop 
77d0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
77e0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
77f0: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 74 68  .** Each time th
7800: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
7810: 20 61 64 64 72 47 6f 73 75 62 20 69 73 20 69 6e   addrGosub is in
7820: 76 6f 6b 65 64 2c 20 61 20 73 69 6e 67 6c 65 20  voked, a single 
7830: 6f 75 74 70 75 74 0a 2a 2a 20 72 6f 77 20 69 73  output.** row is
7840: 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65 64   generated based
7850: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
7860: 72 6f 77 20 69 6e 64 69 63 61 74 65 64 20 62 79  row indicated by
7870: 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e   Window.iEphCsr.
7880: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a  .**.**     ....*
7890: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
78a0: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
78b0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
78c0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
78d0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
78e0: 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64    Insert (record
78f0: 20 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a   in eph-table).*
7900: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  *     sqlite3Whe
7910: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47  reEnd().**     G
7920: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
7930: 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66  tion.**  .**   f
7940: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
7950: 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  **     Once {.**
7960: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
7970: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 53 74  iEphCsr -> csrSt
7980: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70  art).**       Op
7990: 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d  enDup (iEphCsr -
79a0: 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20  > csrEnd).**    
79b0: 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67 53 74 61   }.**     regSta
79c0: 72 74 20 3d 20 3c 65 78 70 72 31 3e 20 20 20 20  rt = <expr1>    
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50              // P
79e0: 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
79f0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e  ion.**     regEn
7a00: 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20 20  d = <expr2>     
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
7a20: 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
7a30: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20  sion.**     if( 
7a40: 72 65 67 53 74 61 72 74 3c 30 20 7c 7c 20 72 65  regStart<0 || re
7a50: 67 45 6e 64 3c 30 20 29 7b 20 65 72 72 6f 72 21  gEnd<0 ){ error!
7a60: 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64   }.**     Rewind
7a70: 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63   (csr,csrStart,c
7a80: 73 72 45 6e 64 29 20 20 20 20 20 20 2f 2f 20 69  srEnd)      // i
7a90: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
7aa0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
7ab0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73  **       Next(cs
7ac0: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
7ad0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
7ae0: 4f 46 20 73 6b 69 70 20 41 67 67 73 74 65 70 0a  OF skip Aggstep.
7af0: 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74 65 70  **       Aggstep
7b00: 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20   (csrEnd).**    
7b10: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
7b20: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
7b30: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
7b40: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
7b50: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
7b60: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
7b70: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
7b80: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
7b90: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
7ba0: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
7bb0: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
7bc0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
7bd0: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
7be0: 63 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72  csrStart, xInver
7bf0: 73 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se).**          
7c00: 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a   Next(csrStart).
7c10: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
7c20: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75        }.**   flu
7c30: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
7c40: 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53  e:.**     ResetS
7c50: 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20  orter (csr).**  
7c60: 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20     Return.**.** 
7c70: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
7c80: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
7c90: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
7ca0: 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e  .** ROWS BETWEEN
7cb0: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20   CURRENT ROW    
7cc0: 20 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20       AND <expr> 
7cd0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57  FOLLOWING.** ROW
7ce0: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
7cf0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
7d00: 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
7d10: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65  NG.**.**   These
7d20: 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 20   are similar to 
7d30: 74 68 65 20 61 62 6f 76 65 2e 20 46 6f 72 20 22  the above. For "
7d40: 43 55 52 52 45 4e 54 20 52 4f 57 22 2c 20 69 6e  CURRENT ROW", in
7d50: 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 20  tialize the.**  
7d60: 20 72 65 67 69 73 74 65 72 20 74 6f 20 30 2e 20   register to 0. 
7d70: 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44 20 50  For "UNBOUNDED P
7d80: 52 45 43 45 44 49 4e 47 22 20 74 6f 20 69 6e 66  RECEDING" to inf
7d90: 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57  inity..**.** ROW
7da0: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e  S BETWEEN <expr>
7db0: 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e   PRECEDING    AN
7dc0: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
7dd0: 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45  OWING.** ROWS BE
7de0: 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
7df0: 57 20 20 20 20 20 20 20 20 20 41 4e 44 20 55 4e  W         AND UN
7e00: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
7e10: 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 77 69  G.**.**     Rewi
7e20: 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72 74  nd (csr,csrStart
7e30: 2c 63 73 72 45 6e 64 29 20 20 20 20 2f 2f 20 69  ,csrEnd)    // i
7e40: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
7e50: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
7e60: 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  **     while( 1 
7e70: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ){.**       Next
7e80: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
7e90: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 45 78 69            // Exi
7ea0: 74 20 77 68 69 6c 65 28 31 29 20 61 74 20 45 4f  t while(1) at EO
7eb0: 46 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74  F.**       Aggst
7ec0: 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20  ep (csrEnd).**  
7ed0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c     }.**     whil
7ee0: 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
7ef0: 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75   AggFinal (xValu
7f00: 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  e).**       Gosu
7f10: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
7f20: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
7f50: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
7f60: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  n_done.**       
7f70: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
7f80: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
7f90: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 53 74    AggStep (csrSt
7fa0: 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a  art, xInverse).*
7fb0: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
7fc0: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
7fd0: 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a    }.**     }.**.
7fe0: 2a 2a 20 20 20 46 6f 72 20 74 68 65 20 22 43 55  **   For the "CU
7ff0: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
8000: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
8010: 47 22 20 63 61 73 65 2c 20 74 68 65 20 66 69 6e  G" case, the fin
8020: 61 6c 20 69 66 28 29 20 0a 2a 2a 20 20 20 63 6f  al if() .**   co
8030: 6e 64 69 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ndition is alway
8040: 73 20 74 72 75 65 20 28 61 73 20 69 66 20 72 65  s true (as if re
8050: 67 53 74 61 72 74 20 77 65 72 65 20 69 6e 69 74  gStart were init
8060: 69 61 6c 69 7a 65 64 20 74 6f 20 30 29 2e 0a 2a  ialized to 0)..*
8070: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
8080: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
8090: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
80a0: 4c 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a 20 20 20  LOWING.** .**   
80b0: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
80c0: 20 52 41 4e 47 45 20 63 61 73 65 20 68 61 6e 64   RANGE case hand
80d0: 6c 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  led by this rout
80e0: 69 6e 65 2e 20 49 74 20 6d 6f 64 69 66 69 65 73  ine. It modifies
80f0: 20 74 68 65 0a 2a 2a 20 20 20 73 65 63 6f 6e 64   the.**   second
8100: 20 77 68 69 6c 65 28 20 31 20 29 20 6c 6f 6f 70   while( 1 ) loop
8110: 20 69 6e 20 22 52 4f 57 53 20 42 45 54 57 45 45   in "ROWS BETWEE
8120: 4e 20 43 55 52 52 45 4e 54 20 2e 2e 2e 20 55 4e  N CURRENT ... UN
8130: 42 4f 55 4e 44 45 44 2e 2e 2e 22 20 74 6f 0a 2a  BOUNDED..." to.*
8140: 2a 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  *   be:.**.**   
8150: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
8160: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
8170: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
8180: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
8190: 20 20 20 20 20 20 20 20 20 72 65 67 50 65 65 72           regPeer
81a0: 2b 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ++.**         Go
81b0: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
81c0: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
81d0: 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
81e0: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
81f0: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
8200: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
8210: 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 65        if( new pe
8220: 65 72 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20  er ) break;.**  
8230: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
8240: 77 68 69 6c 65 28 20 28 72 65 67 50 65 65 72 2d  while( (regPeer-
8250: 2d 29 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  -)>0 ){.**      
8260: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 53     AggStep (csrS
8270: 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29 0a  tart, xInverse).
8280: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
8290: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
82a0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
82b0: 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e  .** ROWS BETWEEN
82c0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
82d0: 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20  G    AND <expr> 
82e0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
82f0: 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45 6e    regEnd = regEn
8300: 64 20 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a 20  d - regStart.** 
8310: 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73    Rewind (csr,cs
8320: 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20  rStart,csrEnd)  
8330: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
8340: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
8350: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67 73  done.**     Aggs
8360: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
8370: 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29      Next(csrEnd)
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 2f 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d   // if EOF fall-
83a0: 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69  through.**     i
83b0: 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
83c0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
83d0: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
83e0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
83f0: 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
8400: 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75  .**         Gosu
8410: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
8420: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29         Next(csr)
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
8440: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
8450: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
8460: 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  e.**       }.** 
8470: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63        AggStep (c
8480: 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73  srStart, xInvers
8490: 65 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  e).**       Next
84a0: 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20   (csrStart).**  
84b0: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20     }.**.** ROWS 
84c0: 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50  BETWEEN <expr> P
84d0: 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20  RECEDING    AND 
84e0: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
84f0: 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65  .**.**   Replace
8500: 20 74 68 65 20 62 69 74 20 61 66 74 65 72 20 22   the bit after "
8510: 52 65 77 69 6e 64 22 20 69 6e 20 74 68 65 20 61  Rewind" in the a
8520: 62 6f 76 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a  bove with:.**.**
8530: 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64       if( (regEnd
8540: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
8550: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 45     AggStep (csrE
8560: 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  nd).**       Nex
8570: 74 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  t (csrEnd).**   
8580: 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46 69    }.**     AggFi
8590: 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20  nal (xValue).** 
85a0: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
85b0: 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28  sub.**     Next(
85c0: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
85d0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
85e0: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
85f0: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
8600: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
8610: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
8620: 20 41 67 67 53 74 65 70 20 28 63 73 72 32 2c 20   AggStep (csr2, 
8630: 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20 20  xInverse).**    
8640: 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a 2a     Next (csr2).*
8650: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74  *     }.**.*/.st
8660: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
8670: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
8680: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8690: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
86a0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
86b0: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
86c0: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
86d0: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
86e0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
86f0: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
8700: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
8710: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
8720: 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b   *pWin;.  int k;
8730: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
8740: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
8750: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65  ->nCol;.  int re
8760: 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  gFlushPart;     
8770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
8780: 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
8790: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
87a0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
87b0: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
87c0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
87d0: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
87e0: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
87f0: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e   int lblFlushDon
8800: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8810: 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47   /* Label for "G
8820: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
8830: 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20  tion_done" */.. 
8840: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
8850: 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 61  nt nArg;.  int a
8860: 64 64 72 3b 0a 20 20 69 6e 74 20 63 73 72 53 74  ddr;.  int csrSt
8870: 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  art = pParse->nT
8880: 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 63 73 72 45  ab++;.  int csrE
8890: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  nd = pParse->nTa
88a0: 62 2b 2b 3b 0a 20 20 69 6e 74 20 72 65 67 53 74  b++;.  int regSt
88b0: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
88c0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
88d0: 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43 45   of <expr> PRECE
88e0: 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65  DING */.  int re
88f0: 67 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  gEnd;           
8900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
8910: 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f  lue of <expr> FO
8920: 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  LLOWING */.  int
8930: 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 69 6e 74   addrNext;.  int
8940: 20 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74   addrGoto;.  int
8950: 20 61 64 64 72 54 6f 70 3b 0a 20 20 69 6e 74 20   addrTop;.  int 
8960: 61 64 64 72 49 66 50 6f 73 31 3b 0a 20 20 69 6e  addrIfPos1;.  in
8970: 74 20 61 64 64 72 49 66 50 6f 73 32 3b 0a 0a 20  t addrIfPos2;.. 
8980: 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30   int regPeer = 0
8990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
89a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
89b0: 65 65 72 73 20 69 6e 20 63 75 72 72 65 6e 74 20  eers in current 
89c0: 67 72 6f 75 70 20 2a 2f 0a 20 20 69 6e 74 20 72  group */.  int r
89d0: 65 67 50 65 65 72 56 61 6c 20 3d 20 30 3b 20 20  egPeerVal = 0;  
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
89f0: 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 69  rray of values i
8a00: 64 65 6e 74 69 66 79 69 6e 67 20 70 65 65 72 20  dentifying peer 
8a10: 67 72 6f 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69  group */.  int i
8a20: 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Peer = 0;       
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8a40: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 20 69 6e 20  olumn offset in 
8a50: 65 70 68 2d 74 61 62 6c 65 20 6f 66 20 70 65 65  eph-table of pee
8a60: 72 20 76 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  r vals */.  int 
8a70: 6e 50 65 65 72 56 61 6c 3b 20 20 20 20 20 20 20  nPeerVal;       
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a90: 4e 75 6d 62 65 72 20 6f 66 20 70 65 65 72 20 76  Number of peer v
8aa0: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  alues */.  int b
8ab0: 52 61 6e 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Range = 0;.  int
8ac0: 20 72 65 67 53 69 7a 65 20 3d 20 30 3b 0a 0a 20   regSize = 0;.. 
8ad0: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
8ae0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
8af0: 44 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20  DING .       || 
8b00: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
8b10: 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20  K_CURRENT .     
8b20: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
8b30: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
8b40: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
8b50: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
8b60: 42 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20  BOUNDED .  );.  
8b70: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
8b80: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
8b90: 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57  G .       || pMW
8ba0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
8bb0: 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  RENT .       || 
8bc0: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
8bd0: 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 20  UNBOUNDED .     
8be0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64    || pMWin->eEnd
8bf0: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
8c00: 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69    );..  if( pMWi
8c10: 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  n->eType==TK_RAN
8c20: 47 45 20 0a 20 20 20 26 26 20 70 4d 57 69 6e 2d  GE .   && pMWin-
8c30: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
8c40: 45 4e 54 20 0a 20 20 20 26 26 20 70 4d 57 69 6e  ENT .   && pMWin
8c50: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
8c60: 4e 44 45 44 0a 20 20 29 7b 0a 20 20 20 20 62 52  NDED.  ){.    bR
8c70: 61 6e 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  ange = 1;.  }.. 
8c80: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67   /* Allocate reg
8c90: 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20  ister and label 
8ca0: 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70  for the "flush_p
8cb0: 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f  artition" sub-ro
8cc0: 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46  utine. */.  regF
8cd0: 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61  lushPart = ++pPa
8ce0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c  rse->nMem;.  lbl
8cf0: 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69  FlushPart = sqli
8d00: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
8d10: 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 44  (v);.  lblFlushD
8d20: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
8d30: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
8d40: 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70    regStart = ++p
8d50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
8d60: 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  egEnd = ++pParse
8d70: 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f  ->nMem;..  windo
8d80: 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28  wPartitionCache(
8d90: 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
8da0: 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c  o, regFlushPart,
8db0: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 26   lblFlushPart, &
8dc0: 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64 64  regSize);..  add
8dd0: 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  rGoto = sqlite3V
8de0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
8df0: 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61  Goto);..  /* Sta
8e00: 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61 72  rt of "flush_par
8e10: 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c  tition" */.  sql
8e20: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8e30: 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68  abel(v, lblFlush
8e40: 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Part);.  sqlite3
8e50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8e60: 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74 65  _Once, 0, sqlite
8e70: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
8e80: 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65  (v)+3);.  sqlite
8e90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8ea0: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 53 74  P_OpenDup, csrSt
8eb0: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  art, pMWin->iEph
8ec0: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Csr);.  sqlite3V
8ed0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8ee0: 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e 64 2c  OpenDup, csrEnd,
8ef0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
8f00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74 68 65  ;..  /* If eithe
8f10: 72 20 72 65 67 53 74 61 72 74 20 6f 72 20 72 65  r regStart or re
8f20: 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e 6f 6e  gEnd are not non
8f30: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
8f40: 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a 2a 20  rs, throw .  ** 
8f50: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a  an exception.  *
8f60: 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
8f70: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Start ){.    sql
8f80: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8f90: 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61  rse, pMWin->pSta
8fa0: 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  rt, regStart);. 
8fb0: 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 46 72     windowCheckFr
8fc0: 61 6d 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ameValue(pParse,
8fd0: 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
8fe0: 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
8ff0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  pEnd ){.    sqli
9000: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9010: 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c  se, pMWin->pEnd,
9020: 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69   regEnd);.    wi
9030: 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65 56 61  ndowCheckFrameVa
9040: 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 45  lue(pParse, regE
9050: 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nd, 1);.  }..  /
9060: 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52 4f  * If this is "RO
9070: 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  WS <expr1> FOLLO
9080: 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c 65  WING AND ROWS <e
9090: 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  xpr2> FOLLOWING"
90a0: 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , do:.  **.  ** 
90b0: 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65 67    if( regEnd<reg
90c0: 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20 20  Start ){.  **   
90d0: 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20 61    // The frame a
90e0: 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20 6f  lways consists o
90f0: 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20 20  f 0 rows.  **   
9100: 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
9110: 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20  Size;.  **   }. 
9120: 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72   **   regEnd = r
9130: 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74  egEnd - regStart
9140: 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  ;.  */.  if( pMW
9150: 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69  in->pEnd && pMWi
9160: 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57  n->pStart && pMW
9170: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
9180: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
9190: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
91a0: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
91b0: 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  G );.    sqlite3
91c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
91d0: 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73  _Ge, regStart, s
91e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
91f0: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 45  tAddr(v)+2, regE
9200: 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
9210: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9220: 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c 20  _Copy, regSize, 
9230: 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 73  regStart);.    s
9240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9250: 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
9260: 20 72 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e   regStart, regEn
9270: 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a  d, regEnd);.  }.
9280: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45  .  if( pMWin->pE
9290: 6e 64 20 26 26 20 70 4d 57 69 6e 2d 3e 70 53 74  nd && pMWin->pSt
92a0: 61 72 74 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  art && pMWin->eE
92b0: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
92c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
92d0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
92e0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a 20  K_PRECEDING );. 
92f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9300: 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 65 2c 20 72  dOp3(v, OP_Le, r
9310: 65 67 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33  egStart, sqlite3
9320: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9330: 76 29 2b 33 2c 20 72 65 67 45 6e 64 29 3b 0a 20  v)+3, regEnd);. 
9340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9350: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
9360: 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74 61   regSize, regSta
9370: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
9380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9390: 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c 20  _Copy, regSize, 
93a0: 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20  regEnd);.  }..  
93b0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
93c0: 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
93d0: 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20  gister for each 
93e0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
93f0: 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67  to NULL */.  reg
9400: 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74  Arg = windowInit
9410: 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d  Accum(pParse, pM
9420: 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Win);..  sqlite3
9430: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9440: 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e  _Rewind, pMWin->
9450: 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c 75 73  iEphCsr, lblFlus
9460: 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  hDone);.  sqlite
9470: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9480: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 53 74 61  P_Rewind, csrSta
9490: 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  rt, lblFlushDone
94a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
94b0: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
94c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
94d0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
94e0: 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46 6c 75  , csrEnd, lblFlu
94f0: 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  shDone);.  sqlit
9500: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
9510: 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  , 1);..  /* Invo
9520: 6b 65 20 41 67 67 53 74 65 70 20 66 75 6e 63 74  ke AggStep funct
9530: 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ion for each win
9540: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 75 73 69  dow function usi
9550: 6e 67 20 74 68 65 20 72 6f 77 20 74 68 61 74 0a  ng the row that.
9560: 20 20 2a 2a 20 63 73 72 45 6e 64 20 63 75 72 72    ** csrEnd curr
9570: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
9580: 20 4f 72 2c 20 69 66 20 63 73 72 45 6e 64 20 69   Or, if csrEnd i
9590: 73 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46  s already at EOF
95a0: 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 68 69 6e  ,.  ** do nothin
95b0: 67 2e 20 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  g.  */.  addrTop
95c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
95d0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
95e0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
95f0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
9600: 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 31 20  .    addrIfPos1 
9610: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
9620: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
9630: 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b   regEnd, 0 , 1);
9640: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
9650: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9660: 65 78 74 2c 20 63 73 72 45 6e 64 2c 20 73 71 6c  ext, csrEnd, sql
9670: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9680: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 61 64 64  ddr(v)+2);.  add
9690: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
96a0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
96b0: 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  );.  windowAggSt
96c0: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
96d0: 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72 65 67  , csrEnd, 0, reg
96e0: 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
96f0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
9700: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
9710: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9720: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
9730: 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
9740: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9750: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
9760: 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  );.    addrTop =
9770: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
9780: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65  entAddr(v);.  }e
9790: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
97a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
97b0: 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70  addr);.    if( p
97c0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
97d0: 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
97e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
97f0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 50  pHere(v, addrIfP
9800: 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  os1);.    }.  }.
9810: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
9820: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
9830: 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f   ){.    addrIfPo
9840: 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  s1 = sqlite3Vdbe
9850: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
9860: 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20  os, regEnd, 0 , 
9870: 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  1);.  }.  if( pM
9880: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
9890: 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
98a0: 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20 73 71   addrIfPos2 = sq
98b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
98c0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
98d0: 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b 0a 20  Start, 0 , 1);. 
98e0: 20 7d 0a 20 20 69 66 28 20 62 52 61 6e 67 65 20   }.  if( bRange 
98f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9900: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
9910: 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
9920: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  n->pOrderBy );. 
9930: 20 20 20 72 65 67 50 65 65 72 20 3d 20 2b 2b 70     regPeer = ++p
9940: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
9950: 20 72 65 67 50 65 65 72 56 61 6c 20 3d 20 70 50   regPeerVal = pP
9960: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
9970: 20 20 69 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d    iPeer = pMWin-
9980: 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70  >nBufferCol + (p
9990: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
99a0: 3f 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69  ?pMWin->pPartiti
99b0: 6f 6e 2d 3e 6e 45 78 70 72 3a 30 29 3b 0a 20 20  on->nExpr:0);.  
99c0: 20 20 6e 50 65 65 72 56 61 6c 20 3d 20 70 4d 57    nPeerVal = pMW
99d0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
99e0: 78 70 72 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  xpr;.    pParse-
99f0: 3e 6e 4d 65 6d 20 2b 3d 20 28 32 20 2a 20 6e 50  >nMem += (2 * nP
9a00: 65 65 72 56 61 6c 29 3b 0a 20 20 20 20 66 6f 72  eerVal);.    for
9a10: 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72 56 61 6c  (k=0; k<nPeerVal
9a20: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; k++){.      sq
9a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9a40: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d  v, OP_Column, pM
9a50: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 69 50  Win->iEphCsr, iP
9a60: 65 65 72 2b 6b 2c 20 72 65 67 50 65 65 72 56 61  eer+k, regPeerVa
9a70: 6c 2b 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  l+k);.    }.    
9a80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9a90: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9aa0: 20 30 2c 20 72 65 67 50 65 65 72 29 3b 0a 20 20   0, regPeer);.  
9ab0: 7d 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69  }..  windowAggFi
9ac0: 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
9ad0: 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 62 52 61  n, 0);.  if( bRa
9ae0: 6e 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nge ){.    sqlit
9af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9b00: 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 50 65  OP_AddImm, regPe
9b10: 65 72 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 77 69  er, 1);.  }.  wi
9b20: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
9b30: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
9b40: 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
9b50: 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  sub);.  sqlite3V
9b60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9b70: 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  Next, pMWin->iEp
9b80: 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62  hCsr, sqlite3Vdb
9b90: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
9ba0: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
9bb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
9bc0: 74 6f 2c 20 30 2c 20 6c 62 6c 46 6c 75 73 68 44  to, 0, lblFlushD
9bd0: 6f 6e 65 29 3b 0a 20 20 69 66 28 20 62 52 61 6e  one);.  if( bRan
9be0: 67 65 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ge ){.    KeyInf
9bf0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
9c00: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
9c10: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
9c20: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
9c30: 2c 30 2c 30 29 3b 0a 20 20 20 20 69 6e 74 20 61  ,0,0);.    int a
9c40: 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65  ddrJump = sqlite
9c50: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
9c60: 28 76 29 2d 34 3b 0a 20 20 20 20 66 6f 72 28 6b  (v)-4;.    for(k
9c70: 3d 30 3b 20 6b 3c 6e 50 65 65 72 56 61 6c 3b 20  =0; k<nPeerVal; 
9c80: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  k++){.      int 
9c90: 69 4f 75 74 20 3d 20 72 65 67 50 65 65 72 56 61  iOut = regPeerVa
9ca0: 6c 20 2b 20 6e 50 65 65 72 56 61 6c 20 2b 20 6b  l + nPeerVal + k
9cb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9cc0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9cd0: 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69  Column, pMWin->i
9ce0: 45 70 68 43 73 72 2c 20 69 50 65 65 72 2b 6b 2c  EphCsr, iPeer+k,
9cf0: 20 69 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20   iOut);.    }.  
9d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9d10: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
9d20: 65 2c 20 72 65 67 50 65 65 72 56 61 6c 2c 20 72  e, regPeerVal, r
9d30: 65 67 50 65 65 72 56 61 6c 2b 6e 50 65 65 72 56  egPeerVal+nPeerV
9d40: 61 6c 2c 20 6e 50 65 65 72 56 61 6c 29 3b 0a 20  al, nPeerVal);. 
9d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
9d60: 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
9d70: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
9d80: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 61 64 64 72  YINFO);.    addr
9d90: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
9da0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
9db0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9dc0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
9dd0: 2c 20 61 64 64 72 2c 20 61 64 64 72 4a 75 6d 70  , addr, addrJump
9de0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 69  , addr);.  }.  i
9df0: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
9e00: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
9e10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9e20: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
9e30: 72 49 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20  rIfPos2);.  }.. 
9e40: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
9e50: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  rt==TK_CURRENT .
9e60: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
9e70: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
9e80: 47 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e  G .   || pMWin->
9e90: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
9ea0: 57 49 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20 69  WING .  ){.    i
9eb0: 6e 74 20 61 64 64 72 4a 75 6d 70 48 65 72 65 20  nt addrJumpHere 
9ec0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4d 57  = 0;.    if( pMW
9ed0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
9ee0: 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
9ef0: 20 20 61 64 64 72 4a 75 6d 70 48 65 72 65 20 3d    addrJumpHere =
9f00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9f10: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
9f20: 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29  regStart, 0 , 1)
9f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9f40: 62 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20  bRange ){.      
9f50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f60: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
9f70: 65 67 50 65 65 72 2c 20 73 71 6c 69 74 65 33 56  egPeer, sqlite3V
9f80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
9f90: 29 2b 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  )+2, 1);.      a
9fa0: 64 64 72 4a 75 6d 70 48 65 72 65 20 3d 20 73 71  ddrJumpHere = sq
9fb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
9fc0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
9fd0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
9fe0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9ff0: 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73  ext, csrStart, s
a000: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
a010: 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20  tAddr(v)+1);.   
a020: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
a030: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
a040: 72 53 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72  rStart, 1, regAr
a050: 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 20  g, regSize);.   
a060: 20 69 66 28 20 62 52 61 6e 67 65 20 29 7b 0a 20   if( bRange ){. 
a070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a080: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
a090: 6f 2c 20 30 2c 20 61 64 64 72 4a 75 6d 70 48 65  o, 0, addrJumpHe
a0a0: 72 65 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  re-1);.    }.   
a0b0: 20 69 66 28 20 61 64 64 72 4a 75 6d 70 48 65 72   if( addrJumpHer
a0c0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
a0d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a0e0: 2c 20 61 64 64 72 4a 75 6d 70 48 65 72 65 29 3b  , addrJumpHere);
a0f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a100: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
a110: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
a120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
a130: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 50  pHere(v, addrIfP
a140: 6f 73 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  os1);.  }.  sqli
a150: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a160: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
a170: 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a 20 66 6c 75  rTop);..  /* flu
a180: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
a190: 65 3a 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e: */.  sqlite3V
a1a0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
a1b0: 76 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29  v, lblFlushDone)
a1c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a1d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
a1e0: 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
a1f0: 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69  iEphCsr);.  sqli
a200: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
a210: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46   OP_Return, regF
a220: 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a  lushPart);..  /*
a230: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f   Jump to here to
a240: 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68   skip over flush
a250: 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20  _partition */.  
a260: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a270: 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29  ere(v, addrGoto)
a280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47 45  ;.}../*.** RANGE
a290: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
a2a0: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
a2b0: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
a2c0: 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69  **   flush_parti
a2d0: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63  tion:.**     Onc
a2e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65  e {.**       Ope
a2f0: 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e  nDup (iEphCsr ->
a300: 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20   csrLead).**    
a310: 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65   }.**     Intege
a320: 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66  r ctr 0.**     f
a330: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
a340: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ead){.**       i
a350: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
a360: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
a370: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
a380: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
a390: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
a3a0: 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
a3b0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
a3c0: 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68         Next iEph
a3d0: 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  Csr.**         }
a3e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e 74 65  .**         Inte
a3f0: 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20  ger ctr 0.**    
a400: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67     }.**       Ag
a410: 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a  gStep (csrLead).
a420: 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20 63 74  **       Incr ct
a430: 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
a440: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
a450: 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20  Finalize).**    
a460: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
a470: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
a480: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
a490: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 69 45  **       Next iE
a4a0: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  phCsr.**     }.*
a4b0: 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  *.**     ResetSo
a4c0: 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
a4d0: 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52    Return.**.** R
a4e0: 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
a4f0: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
a500: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
a510: 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e  ** RANGE BETWEEN
a520: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
a530: 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44  DING AND UNBOUND
a540: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20  ED FOLLOWING.** 
a550: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
a560: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55  RRENT ROW AND CU
a570: 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2a 0a 2a 2a  RRENT ROW .**.**
a580: 20 20 20 54 4f 44 4f 2e 0a 2a 2f 0a 73 74 61 74     TODO..*/.stat
a590: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f  ic void windowCo
a5a0: 64 65 43 61 63 68 65 53 74 65 70 28 0a 20 20 50  deCacheStep(.  P
a5b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
a5c0: 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68   Select *p,.  Wh
a5d0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
a5e0: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
a5f0: 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75   .  int addrGosu
a600: 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  b.){.  Window *p
a610: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
a620: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
a630: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
a640: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
a650: 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69  in;.  int k;.  i
a660: 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c  nt addr;.  ExprL
a670: 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57  ist *pPart = pMW
a680: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a  in->pPartition;.
a690: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
a6a0: 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f  erBy = pMWin->pO
a6b0: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 50  rderBy;.  int nP
a6c0: 65 65 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  eer = pOrderBy->
a6d0: 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67  nExpr;.  int reg
a6e0: 4e 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e 74 20  NewPeer;..  int 
a6f0: 61 64 64 72 47 6f 74 6f 3b 20 20 20 20 20 20 20  addrGoto;       
a700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a710: 64 64 72 65 73 73 20 6f 66 20 47 6f 74 6f 20 75  ddress of Goto u
a720: 73 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c 75 73  sed to jump flus
a730: 68 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74  h_par.. */.  int
a740: 20 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20 20   addrRewind;    
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a760: 41 64 64 72 65 73 73 20 6f 66 20 52 65 77 69 6e  Address of Rewin
a770: 64 20 74 68 61 74 20 73 74 61 72 74 73 20 6c 6f  d that starts lo
a780: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  op */.  int regF
a790: 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74 20  lushPart;.  int 
a7a0: 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a 20 20  lblFlushPart;.  
a7b0: 69 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20 20 69  int csrLead;.  i
a7c0: 6e 74 20 72 65 67 43 74 72 3b 0a 20 20 69 6e 74  nt regCtr;.  int
a7d0: 20 72 65 67 41 72 67 3b 20 20 20 20 20 20 20 20   regArg;        
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7f0: 52 65 67 69 73 74 65 72 20 61 72 72 61 79 20 74  Register array t
a800: 6f 20 6d 61 72 74 69 61 6c 20 66 75 6e 63 74 69  o martial functi
a810: 6f 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74  on args */.  int
a820: 20 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e 74 20   regSize;.  int 
a830: 6e 41 72 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nArg;..  assert(
a840: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
a850: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
a860: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
a870: 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20  _CURRENT) .     
a880: 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
a890: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
a8a0: 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
a8b0: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20  ==TK_UNBOUNDED) 
a8c0: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
a8d0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
a8e0: 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e  RRENT && pMWin->
a8f0: 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
a900: 29 20 0a 20 20 29 3b 0a 0a 20 20 72 65 67 4e 65  ) .  );..  regNe
a910: 77 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  wPeer = pParse->
a920: 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65  nMem+1;.  pParse
a930: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
a940: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
a950: 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62  register and lab
a960: 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73  el for the "flus
a970: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62  h_partition" sub
a980: 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72  -routine. */.  r
a990: 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b  egFlushPart = ++
a9a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
a9b0: 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73  lblFlushPart = s
a9c0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
a9d0: 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65  bel(v);..  csrLe
a9e0: 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ad = pParse->nTa
a9f0: 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20  b++;.  regCtr = 
aa00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
aa10: 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  .  windowPartiti
aa20: 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  onCache(pParse, 
aa30: 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c  p, pWInfo, regFl
aa40: 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
aa50: 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29  hPart, &regSize)
aa60: 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ;.  addrGoto = s
aa70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
aa80: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
aa90: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
aaa0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
aab0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
aac0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
aad0: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
aae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aaf0: 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
ab00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
ab10: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
ab20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab30: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
ab40: 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e  , csrLead, pMWin
ab50: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f  ->iEphCsr);..  /
ab60: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
ab70: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
ab80: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
ab90: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
aba0: 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41  o NULL */.  regA
abb0: 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
abc0: 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
abd0: 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  in);..  sqlite3V
abe0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
abf0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43  Integer, 0, regC
ac00: 74 72 29 3b 0a 20 20 61 64 64 72 52 65 77 69 6e  tr);.  addrRewin
ac10: 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  d = sqlite3VdbeA
ac20: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
ac30: 6e 64 2c 20 63 73 72 4c 65 61 64 29 3b 0a 20 20  nd, csrLead);.  
ac40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ac50: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
ac60: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
ac70: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
ac80: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
ac90: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 29 7b 0a 20  =TK_CURRENT ){. 
aca0: 20 20 20 69 6e 74 20 62 43 75 72 72 65 6e 74 20     int bCurrent 
acb0: 3d 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  = (pMWin->eEnd==
acc0: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
acd0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
ace0: 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20 69 6e  CURRENT);.    in
acf0: 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 20  t addrJump = 0; 
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ad10: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a 75 6d  ddress of OP_Jum
ad20: 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69  p below */.    i
ad30: 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
ad40: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
ad50: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4d     int iOff = pM
ad60: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20  Win->nBufferCol 
ad70: 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74  + (pPart ? pPart
ad80: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
ad90: 20 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20      int regPeer 
ada0: 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  = pMWin->regPart
adb0: 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72   + (pPart ? pPar
adc0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
add0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
ade0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
adf0: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
ae00: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
ae10: 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
ae20: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50     for(k=0; k<nP
ae30: 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  eer; k++){.     
ae40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ae50: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
ae60: 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f 66 66  n, csrLead, iOff
ae70: 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72 2b 6b  +k, regNewPeer+k
ae80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ae90: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
aea0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aeb0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
aec0: 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50  eer, regPeer, nP
aed0: 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eer);.      sqli
aee0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
aef0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
af00: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
af10: 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20  .      addrJump 
af20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
af30: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
af40: 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
af50: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
af60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
af70: 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 65  P_Copy, regNewPe
af80: 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  er, regPeer, nPe
af90: 65 72 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  er-1);.    }..  
afa0: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f    windowReturnRo
afb0: 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ws(pParse, pMWin
afc0: 2c 20 72 65 67 43 74 72 2c 20 30 2c 20 72 65 67  , regCtr, 0, reg
afd0: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
afe0: 2c 20 0a 20 20 20 20 20 20 20 20 28 62 43 75 72  , .        (bCur
aff0: 72 65 6e 74 20 3f 20 72 65 67 41 72 67 20 3a 20  rent ? regArg : 
b000: 30 29 2c 20 28 62 43 75 72 72 65 6e 74 20 3f 20  0), (bCurrent ? 
b010: 72 65 67 53 69 7a 65 20 3a 20 30 29 0a 20 20 20  regSize : 0).   
b020: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72   );.    if( addr
b030: 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
b040: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b050: 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20  drJump);.  }..  
b060: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
b070: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
b080: 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67 2c  Lead, 0, regArg,
b090: 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 73 71 6c   regSize);.  sql
b0a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b0b0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67  , OP_AddImm, reg
b0c0: 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  Ctr, 1);.  sqlit
b0d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b0e0: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64  OP_Next, csrLead
b0f0: 2c 20 61 64 64 72 52 65 77 69 6e 64 2b 32 29 3b  , addrRewind+2);
b100: 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  ..  windowReturn
b110: 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57  Rows(pParse, pMW
b120: 69 6e 2c 20 72 65 67 43 74 72 2c 20 31 2c 20 72  in, regCtr, 1, r
b130: 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
b140: 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71  ub, 0, 0);..  sq
b150: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b160: 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e 64 29  e(v, addrRewind)
b170: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
b180: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 52  umpHere(v, addrR
b190: 65 77 69 6e 64 2b 31 29 3b 0a 20 20 73 71 6c 69  ewind+1);.  sqli
b1a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b1b0: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
b1c0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
b1d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
b1e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
b1f0: 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  rn, regFlushPart
b200: 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
b210: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 6f 76   here to skip ov
b220: 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  er flush_partiti
b230: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
b240: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b250: 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  ddrGoto);.}.../*
b260: 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45  .** RANGE BETWEE
b270: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
b280: 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
b290: 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  T ROW.**.**   ..
b2a0: 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  ..**     if( new
b2b0: 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
b2c0: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
b2d0: 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20  (xFinalize).**  
b2e0: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
b2f0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65  osub.**       Re
b300: 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61  setSorter eph-ta
b310: 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ble.**     }.** 
b320: 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 65 77      else if( new
b330: 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20   peer ){.**     
b340: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
b350: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ue).**       Gos
b360: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
b370: 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65        ResetSorte
b380: 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20  r eph-table.**  
b390: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 53     }.**     AggS
b3a0: 74 65 70 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72  tep.**     Inser
b3b0: 74 20 28 72 65 63 6f 72 64 20 69 6e 74 6f 20 65  t (record into e
b3c0: 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 73  ph-table).**   s
b3d0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
b3e0: 0a 2a 2a 20 20 20 41 67 67 46 69 6e 61 6c 20 28  .**   AggFinal (
b3f0: 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20  xFinalize).**   
b400: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
b410: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
b420: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
b430: 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f  ECEDING AND UNBO
b440: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
b450: 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
b460: 2c 20 65 78 63 65 70 74 20 74 61 6b 65 20 6e 6f  , except take no
b470: 20 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 22 6e   action for a "n
b480: 65 77 20 70 65 65 72 22 2e 20 49 6e 76 6f 6b 65  ew peer". Invoke
b490: 0a 2a 2a 20 20 20 74 68 65 20 73 75 62 2d 72 6f  .**   the sub-ro
b4a0: 75 74 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79 20  utine once only 
b4b0: 66 6f 72 20 65 61 63 68 20 70 61 72 74 69 74 69  for each partiti
b4c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20  on..**.** RANGE 
b4d0: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
b4e0: 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ROW AND CURRENT 
b4f0: 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61  ROW.**.**   As a
b500: 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
b510: 74 20 74 68 65 20 22 6e 65 77 20 70 65 65 72 22  t the "new peer"
b520: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 68 61   condition is ha
b530: 6e 64 6c 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ndled in the.** 
b540: 20 20 73 61 6d 65 20 77 61 79 20 61 73 20 22 6e    same way as "n
b550: 65 77 20 70 61 72 74 69 74 69 6f 6e 22 20 28 73  ew partition" (s
b560: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22 65  o there is no "e
b570: 6c 73 65 20 69 66 22 20 62 6c 6f 63 6b 29 2e 0a  lse if" block)..
b580: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
b590: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
b5a0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
b5b0: 4e 54 20 52 4f 57 0a 2a 2a 20 0a 2a 2a 20 20 20  NT ROW.** .**   
b5c0: 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
b5d0: 20 61 73 73 75 6d 65 20 65 76 65 72 79 20 72 6f   assume every ro
b5e0: 77 20 69 73 20 61 20 22 6e 65 77 20 70 65 65 72  w is a "new peer
b5f0: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
b600: 64 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  d windowCodeDefa
b610: 75 6c 74 53 74 65 70 28 0a 20 20 50 61 72 73 65  ultStep(.  Parse
b620: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c   *pParse, .  Sel
b630: 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49  ect *p,.  WhereI
b640: 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69  nfo *pWInfo,.  i
b650: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20  nt regGosub, .  
b660: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
b670: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
b680: 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64   = p->pWin;.  Vd
b690: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
b6a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
b6b0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
b6c0: 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 69    int k;.  int i
b6d0: 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63  SubCsr = p->pSrc
b6e0: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
b6f0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e    int nSub = p->
b700: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d  pSrc->a[0].pTab-
b710: 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65 67  >nCol;.  int reg
b720: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
b730: 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  1;.  int regReco
b740: 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20  rd = reg+nSub;. 
b750: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
b760: 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20 69  regRecord+1;.  i
b770: 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c  nt addr;.  ExprL
b780: 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57  ist *pPart = pMW
b790: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a  in->pPartition;.
b7a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
b7b0: 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f  erBy = pMWin->pO
b7c0: 72 64 65 72 42 79 3b 0a 0a 20 20 61 73 73 65 72  rderBy;..  asser
b7d0: 74 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  t( pMWin->eType=
b7e0: 3d 54 4b 5f 52 41 4e 47 45 20 0a 20 20 20 20 20  =TK_RANGE .     
b7f0: 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61   || (pMWin->eSta
b800: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
b810: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
b820: 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 29  =TK_CURRENT).  )
b830: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  ;..  assert( (pM
b840: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
b850: 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
b860: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
b870: 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20  RENT).       || 
b880: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
b890: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20  TK_UNBOUNDED && 
b8a0: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
b8b0: 55 4e 42 4f 55 4e 44 45 44 29 0a 20 20 20 20 20  UNBOUNDED).     
b8c0: 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
b8d0: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
b8e0: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
b8f0: 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20 20  TK_CURRENT).    
b900: 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53     || (pMWin->eS
b910: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
b920: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
b930: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
b940: 20 21 70 4f 72 64 65 72 42 79 29 0a 20 20 29 3b   !pOrderBy).  );
b950: 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
b960: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
b970: 44 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  D ){.    pOrderB
b980: 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 50  y = 0;.  }..  pP
b990: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53  arse->nMem += nS
b9a0: 75 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4d 61  ub + 2;..  /* Ma
b9b0: 72 74 69 61 6c 20 74 68 65 20 72 6f 77 20 72 65  rtial the row re
b9c0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 75  turned by the su
b9d0: 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e  b-select into an
b9e0: 20 61 72 72 61 79 20 6f 66 20 0a 20 20 2a 2a 20   array of .  ** 
b9f0: 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20  registers. */.  
ba00: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b  for(k=0; k<nSub;
ba10: 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   k++){.    sqlit
ba20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ba30: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43  OP_Column, iSubC
ba40: 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a 20  sr, k, reg+k);. 
ba50: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
ba60: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 74  f this is the st
ba70: 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72  art of a new par
ba80: 74 69 74 69 6f 6e 20 6f 72 20 70 65 65 72 20 67  tition or peer g
ba90: 72 6f 75 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  roup. */.  if( p
baa0: 50 61 72 74 20 7c 7c 20 70 4f 72 64 65 72 42 79  Part || pOrderBy
bab0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72   ){.    int nPar
bac0: 74 20 3d 20 28 70 50 61 72 74 20 3f 20 70 50 61  t = (pPart ? pPa
bad0: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
bae0: 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f      int addrGoto
baf0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 61 64   = 0;.    int ad
bb00: 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20  drJump = 0;.    
bb10: 69 6e 74 20 6e 50 65 65 72 20 3d 20 28 70 4f 72  int nPeer = (pOr
bb20: 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79  derBy ? pOrderBy
bb30: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20  ->nExpr : 0);.. 
bb40: 20 20 20 69 66 28 20 70 50 61 72 74 20 29 7b 0a     if( pPart ){.
bb50: 20 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77        int regNew
bb60: 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57  Part = reg + pMW
bb70: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a  in->nBufferCol;.
bb80: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
bb90: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
bba0: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
bbb0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
bbc0: 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rt, 0, 0);.     
bbd0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
bbe0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bbf0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
bc00: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
bc10: 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20  art,nPart);.    
bc20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
bc30: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
bc40: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
bc50: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64  INFO);.      add
bc60: 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  rJump = sqlite3V
bc70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bc80: 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c  Jump, addr+2, 0,
bc90: 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
bca0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
bcb0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29  Parse, pMWin, 1)
bcc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
bcd0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
bce0: 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74  addrGoto = sqlit
bcf0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
bd00: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20  OP_Goto);.      
bd10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
bd20: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
bd30: 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65     int regNewPee
bd40: 72 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d  r = reg + pMWin-
bd50: 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50  >nBufferCol + nP
bd60: 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  art;.      int r
bd70: 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e  egPeer = pMWin->
bd80: 72 65 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b  regPart + nPart;
bd90: 0a 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ..      if( addr
bda0: 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
bdb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
bdc0: 64 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 69  drJump);.      i
bdd0: 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
bde0: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
bdf0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
be00: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
be10: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
be20: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
be30: 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
be40: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
be50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
be60: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
be70: 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
be80: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20  , nPeer);.      
be90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
bea0: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
beb0: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
bec0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61  INFO);.        a
bed0: 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65  ddrJump = sqlite
bee0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bef0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
bf00: 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  0, addr+2);.    
bf10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bf20: 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20   addrJump = 0;. 
bf30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 69 6e       }.      win
bf40: 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72  dowAggFinal(pPar
bf50: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e  se, pMWin, pMWin
bf60: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
bf70: 52 45 4e 54 29 3b 0a 20 20 20 20 20 20 69 66 28  RENT);.      if(
bf80: 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69   addrGoto ) sqli
bf90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
bfa0: 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20  v, addrGoto);.  
bfb0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
bfc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bfd0: 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e  _Rewind, pMWin->
bfe0: 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65 33 56  iEphCsr,sqlite3V
bff0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c000: 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )+3);.    sqlite
c010: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c020: 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75  P_Gosub, regGosu
c030: 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
c040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c050: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
c060: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
c070: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
c080: 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 0a  entAddr(v)-1);..
c090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c0a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
c0b0: 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
c0c0: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 73 71  iEphCsr);.    sq
c0d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c0e0: 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 43  .        v, OP_C
c0f0: 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e 2d 3e  opy, reg+pMWin->
c100: 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57 69  nBufferCol, pMWi
c110: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
c120: 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20 29 3b  t+nPeer-1.    );
c130: 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a 75  ..    if( addrJu
c140: 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  mp ) sqlite3Vdbe
c150: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
c160: 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Jump);.  }..  /*
c170: 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75 6e   Invoke step fun
c180: 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f 77  ction for window
c190: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
c1a0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
c1b0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d 31 2c  arse, pMWin, -1,
c1c0: 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a 20 20   0, reg, 0);..  
c1d0: 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63 75  /* Buffer the cu
c1e0: 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68 65  rrent row in the
c1f0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
c200: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e  . */.  if( pMWin
c210: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20 29  ->nBufferCol>0 )
c220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
c230: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
c240: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20 70  keRecord, reg, p
c250: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
c260: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
c270: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
c280: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c290: 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65 67 52  OP_Blob, 0, regR
c2a0: 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69  ecord);.    sqli
c2b0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
c2c0: 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30 29  v, (void*)"", 0)
c2d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
c2e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c2f0: 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d  NewRowid, pMWin-
c300: 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77  >iEphCsr, regRow
c310: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
c320: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
c330: 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  nsert, pMWin->iE
c340: 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64  phCsr, regRecord
c350: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
c360: 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
c370: 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 20 2a  ase scan loop. *
c380: 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  /.  sqlite3Where
c390: 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
c3a0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
c3b0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29  Parse, pMWin, 1)
c3c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c3d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
c3e0: 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
c3f0: 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75  sr,sqlite3VdbeCu
c400: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
c410: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c420: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
c430: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
c440: 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65  Gosub);.  sqlite
c450: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c460: 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69  P_Next, pMWin->i
c470: 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56  EphCsr, sqlite3V
c480: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c490: 29 2d 31 29 3b 0a 7d 0a 0a 57 69 6e 64 6f 77 20  )-1);.}..Window 
c4a0: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75  *sqlite3WindowDu
c4b0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
c4c0: 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e  indow *p){.  Win
c4d0: 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  dow *pNew = 0;. 
c4e0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 4e   if( p ){.    pN
c4f0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
c500: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
c510: 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20  eof(Window));.  
c520: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
c530: 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65      pNew->pFilte
c540: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
c550: 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65  up(db, p->pFilte
c560: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  r, 0);.      pNe
c570: 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  w->pPartition = 
c580: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c590: 75 70 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  up(db, p->pParti
c5a0: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  tion, 0);.      
c5b0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
c5c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c5d0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
c5e0: 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  rBy, 0);.      p
c5f0: 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  New->eType = p->
c600: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e 65  eType;.      pNe
c610: 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e  w->eEnd = p->eEn
c620: 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  d;.      pNew->e
c630: 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
c640: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
c650: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45  Start = sqlite3E
c660: 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  xprDup(db, pNew-
c670: 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  >pStart, 0);.   
c680: 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20     pNew->pEnd = 
c690: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c6a0: 62 2c 20 70 4e 65 77 2d 3e 70 45 6e 64 2c 20 30  b, pNew->pEnd, 0
c6b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
c6c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
c6d0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
c6e0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
c6f0: 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55  CEDING AND UNBOU
c700: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
c710: 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
c720: 20 65 78 63 65 70 74 20 74 61 6b 65 20 6e 6f 20   except take no 
c730: 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 22 6e 65  action for a "ne
c740: 77 20 70 65 65 72 22 2e 20 49 6e 76 6f 6b 65 0a  w peer". Invoke.
c750: 2a 2a 20 20 20 74 68 65 20 73 75 62 2d 72 6f 75  **   the sub-rou
c760: 74 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79 20 66  tine once only f
c770: 6f 72 20 65 61 63 68 20 70 61 72 74 69 74 69 6f  or each partitio
c780: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42  n..**.** RANGE B
c790: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
c7a0: 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  OW AND CURRENT R
c7b0: 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62  OW.**.**   As ab
c7c0: 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
c7d0: 20 74 68 65 20 22 6e 65 77 20 70 65 65 72 22 20   the "new peer" 
c7e0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 68 61 6e  condition is han
c7f0: 64 6c 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20  dled in the.**  
c800: 20 73 61 6d 65 20 77 61 79 20 61 73 20 22 6e 65   same way as "ne
c810: 77 20 70 61 72 74 69 74 69 6f 6e 22 20 28 73 6f  w partition" (so
c820: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22 65 6c   there is no "el
c830: 73 65 20 69 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a  se if" block)..*
c840: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
c850: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
c860: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
c870: 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 4f  LOWING.**.**   O
c880: 6e 65 20 77 61 79 20 69 73 20 74 6f 20 6a 75 73  ne way is to jus
c890: 74 20 72 65 76 65 72 73 65 20 74 68 65 20 73 6f  t reverse the so
c8a0: 72 74 20 6f 72 64 65 72 20 61 6e 64 20 64 6f 20  rt order and do 
c8b0: 61 73 20 66 6f 72 20 42 45 54 57 45 45 4e 20 0a  as for BETWEEN .
c8c0: 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 50  **   UNBOUNDED P
c8d0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
c8e0: 52 45 4e 54 20 52 4f 57 2e 20 42 75 74 20 74 68  RENT ROW. But th
c8f0: 61 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20  at is not quite 
c900: 74 68 65 20 73 61 6d 65 20 66 6f 72 0a 2a 2a 20  the same for.** 
c910: 20 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 67 72    things like gr
c920: 6f 75 70 5f 63 6f 6e 63 61 74 28 29 2e 20 41 6e  oup_concat(). An
c930: 64 20 70 65 72 68 61 70 73 20 6f 74 68 65 72 20  d perhaps other 
c940: 75 73 65 72 20 64 65 66 69 6e 65 64 20 61 67 67  user defined agg
c950: 72 65 67 61 74 65 73 20 0a 2a 2a 20 20 20 61 73  regates .**   as
c960: 20 77 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 2e   well..**.**   .
c970: 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65  ...**     if( ne
c980: 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
c990: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c  *       Gosub fl
c9a0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3b 0a 2a  ush_partition;.*
c9b0: 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f 72  *       ResetSor
c9c0: 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a  ter eph-table.**
c9d0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67       }.**     Ag
c9e0: 67 53 74 65 70 0a 2a 2a 20 20 20 20 20 49 6e 73  gStep.**     Ins
c9f0: 65 72 74 20 28 72 65 63 6f 72 64 20 69 6e 74 6f  ert (record into
ca00: 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20   eph-table).**  
ca10: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
ca20: 28 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 66 6c  ().**   Gosub fl
ca30: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
ca40: 0a 2a 2a 20 20 66 6c 75 73 68 5f 70 61 72 74 69  .**  flush_parti
ca50: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 4f 70 65 6e 44  tion:.**   OpenD
ca60: 75 70 20 28 63 73 72 20 2d 3e 20 63 73 72 32 29  up (csr -> csr2)
ca70: 0a 2a 2a 20 20 20 66 6f 72 65 61 63 68 20 28 72  .**   foreach (r
ca80: 65 63 6f 72 64 20 69 6e 20 65 70 68 2d 74 61 62  ecord in eph-tab
ca90: 6c 65 29 20 7b 0a 2a 2a 20 20 20 20 20 69 66 28  le) {.**     if(
caa0: 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20   new peer ){.** 
cab0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72        while( csr
cac0: 32 21 3d 63 73 72 20 29 7b 0a 2a 2a 20 20 20 20  2!=csr ){.**    
cad0: 20 20 20 20 20 41 67 67 53 74 65 70 20 28 78 49       AggStep (xI
cae0: 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20 20 20 20  nverse).**      
caf0: 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a 2a     Next (csr2).*
cb00: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
cb10: 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e   }.**     AggFin
cb20: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
cb30: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
cb40: 75 62 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 3d  ub.**   }.**.**=
cb50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cb60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cb70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cb80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cb90: 3d 3d 3d 3d 3d 3d 3d 0a 2a 2a 0a 2a 2a 20 52 4f  =======.**.** RO
cba0: 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
cbb0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
cbc0: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
cbd0: 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  *   ....**     i
cbe0: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
cbf0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
cc00: 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65  Final (xFinalize
cc10: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
cc20: 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20 20 20    AggStep.**    
cc30: 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75   AggFinal (xValu
cc40: 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20  e).**     Gosub 
cc50: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 73  addrGosub.**   s
cc60: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
cc70: 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .**.*/.void sqli
cc80: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
cc90: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
cca0: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
ccb0: 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ,.  WhereInfo *p
ccc0: 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67  WInfo,.  int reg
ccd0: 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64  Gosub, .  int ad
cce0: 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e  drGosub.){.  Win
ccf0: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
cd00: 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  pWin;.  Window *
cd10: 70 57 69 6e 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  pWin;..  /*.  **
cd20: 20 43 61 6c 6c 20 77 69 6e 64 6f 77 43 6f 64 65   Call windowCode
cd30: 52 6f 77 45 78 70 72 53 74 65 70 28 29 20 66 6f  RowExprStep() fo
cd40: 72 20 61 6c 6c 20 77 69 6e 64 6f 77 20 6d 6f 64  r all window mod
cd50: 65 73 20 2a 65 78 63 65 70 74 2a 3a 0a 20 20 2a  es *except*:.  *
cd60: 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42  *.  **   RANGE B
cd70: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
cd80: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
cd90: 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20  URRENT ROW.  ** 
cda0: 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
cdb0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
cdc0: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
cdd0: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
cde0: 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
cdf0: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
ce00: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a   CURRENT ROW.  *
ce10: 2a 20 20 20 52 4f 57 53 20 20 42 45 54 57 45 45  *   ROWS  BETWEE
ce20: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
ce30: 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
ce40: 54 20 52 4f 57 0a 20 20 2a 2f 0a 20 20 69 66 28  T ROW.  */.  if(
ce50: 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d   (pMWin->eType==
ce60: 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26 20 28  TK_ROWS .   && (
ce70: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54  pMWin->eStart!=T
ce80: 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70 4d 57  K_UNBOUNDED||pMW
ce90: 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43 55 52  in->eEnd!=TK_CUR
cea0: 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f  RENT||!pMWin->pO
ceb0: 72 64 65 72 42 79 29 29 0a 20 20 20 7c 7c 20 28  rderBy)).   || (
cec0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
ced0: 4b 5f 43 55 52 52 45 4e 54 26 26 70 4d 57 69 6e  K_CURRENT&&pMWin
cee0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
cef0: 4e 44 45 44 26 26 70 4d 57 69 6e 2d 3e 70 4f 72  NDED&&pMWin->pOr
cf00: 64 65 72 42 79 29 0a 20 20 29 7b 0a 20 20 20 20  derBy).  ){.    
cf10: 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70  windowCodeRowExp
cf20: 72 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c  rStep(pParse, p,
cf30: 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75   pWInfo, regGosu
cf40: 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
cf50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
cf60: 20 20 2f 2a 0a 20 20 2a 2a 20 43 61 6c 6c 20 77    /*.  ** Call w
cf70: 69 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74  indowCodeCacheSt
cf80: 65 70 28 29 20 69 66 20 74 68 65 72 65 20 69 73  ep() if there is
cf90: 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   a window functi
cfa0: 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
cfb0: 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65  .  ** that the e
cfc0: 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e 20  ntire partition 
cfd0: 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20 74  be cached in a t
cfe0: 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65  emp table before
cff0: 20 61 6e 79 20 72 6f 77 73 0a 20 20 2a 2a 20 61   any rows.  ** a
d000: 72 65 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  re returned..  *
d010: 2f 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  /.  for(pWin=pMW
d020: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
d030: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
d040: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
d050: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
d060: 3b 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e 63  ;.    if( (pFunc
d070: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
d080: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
d090: 5f 53 49 5a 45 29 0a 20 20 20 20 20 7c 7c 20 28  _SIZE).     || (
d0a0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
d0b0: 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
d0c0: 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63  ).     || (pFunc
d0d0: 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f  ->xSFunc==first_
d0e0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 29 0a 20  valueStepFunc). 
d0f0: 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 78      || (pFunc->x
d100: 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46  SFunc==leadStepF
d110: 75 6e 63 29 0a 20 20 20 20 20 7c 7c 20 28 70 46  unc).     || (pF
d120: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67  unc->xSFunc==lag
d130: 53 74 65 70 46 75 6e 63 29 0a 20 20 20 20 29 7b  StepFunc).    ){
d140: 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  .      windowCod
d150: 65 43 61 63 68 65 53 74 65 70 28 70 50 61 72 73  eCacheStep(pPars
d160: 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
d170: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
d180: 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
d190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
d1a0: 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74  indowCodeDefault
d1b0: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Step(pParse, p, 
d1c0: 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62  pWInfo, regGosub
d1d0: 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a  , addrGosub);.}.
d1e0: 0a                                               .