/ Hex Artifact Content
Login

Artifact 33cc7de721edb12ddae639b96f537535e237edcd576c8d946e4a0b66d912a5db:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  *.*/.#include "s
0170: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 76 6f 69  qliteInt.h"..voi
0180: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44  d sqlite3WindowD
0190: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
01a0: 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
01b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
01c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
01d0: 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b  db, p->pFilter);
01e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
01f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0200: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20  ->pPartition);. 
0210: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
0220: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0230: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
0240: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0250: 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20  (db, p->pEnd);. 
0260: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0270: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61  lete(db, p->pSta
0280: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
0290: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
02a0: 20 7d 0a 7d 0a 0a 57 69 6e 64 6f 77 20 2a 73 71   }.}..Window *sq
02b0: 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63  lite3WindowAlloc
02c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
02d0: 65 2c 20 0a 20 20 69 6e 74 20 65 54 79 70 65 2c  e, .  int eType,
02e0: 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 45 78 70  .  int eEnd, Exp
02f0: 72 20 2a 70 45 6e 64 2c 20 0a 20 20 69 6e 74 20  r *pEnd, .  int 
0300: 65 53 74 61 72 74 2c 20 45 78 70 72 20 2a 70 53  eStart, Expr *pS
0310: 74 61 72 74 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  tart.){.  Window
0320: 20 2a 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77   *pWin = (Window
0330: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
0340: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
0350: 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
0360: 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 20 29  );..  if( pWin )
0370: 7b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70  {.    pWin->eTyp
0380: 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 70  e = eType;.    p
0390: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53  Win->eStart = eS
03a0: 74 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  tart;.    pWin->
03b0: 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 20  eEnd = eEnd;.   
03c0: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 45   pWin->pEnd = pE
03d0: 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53  nd;.    pWin->pS
03e0: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
03f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
0400: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
0410: 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29 3b  arse->db, pEnd);
0420: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0430: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
0440: 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  b, pStart);.  }.
0450: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
0460: 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  }..void sqlite3W
0470: 69 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73  indowAttach(Pars
0480: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0490: 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  *p, Window *pWin
04a0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
04b0: 20 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e    p->pWin = pWin
04c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
04d0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
04e0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
04f0: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a              Win);.  }.}.