/ Hex Artifact Content
Login

Artifact cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4a 75 6e 65 20  /*.** 2018 June 
0010: 31 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  17.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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: 2a 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  *.*/..#include "
0180: 73 71 6c 69 74 65 33 2e 68 22 0a 0a 23 69 66 64  sqlite3.h"..#ifd
0190: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 0a  ef SQLITE_TEST..
01a0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
01b0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
01c0: 3c 74 63 6c 2e 68 3e 0a 0a 65 78 74 65 72 6e 20  <tcl.h>..extern 
01d0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
01e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
01f0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
0200: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
0210: 70 44 62 29 3b 0a 65 78 74 65 72 6e 20 63 6f 6e  pDb);.extern con
0220: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0230: 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 0a 74  ErrName(int);..t
0240: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54 65  ypedef struct Te
0250: 73 74 57 69 6e 64 6f 77 20 54 65 73 74 57 69 6e  stWindow TestWin
0260: 64 6f 77 3b 0a 73 74 72 75 63 74 20 54 65 73 74  dow;.struct Test
0270: 57 69 6e 64 6f 77 20 7b 0a 20 20 54 63 6c 5f 4f  Window {.  Tcl_O
0280: 62 6a 20 2a 78 53 74 65 70 3b 0a 20 20 54 63 6c  bj *xStep;.  Tcl
0290: 5f 4f 62 6a 20 2a 78 46 69 6e 61 6c 3b 0a 20 20  _Obj *xFinal;.  
02a0: 54 63 6c 5f 4f 62 6a 20 2a 78 56 61 6c 75 65 3b  Tcl_Obj *xValue;
02b0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 78 49 6e 76  .  Tcl_Obj *xInv
02c0: 65 72 73 65 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  erse;.  Tcl_Inte
02d0: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 7d 3b 0a 0a  rp *interp;.};..
02e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54  typedef struct T
02f0: 65 73 74 57 69 6e 64 6f 77 43 74 78 20 54 65 73  estWindowCtx Tes
0300: 74 57 69 6e 64 6f 77 43 74 78 3b 0a 73 74 72 75  tWindowCtx;.stru
0310: 63 74 20 54 65 73 74 57 69 6e 64 6f 77 43 74 78  ct TestWindowCtx
0320: 20 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56   {.  Tcl_Obj *pV
0330: 61 6c 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76  al;.};..static v
0340: 6f 69 64 20 64 6f 54 65 73 74 57 69 6e 64 6f 77  oid doTestWindow
0350: 53 74 65 70 28 0a 20 20 69 6e 74 20 62 49 6e 76  Step(.  int bInv
0360: 65 72 73 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f  erse,.  sqlite3_
0370: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20  context *ctx, . 
0380: 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20 73 71   int nArg, .  sq
0390: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
03a0: 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Arg.){.  int i;.
03b0: 20 20 54 65 73 74 57 69 6e 64 6f 77 20 2a 70 20    TestWindow *p 
03c0: 3d 20 28 54 65 73 74 57 69 6e 64 6f 77 2a 29 73  = (TestWindow*)s
03d0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
03e0: 28 63 74 78 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  (ctx);.  Tcl_Obj
03f0: 20 2a 70 45 76 61 6c 20 3d 20 54 63 6c 5f 44 75   *pEval = Tcl_Du
0400: 70 6c 69 63 61 74 65 4f 62 6a 28 62 49 6e 76 65  plicateObj(bInve
0410: 72 73 65 20 3f 20 70 2d 3e 78 49 6e 76 65 72 73  rse ? p->xInvers
0420: 65 20 3a 20 70 2d 3e 78 53 74 65 70 29 3b 0a 20  e : p->xStep);. 
0430: 20 54 65 73 74 57 69 6e 64 6f 77 43 74 78 20 2a   TestWindowCtx *
0440: 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 61  pCtx = sqlite3_a
0450: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
0460: 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 54 65 73  (ctx, sizeof(Tes
0470: 74 57 69 6e 64 6f 77 43 74 78 29 29 3b 0a 0a 20  tWindowCtx));.. 
0480: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
0490: 74 28 70 45 76 61 6c 29 3b 0a 20 20 69 66 28 20  t(pEval);.  if( 
04a0: 70 43 74 78 20 29 7b 0a 20 20 20 20 63 6f 6e 73  pCtx ){.    cons
04b0: 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b  t char *zResult;
04c0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
04d0: 20 69 66 28 20 70 43 74 78 2d 3e 70 56 61 6c 20   if( pCtx->pVal 
04e0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  ){.      Tcl_Lis
04f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
0500: 74 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76  t(p->interp, pEv
0510: 61 6c 2c 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  al, Tcl_Duplicat
0520: 65 4f 62 6a 28 70 43 74 78 2d 3e 70 56 61 6c 29  eObj(pCtx->pVal)
0530: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
0540: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
0550: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
0560: 69 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c 20 54  interp, pEval, T
0570: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
0580: 22 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  "", -1));.    }.
0590: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
05a0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
05b0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 3b 0a   Tcl_Obj *pArg;.
05c0: 20 20 20 20 20 20 70 41 72 67 20 3d 20 54 63 6c        pArg = Tcl
05d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
05e0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
05f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
0600: 41 72 67 5b 69 5d 29 2c 20 2d 31 29 3b 0a 20 20  Arg[i]), -1);.  
0610: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
0620: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e  ppendElement(p->
0630: 69 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c 20 70  interp, pEval, p
0640: 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
0650: 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  rc = Tcl_EvalObj
0660: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45  Ex(p->interp, pE
0670: 76 61 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  val, TCL_EVAL_GL
0680: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72  OBAL);.    if( r
0690: 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  c!=TCL_OK ){.   
06a0: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 54 63 6c     zResult = Tcl
06b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
06c0: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20  (p->interp);.   
06d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
06e0: 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 7a 52 65  t_error(ctx, zRe
06f0: 73 75 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  sult, -1);.    }
0700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
0710: 70 43 74 78 2d 3e 70 56 61 6c 20 29 20 54 63 6c  pCtx->pVal ) Tcl
0720: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 43  _DecrRefCount(pC
0730: 74 78 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 20  tx->pVal);.     
0740: 20 70 43 74 78 2d 3e 70 56 61 6c 20 3d 20 54 63   pCtx->pVal = Tc
0750: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 54  l_DuplicateObj(T
0760: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
0770: 70 2d 3e 69 6e 74 65 72 70 29 29 3b 0a 20 20 20  p->interp));.   
0780: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
0790: 75 6e 74 28 70 43 74 78 2d 3e 70 56 61 6c 29 3b  unt(pCtx->pVal);
07a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c  .    }.  }.  Tcl
07b0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 45  _DecrRefCount(pE
07c0: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
07d0: 76 6f 69 64 20 64 6f 54 65 73 74 57 69 6e 64 6f  void doTestWindo
07e0: 77 46 69 6e 61 6c 69 7a 65 28 69 6e 74 20 62 56  wFinalize(int bV
07f0: 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 5f 63 6f  alue, sqlite3_co
0800: 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 54  ntext *ctx){.  T
0810: 65 73 74 57 69 6e 64 6f 77 20 2a 70 20 3d 20 28  estWindow *p = (
0820: 54 65 73 74 57 69 6e 64 6f 77 2a 29 73 71 6c 69  TestWindow*)sqli
0830: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 74  te3_user_data(ct
0840: 78 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  x);.  Tcl_Obj *p
0850: 45 76 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69  Eval = Tcl_Dupli
0860: 63 61 74 65 4f 62 6a 28 62 56 61 6c 75 65 20 3f  cateObj(bValue ?
0870: 20 70 2d 3e 78 56 61 6c 75 65 20 3a 20 70 2d 3e   p->xValue : p->
0880: 78 46 69 6e 61 6c 29 3b 0a 20 20 54 65 73 74 57  xFinal);.  TestW
0890: 69 6e 64 6f 77 43 74 78 20 2a 70 43 74 78 20 3d  indowCtx *pCtx =
08a0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
08b0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20  te_context(ctx, 
08c0: 73 69 7a 65 6f 66 28 54 65 73 74 57 69 6e 64 6f  sizeof(TestWindo
08d0: 77 43 74 78 29 29 3b 0a 0a 20 20 54 63 6c 5f 49  wCtx));..  Tcl_I
08e0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45 76 61  ncrRefCount(pEva
08f0: 6c 29 3b 0a 20 20 69 66 28 20 70 43 74 78 20 29  l);.  if( pCtx )
0900: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0910: 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *zResult;.    i
0920: 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70  nt rc;.    if( p
0930: 43 74 78 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  Ctx->pVal ){.   
0940: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
0950: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 70 2d 3e 69  pendElement(p->i
0960: 6e 74 65 72 70 2c 20 70 45 76 61 6c 2c 20 54 63  nterp, pEval, Tc
0970: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
0980: 43 74 78 2d 3e 70 56 61 6c 29 29 3b 0a 20 20 20  Ctx->pVal));.   
0990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63   }else{.      Tc
09a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
09b0: 6c 65 6d 65 6e 74 28 70 2d 3e 69 6e 74 65 72 70  lement(p->interp
09c0: 2c 20 70 45 76 61 6c 2c 20 54 63 6c 5f 4e 65 77  , pEval, Tcl_New
09d0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 20 2d 31  StringObj("", -1
09e0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  ));.    }..    r
09f0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
0a00: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 45 76  x(p->interp, pEv
0a10: 61 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  al, TCL_EVAL_GLO
0a20: 42 41 4c 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c  BAL);.    zResul
0a30: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
0a40: 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  gResult(p->inter
0a50: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  p);.    if( rc!=
0a60: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  TCL_OK ){.      
0a70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
0a80: 72 72 6f 72 28 63 74 78 2c 20 7a 52 65 73 75 6c  rror(ctx, zResul
0a90: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  t, -1);.    }els
0aa0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
0ab0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
0ac0: 2c 20 7a 52 65 73 75 6c 74 2c 20 2d 31 2c 20 53  , zResult, -1, S
0ad0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
0ae0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
0af0: 20 62 56 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20   bValue==0 ){.  
0b00: 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56      if( pCtx->pV
0b10: 61 6c 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66  al ) Tcl_DecrRef
0b20: 43 6f 75 6e 74 28 70 43 74 78 2d 3e 70 56 61 6c  Count(pCtx->pVal
0b30: 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 70  );.      pCtx->p
0b40: 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Val = 0;.    }. 
0b50: 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66   }.  Tcl_DecrRef
0b60: 43 6f 75 6e 74 28 70 45 76 61 6c 29 3b 0a 7d 0a  Count(pEval);.}.
0b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
0b80: 74 57 69 6e 64 6f 77 53 74 65 70 28 0a 20 20 73  tWindowStep(.  s
0b90: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0ba0: 63 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  ctx, .  int nArg
0bb0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
0bc0: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
0bd0: 64 6f 54 65 73 74 57 69 6e 64 6f 77 53 74 65 70  doTestWindowStep
0be0: 28 30 2c 20 63 74 78 2c 20 6e 41 72 67 2c 20 61  (0, ctx, nArg, a
0bf0: 70 41 72 67 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pArg);.}.static 
0c00: 76 6f 69 64 20 74 65 73 74 57 69 6e 64 6f 77 49  void testWindowI
0c10: 6e 76 65 72 73 65 28 0a 20 20 73 71 6c 69 74 65  nverse(.  sqlite
0c20: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
0c30: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20  .  int nArg, .  
0c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
0c50: 61 70 41 72 67 0a 29 7b 0a 20 20 64 6f 54 65 73  apArg.){.  doTes
0c60: 74 57 69 6e 64 6f 77 53 74 65 70 28 31 2c 20 63  tWindowStep(1, c
0c70: 74 78 2c 20 6e 41 72 67 2c 20 61 70 41 72 67 29  tx, nArg, apArg)
0c80: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
0c90: 20 74 65 73 74 57 69 6e 64 6f 77 46 69 6e 61 6c   testWindowFinal
0ca0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
0cb0: 20 2a 63 74 78 29 7b 0a 20 20 64 6f 54 65 73 74   *ctx){.  doTest
0cc0: 57 69 6e 64 6f 77 46 69 6e 61 6c 69 7a 65 28 30  WindowFinalize(0
0cd0: 2c 20 63 74 78 29 3b 0a 7d 0a 73 74 61 74 69 63  , ctx);.}.static
0ce0: 20 76 6f 69 64 20 74 65 73 74 57 69 6e 64 6f 77   void testWindow
0cf0: 56 61 6c 75 65 28 73 71 6c 69 74 65 33 5f 63 6f  Value(sqlite3_co
0d00: 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 64  ntext *ctx){.  d
0d10: 6f 54 65 73 74 57 69 6e 64 6f 77 46 69 6e 61 6c  oTestWindowFinal
0d20: 69 7a 65 28 31 2c 20 63 74 78 29 3b 0a 7d 0a 0a  ize(1, ctx);.}..
0d30: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
0d40: 57 69 6e 64 6f 77 44 65 73 74 72 6f 79 28 76 6f  WindowDestroy(vo
0d50: 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 63 6b 66  id *pCtx){.  ckf
0d60: 72 65 65 28 70 43 74 78 29 3b 0a 7d 0a 0a 2f 2a  ree(pCtx);.}../*
0d70: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
0d80: 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77  e3_create_window
0d90: 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 4e 41 4d  _function DB NAM
0da0: 45 20 58 53 54 45 50 20 58 46 49 4e 41 4c 20 58  E XSTEP XFINAL X
0db0: 56 41 4c 55 45 20 58 49 4e 56 45 52 53 45 0a 2a  VALUE XINVERSE.*
0dc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
0dd0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
0de0: 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 28 0a 20  create_window(. 
0df0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
0e00: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
0e10: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
0e20: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
0e30: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
0e40: 0a 20 20 54 65 73 74 57 69 6e 64 6f 77 20 2a 70  .  TestWindow *p
0e50: 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  New;.  sqlite3 *
0e60: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
0e70: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 72   *zName;.  int r
0e80: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
0e90: 37 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  7 ){.    Tcl_Wro
0ea0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
0eb0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e  , 1, objv, "DB N
0ec0: 41 4d 45 20 58 53 54 45 50 20 58 46 49 4e 41 4c  AME XSTEP XFINAL
0ed0: 20 58 56 41 4c 55 45 20 58 49 4e 56 45 52 53 45   XVALUE XINVERSE
0ee0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
0ef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
0f00: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
0f10: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
0f20: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
0f30: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
0f40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61  TCL_ERROR;.  zNa
0f50: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
0f60: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 70  ng(objv[2]);.  p
0f70: 4e 65 77 20 3d 20 28 54 65 73 74 57 69 6e 64 6f  New = (TestWindo
0f80: 77 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f  w*)ckalloc(sizeo
0f90: 66 28 54 65 73 74 57 69 6e 64 6f 77 29 29 3b 0a  f(TestWindow));.
0fa0: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
0fb0: 2c 20 73 69 7a 65 6f 66 28 54 65 73 74 57 69 6e  , sizeof(TestWin
0fc0: 64 6f 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 78  dow));.  pNew->x
0fd0: 53 74 65 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69  Step = Tcl_Dupli
0fe0: 63 61 74 65 4f 62 6a 28 6f 62 6a 76 5b 33 5d 29  cateObj(objv[3])
0ff0: 3b 0a 20 20 70 4e 65 77 2d 3e 78 46 69 6e 61 6c  ;.  pNew->xFinal
1000: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1010: 4f 62 6a 28 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20  Obj(objv[4]);.  
1020: 70 4e 65 77 2d 3e 78 56 61 6c 75 65 20 3d 20 54  pNew->xValue = T
1030: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1040: 6f 62 6a 76 5b 35 5d 29 3b 0a 20 20 70 4e 65 77  objv[5]);.  pNew
1050: 2d 3e 78 49 6e 76 65 72 73 65 20 3d 20 54 63 6c  ->xInverse = Tcl
1060: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6f 62  _DuplicateObj(ob
1070: 6a 76 5b 36 5d 29 3b 0a 20 20 70 4e 65 77 2d 3e  jv[6]);.  pNew->
1080: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b  interp = interp;
1090: 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ..  Tcl_IncrRefC
10a0: 6f 75 6e 74 28 70 4e 65 77 2d 3e 78 53 74 65 70  ount(pNew->xStep
10b0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
10c0: 43 6f 75 6e 74 28 70 4e 65 77 2d 3e 78 46 69 6e  Count(pNew->xFin
10d0: 61 6c 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  al);.  Tcl_IncrR
10e0: 65 66 43 6f 75 6e 74 28 70 4e 65 77 2d 3e 78 56  efCount(pNew->xV
10f0: 61 6c 75 65 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  alue);.  Tcl_Inc
1100: 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 2d 3e  rRefCount(pNew->
1110: 78 49 6e 76 65 72 73 65 29 3b 0a 0a 20 20 72 63  xInverse);..  rc
1120: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1130: 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f  e_window_functio
1140: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  n(db, zName, -1,
1150: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
1160: 6f 69 64 2a 29 70 4e 65 77 2c 0a 20 20 20 20 20  oid*)pNew,.     
1170: 20 74 65 73 74 57 69 6e 64 6f 77 53 74 65 70 2c   testWindowStep,
1180: 20 74 65 73 74 57 69 6e 64 6f 77 46 69 6e 61 6c   testWindowFinal
1190: 2c 20 74 65 73 74 57 69 6e 64 6f 77 56 61 6c 75  , testWindowValu
11a0: 65 2c 20 74 65 73 74 57 69 6e 64 6f 77 49 6e 76  e, testWindowInv
11b0: 65 72 73 65 2c 0a 20 20 20 20 20 20 74 65 73 74  erse,.      test
11c0: 57 69 6e 64 6f 77 44 65 73 74 72 6f 79 0a 20 20  WindowDestroy.  
11d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
11f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1200: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1210: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
1220: 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
1230: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1240: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
1250: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1260: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1270: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
1280: 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 6d 69 73  reate_window_mis
1290: 75 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  use(.  void * cl
12a0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12c0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12d0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12e0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
12f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
1300: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1310: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1320: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1330: 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20  , objv, "DB");. 
1340: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1350: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1360: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1370: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1380: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1390: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13a0: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
13b0: 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64  ite3_create_wind
13c0: 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ow_function(db, 
13d0: 22 66 66 66 22 2c 20 2d 31 2c 20 53 51 4c 49 54  "fff", -1, SQLIT
13e0: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
13f0: 20 30 2c 20 74 65 73 74 57 69 6e 64 6f 77 46 69   0, testWindowFi
1400: 6e 61 6c 2c 20 74 65 73 74 57 69 6e 64 6f 77 56  nal, testWindowV
1410: 61 6c 75 65 2c 20 74 65 73 74 57 69 6e 64 6f 77  alue, testWindow
1420: 49 6e 76 65 72 73 65 2c 0a 20 20 20 20 20 20 30  Inverse,.      0
1430: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
1440: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 20  SQLITE_MISUSE ) 
1450: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 72 63  goto error;.  rc
1460: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1470: 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f  e_window_functio
1480: 6e 28 64 62 2c 20 22 66 66 66 22 2c 20 2d 31 2c  n(db, "fff", -1,
1490: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
14a0: 0a 20 20 20 20 20 20 74 65 73 74 57 69 6e 64 6f  .      testWindo
14b0: 77 53 74 65 70 2c 20 30 2c 20 74 65 73 74 57 69  wStep, 0, testWi
14c0: 6e 64 6f 77 56 61 6c 75 65 2c 20 74 65 73 74 57  ndowValue, testW
14d0: 69 6e 64 6f 77 49 6e 76 65 72 73 65 2c 0a 20 20  indowInverse,.  
14e0: 20 20 20 20 30 0a 20 20 29 3b 0a 20 20 69 66 28      0.  );.  if(
14f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55   rc!=SQLITE_MISU
1500: 53 45 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 3b  SE ) goto error;
1510: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1520: 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75  create_window_fu
1530: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 66 66 22  nction(db, "fff"
1540: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
1550: 38 2c 20 30 2c 0a 20 20 20 20 20 20 74 65 73 74  8, 0,.      test
1560: 57 69 6e 64 6f 77 53 74 65 70 2c 20 74 65 73 74  WindowStep, test
1570: 57 69 6e 64 6f 77 46 69 6e 61 6c 2c 20 30 2c 20  WindowFinal, 0, 
1580: 74 65 73 74 57 69 6e 64 6f 77 49 6e 76 65 72 73  testWindowInvers
1590: 65 2c 0a 20 20 20 20 20 20 30 0a 20 20 29 3b 0a  e,.      0.  );.
15a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15b0: 5f 4d 49 53 55 53 45 20 29 20 67 6f 74 6f 20 65  _MISUSE ) goto e
15c0: 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20 73 71 6c  rror;.  rc = sql
15d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64  ite3_create_wind
15e0: 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ow_function(db, 
15f0: 22 66 66 66 22 2c 20 2d 31 2c 20 53 51 4c 49 54  "fff", -1, SQLIT
1600: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
1610: 20 74 65 73 74 57 69 6e 64 6f 77 53 74 65 70 2c   testWindowStep,
1620: 20 74 65 73 74 57 69 6e 64 6f 77 46 69 6e 61 6c   testWindowFinal
1630: 2c 20 74 65 73 74 57 69 6e 64 6f 77 56 61 6c 75  , testWindowValu
1640: 65 2c 20 30 2c 0a 20 20 20 20 20 20 30 0a 20 20  e, 0,.      0.  
1650: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1660: 49 54 45 5f 4d 49 53 55 53 45 20 29 20 67 6f 74  ITE_MISUSE ) got
1670: 6f 20 65 72 72 6f 72 3b 0a 0a 20 20 72 65 74 75  o error;..  retu
1680: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 65 72 72  rn TCL_OK;.. err
1690: 6f 72 3a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  or:.  Tcl_SetObj
16a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
16b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16c0: 22 6d 69 73 75 73 65 20 74 65 73 74 20 65 72 72  "misuse test err
16d0: 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  or", -1));.  ret
16e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
16f0: 0a 0a 2f 2a 0a 2a 2a 20 78 53 74 65 70 20 66 6f  ../*.** xStep fo
1700: 72 20 73 75 6d 69 6e 74 28 29 2e 0a 2a 2f 0a 73  r sumint()..*/.s
1710: 74 61 74 69 63 20 76 6f 69 64 20 73 75 6d 69 6e  tatic void sumin
1720: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
1730: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a  _context *ctx, .
1740: 20 20 69 6e 74 20 6e 41 72 67 2c 20 0a 20 20 73    int nArg, .  s
1750: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 61 70  qlite3_value *ap
1760: 41 72 67 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  Arg[].){.  sqlit
1770: 65 33 5f 69 6e 74 36 34 20 2a 70 49 6e 74 3b 0a  e3_int64 *pInt;.
1780: 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d  .  assert( nArg=
1790: 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =1 );.  if( sqli
17a0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
17b0: 70 41 72 67 5b 30 5d 29 21 3d 53 51 4c 49 54 45  pArg[0])!=SQLITE
17c0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
17d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
17e0: 72 72 6f 72 28 63 74 78 2c 20 22 69 6e 76 61 6c  rror(ctx, "inval
17f0: 69 64 20 61 72 67 75 6d 65 6e 74 22 2c 20 2d 31  id argument", -1
1800: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1810: 20 7d 0a 20 20 70 49 6e 74 20 3d 20 28 73 71 6c   }.  pInt = (sql
1820: 69 74 65 33 5f 69 6e 74 36 34 2a 29 73 71 6c 69  ite3_int64*)sqli
1830: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1840: 6e 74 65 78 74 28 63 74 78 2c 20 73 69 7a 65 6f  ntext(ctx, sizeo
1850: 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  f(sqlite3_int64)
1860: 29 3b 0a 20 20 69 66 28 20 70 49 6e 74 20 29 7b  );.  if( pInt ){
1870: 0a 20 20 20 20 2a 70 49 6e 74 20 2b 3d 20 73 71  .    *pInt += sq
1880: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
1890: 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 7d  4(apArg[0]);.  }
18a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 49 6e 76 65 72  .}../*.** xInver
18b0: 73 65 20 66 6f 72 20 73 75 6d 69 6e 74 28 29 2e  se for sumint().
18c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18d0: 73 75 6d 69 6e 74 49 6e 76 65 72 73 65 28 0a 20  sumintInverse(. 
18e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
18f0: 20 2a 63 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41   *ctx, .  int nA
1900: 72 67 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  rg, .  sqlite3_v
1910: 61 6c 75 65 20 2a 61 70 41 72 67 5b 5d 0a 29 7b  alue *apArg[].){
1920: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1930: 20 2a 70 49 6e 74 3b 0a 20 20 70 49 6e 74 20 3d   *pInt;.  pInt =
1940: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a   (sqlite3_int64*
1950: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
1960: 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20  te_context(ctx, 
1970: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69  sizeof(sqlite3_i
1980: 6e 74 36 34 29 29 3b 0a 20 20 2a 70 49 6e 74 20  nt64));.  *pInt 
1990: 2d 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  -= sqlite3_value
19a0: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
19b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 46 69 6e 61  ;.}../*.** xFina
19c0: 6c 20 66 6f 72 20 73 75 6d 69 6e 74 28 29 2e 0a  l for sumint()..
19d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
19e0: 75 6d 69 6e 74 46 69 6e 61 6c 28 73 71 6c 69 74  umintFinal(sqlit
19f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29  e3_context *ctx)
1a00: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
1a10: 34 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c  4 res = 0;.  sql
1a20: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 49 6e 74  ite3_int64 *pInt
1a30: 3b 0a 20 20 70 49 6e 74 20 3d 20 28 73 71 6c 69  ;.  pInt = (sqli
1a40: 74 65 33 5f 69 6e 74 36 34 2a 29 73 71 6c 69 74  te3_int64*)sqlit
1a50: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
1a60: 74 65 78 74 28 63 74 78 2c 20 30 29 3b 0a 20 20  text(ctx, 0);.  
1a70: 69 66 28 20 70 49 6e 74 20 29 20 72 65 73 20 3d  if( pInt ) res =
1a80: 20 2a 70 49 6e 74 3b 0a 20 20 73 71 6c 69 74 65   *pInt;.  sqlite
1a90: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
1aa0: 74 78 2c 20 72 65 73 29 3b 0a 7d 0a 0a 2f 2a 0a  tx, res);.}../*.
1ab0: 2a 2a 20 78 56 61 6c 75 65 20 66 6f 72 20 73 75  ** xValue for su
1ac0: 6d 69 6e 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  mint()..*/.stati
1ad0: 63 20 76 6f 69 64 20 73 75 6d 69 6e 74 56 61 6c  c void sumintVal
1ae0: 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ue(sqlite3_conte
1af0: 78 74 20 2a 63 74 78 29 7b 0a 20 20 73 71 6c 69  xt *ctx){.  sqli
1b00: 74 65 33 5f 69 6e 74 36 34 20 72 65 73 20 3d 20  te3_int64 res = 
1b10: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
1b20: 36 34 20 2a 70 49 6e 74 3b 0a 20 20 70 49 6e 74  64 *pInt;.  pInt
1b30: 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
1b40: 34 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  4*)sqlite3_aggre
1b50: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78  gate_context(ctx
1b60: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 74  , 0);.  if( pInt
1b70: 20 29 20 72 65 73 20 3d 20 2a 70 49 6e 74 3b 0a   ) res = *pInt;.
1b80: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1b90: 5f 69 6e 74 36 34 28 63 74 78 2c 20 72 65 73 29  _int64(ctx, res)
1ba0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1bb0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1bc0: 73 74 5f 63 72 65 61 74 65 5f 73 75 6d 69 6e 74  st_create_sumint
1bd0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1be0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1bf0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c00: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c10: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c20: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1c30: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
1c40: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c50: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1c60: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1c70: 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
1c80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1ca0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1cb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1cc0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1cd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ce0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1cf0: 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f  3_create_window_
1d00: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 75  function(db, "su
1d10: 6d 69 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45  mint", 1, SQLITE
1d20: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1d30: 73 75 6d 69 6e 74 53 74 65 70 2c 20 73 75 6d 69  sumintStep, sumi
1d40: 6e 74 46 69 6e 61 6c 2c 20 73 75 6d 69 6e 74 56  ntFinal, sumintV
1d50: 61 6c 75 65 2c 20 73 75 6d 69 6e 74 49 6e 76 65  alue, sumintInve
1d60: 72 73 65 2c 0a 20 20 20 20 20 20 30 0a 20 20 29  rse,.      0.  )
1d70: 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
1d80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
1d90: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1da0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1db0: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
1dc0: 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
1dd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1de0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1df0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e00: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1e10: 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 76  E_TCLAPI test_ov
1e20: 65 72 72 69 64 65 5f 73 75 6d 28 0a 20 20 76 6f  erride_sum(.  vo
1e30: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e40: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e50: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1e60: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1e70: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1e80: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1e90: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1ea0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1eb0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1ec0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1ed0: 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
1ee0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ef0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1f00: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1f10: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1f20: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1f30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1f40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1f50: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
1f60: 22 73 75 6d 22 2c 20 2d 31 2c 20 53 51 4c 49 54  "sum", -1, SQLIT
1f70: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
1f80: 20 30 2c 20 73 75 6d 69 6e 74 53 74 65 70 2c 20   0, sumintStep, 
1f90: 73 75 6d 69 6e 74 46 69 6e 61 6c 0a 20 20 29 3b  sumintFinal.  );
1fa0: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
1fb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
1fc0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1fd0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
1fe0: 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
1ff0: 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b  rName(rc), -1));
2000: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2010: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2020: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 69  urn TCL_OK;.}..i
2030: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 77 69  nt Sqlitetest_wi
2040: 6e 64 6f 77 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  ndow_Init(Tcl_In
2050: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
2060: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
2070: 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
2080: 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43  e;.     Tcl_ObjC
2090: 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
20a0: 20 20 20 20 69 6e 74 20 63 6c 69 65 6e 74 44 61      int clientDa
20b0: 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b  ta;.  } aObjCmd[
20c0: 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71  ] = {.     { "sq
20d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e  lite3_create_win
20e0: 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 74  dow_function", t
20f0: 65 73 74 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f  est_create_windo
2100: 77 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  w, 0 },.     { "
2110: 74 65 73 74 5f 63 72 65 61 74 65 5f 77 69 6e 64  test_create_wind
2120: 6f 77 5f 66 75 6e 63 74 69 6f 6e 5f 6d 69 73 75  ow_function_misu
2130: 73 65 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65  se", test_create
2140: 5f 77 69 6e 64 6f 77 5f 6d 69 73 75 73 65 2c 20  _window_misuse, 
2150: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73  0 },.     { "tes
2160: 74 5f 63 72 65 61 74 65 5f 73 75 6d 69 6e 74 22  t_create_sumint"
2170: 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f 73 75  , test_create_su
2180: 6d 69 6e 74 2c 20 30 20 7d 2c 0a 20 20 20 20 20  mint, 0 },.     
2190: 7b 20 22 74 65 73 74 5f 6f 76 65 72 72 69 64 65  { "test_override
21a0: 5f 73 75 6d 22 2c 20 74 65 73 74 5f 6f 76 65 72  _sum", test_over
21b0: 72 69 64 65 5f 73 75 6d 2c 20 30 20 7d 2c 0a 20  ride_sum, 0 },. 
21c0: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   };.  int i;.  f
21d0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
21e0: 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
21f0: 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
2200: 2b 29 7b 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  +){.    ClientDa
2210: 74 61 20 63 20 3d 20 28 43 6c 69 65 6e 74 44 61  ta c = (ClientDa
2220: 74 61 29 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  ta)SQLITE_INT_TO
2230: 5f 50 54 52 28 61 4f 62 6a 43 6d 64 5b 69 5d 2e  _PTR(aObjCmd[i].
2240: 63 6c 69 65 6e 74 44 61 74 61 29 3b 0a 20 20 20  clientData);.   
2250: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
2260: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f  mmand(interp, aO
2270: 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  bjCmd[i].zName, 
2280: 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  aObjCmd[i].xProc
2290: 2c 20 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , c, 0);.  }.  r
22a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22b0: 23 65 6e 64 69 66 0a                             #endif.