/ Hex Artifact Content
Login

Artifact dc6d256544b1be96312367b24b93a778de8afdfe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 15.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
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 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
01a0: 65 6e 74 20 74 65 73 74 20 69 6e 74 65 72 66 61  ent test interfa
01b0: 63 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 6d 65  ces to the.** me
01c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
01d0: 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a  subsystem..**.**
01e0: 20 24 49 64 3a 20 74 65 73 74 5f 6d 61 6c 6c 6f   $Id: test_mallo
01f0: 63 2e 63 2c 76 20 31 2e 32 35 20 32 30 30 38 2f  c.c,v 1.25 2008/
0200: 30 36 2f 31 39 20 30 30 3a 31 36 3a 30 38 20 64  06/19 00:16:08 d
0210: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
0220: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0230: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c  h".#include "tcl
0240: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
0250: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
0260: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0270: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
0280: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  ./*.** Transform
0290: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 65 78   pointers to tex
02a0: 74 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  t and back again
02b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
02c0: 70 6f 69 6e 74 65 72 54 6f 54 65 78 74 28 76 6f  pointerToText(vo
02d0: 69 64 20 2a 70 2c 20 63 68 61 72 20 2a 7a 29 7b  id *p, char *z){
02e0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
02f0: 63 68 61 72 20 7a 48 65 78 5b 5d 20 3d 20 22 30  char zHex[] = "0
0300: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
0310: 3b 0a 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20 20  ;.  int i, k;.  
0320: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 3b 0a  unsigned int u;.
0330: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
0340: 20 6e 3b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66   n;.  if( sizeof
0350: 28 6e 29 3d 3d 73 69 7a 65 6f 66 28 70 29 20 29  (n)==sizeof(p) )
0360: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 6e 2c  {.    memcpy(&n,
0370: 20 26 70 2c 20 73 69 7a 65 6f 66 28 70 29 29 3b   &p, sizeof(p));
0380: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a  .  }else if( siz
0390: 65 6f 66 28 75 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(u)==sizeof(p
03a0: 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) ){.    memcpy(
03b0: 26 75 2c 20 26 70 2c 20 73 69 7a 65 6f 66 28 75  &u, &p, sizeof(u
03c0: 29 29 3b 0a 20 20 20 20 6e 20 3d 20 75 3b 0a 20  ));.    n = u;. 
03d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
03e0: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 66  rt( 0 );.  }.  f
03f0: 6f 72 28 69 3d 30 2c 20 6b 3d 73 69 7a 65 6f 66  or(i=0, k=sizeof
0400: 28 70 29 2a 32 2d 31 3b 20 69 3c 73 69 7a 65 6f  (p)*2-1; i<sizeo
0410: 66 28 70 29 2a 32 3b 20 69 2b 2b 2c 20 6b 2d 2d  f(p)*2; i++, k--
0420: 29 7b 0a 20 20 20 20 7a 5b 6b 5d 20 3d 20 7a 48  ){.    z[k] = zH
0430: 65 78 5b 6e 26 30 78 66 5d 3b 0a 20 20 20 20 6e  ex[n&0xf];.    n
0440: 20 3e 3e 3d 20 34 3b 0a 20 20 7d 0a 20 20 7a 5b   >>= 4;.  }.  z[
0450: 73 69 7a 65 6f 66 28 70 29 2a 32 5d 20 3d 20 30  sizeof(p)*2] = 0
0460: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 68  ;.}.static int h
0470: 65 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a  exToInt(int h){.
0480: 20 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20    if( h>='0' && 
0490: 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65  h<='9' ){.    re
04a0: 74 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20  turn h - '0';.  
04b0: 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27  }else if( h>='a'
04c0: 20 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20   && h<='f' ){.  
04d0: 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27    return h - 'a'
04e0: 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   + 10;.  }else{.
04f0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
0500: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
0510: 74 65 78 74 54 6f 50 6f 69 6e 74 65 72 28 63 6f  textToPointer(co
0520: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 76 6f 69  nst char *z, voi
0530: 64 20 2a 2a 70 70 29 7b 0a 20 20 73 71 6c 69 74  d **pp){.  sqlit
0540: 65 33 5f 75 69 6e 74 36 34 20 6e 20 3d 20 30 3b  e3_uint64 n = 0;
0550: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
0560: 67 6e 65 64 20 69 6e 74 20 75 3b 0a 20 20 66 6f  gned int u;.  fo
0570: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
0580: 76 6f 69 64 2a 29 2a 32 20 26 26 20 7a 5b 30 5d  void*)*2 && z[0]
0590: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
05a0: 76 3b 0a 20 20 20 20 76 20 3d 20 68 65 78 54 6f  v;.    v = hexTo
05b0: 49 6e 74 28 2a 7a 2b 2b 29 3b 0a 20 20 20 20 69  Int(*z++);.    i
05c0: 66 28 20 76 3c 30 20 29 20 72 65 74 75 72 6e 20  f( v<0 ) return 
05d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 6e  TCL_ERROR;.    n
05e0: 20 3d 20 6e 2a 31 36 20 2b 20 76 3b 0a 20 20 7d   = n*16 + v;.  }
05f0: 0a 20 20 69 66 28 20 2a 7a 21 3d 30 20 29 20 72  .  if( *z!=0 ) r
0600: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0610: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 6e 29  .  if( sizeof(n)
0620: 3d 3d 73 69 7a 65 6f 66 28 2a 70 70 29 20 29 7b  ==sizeof(*pp) ){
0630: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 70 2c 20  .    memcpy(pp, 
0640: 26 6e 2c 20 73 69 7a 65 6f 66 28 6e 29 29 3b 0a  &n, sizeof(n));.
0650: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
0660: 6f 66 28 75 29 3d 3d 73 69 7a 65 6f 66 28 2a 70  of(u)==sizeof(*p
0670: 70 29 20 29 7b 0a 20 20 20 20 75 20 3d 20 28 75  p) ){.    u = (u
0680: 6e 73 69 67 6e 65 64 20 69 6e 74 29 6e 3b 0a 20  nsigned int)n;. 
0690: 20 20 20 6d 65 6d 63 70 79 28 70 70 2c 20 26 75     memcpy(pp, &u
06a0: 2c 20 73 69 7a 65 6f 66 28 75 29 29 3b 0a 20 20  , sizeof(u));.  
06b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
06c0: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 72 65  t( 0 );.  }.  re
06d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
06e0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
06f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 20  sqlite3_malloc  
0700: 4e 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 52 61 77  NBYTES.**.** Raw
0710: 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 20   test interface 
0720: 66 6f 72 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  for sqlite3_mall
0730: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
0740: 69 6e 74 20 74 65 73 74 5f 6d 61 6c 6c 6f 63 28  int test_malloc(
0750: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
0760: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
0770: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
0780: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
0790: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
07a0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
07b0: 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 63 68 61    void *p;.  cha
07c0: 72 20 7a 4f 75 74 5b 31 30 30 5d 3b 0a 20 20 69  r zOut[100];.  i
07d0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
07e0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
07f0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
0800: 6a 76 2c 20 22 4e 42 59 54 45 53 22 29 3b 0a 20  jv, "NBYTES");. 
0810: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0820: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
0830: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
0840: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
0850: 2c 20 26 6e 42 79 74 65 29 20 29 20 72 65 74 75  , &nByte) ) retu
0860: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0870: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
0880: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 6e 42 79  oc((unsigned)nBy
0890: 74 65 29 3b 0a 20 20 70 6f 69 6e 74 65 72 54 6f  te);.  pointerTo
08a0: 54 65 78 74 28 70 2c 20 7a 4f 75 74 29 3b 0a 20  Text(p, zOut);. 
08b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
08c0: 74 28 69 6e 74 65 72 70 2c 20 7a 4f 75 74 2c 20  t(interp, zOut, 
08d0: 4e 55 4c 4c 29 3b 0a 20 20 72 65 74 75 72 6e 20  NULL);.  return 
08e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
08f0: 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74   Usage:    sqlit
0900: 65 33 5f 72 65 61 6c 6c 6f 63 20 20 50 52 49 4f  e3_realloc  PRIO
0910: 52 20 20 4e 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  R  NBYTES.**.** 
0920: 52 61 77 20 74 65 73 74 20 69 6e 74 65 72 66 61  Raw test interfa
0930: 63 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72  ce for sqlite3_r
0940: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  ealloc()..*/.sta
0950: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 61  tic int test_rea
0960: 6c 6c 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  lloc(.  void * c
0970: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
0980: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0990: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
09a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
09b0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  jv[].){.  int nB
09c0: 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 70 50 72  yte;.  void *pPr
09d0: 69 6f 72 2c 20 2a 70 3b 0a 20 20 63 68 61 72 20  ior, *p;.  char 
09e0: 7a 4f 75 74 5b 31 30 30 5d 3b 0a 20 20 69 66 28  zOut[100];.  if(
09f0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
0a00: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
0a10: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
0a20: 2c 20 22 50 52 49 4f 52 20 4e 42 59 54 45 53 22  , "PRIOR NBYTES"
0a30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0a40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
0a50: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
0a60: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
0a70: 76 5b 32 5d 2c 20 26 6e 42 79 74 65 29 20 29 20  v[2], &nByte) ) 
0a80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0a90: 3b 0a 20 20 69 66 28 20 74 65 78 74 54 6f 50 6f  ;.  if( textToPo
0aa0: 69 6e 74 65 72 28 54 63 6c 5f 47 65 74 53 74 72  inter(Tcl_GetStr
0ab0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
0ac0: 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 54 63  Prior) ){.    Tc
0ad0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0ae0: 6e 74 65 72 70 2c 20 22 62 61 64 20 70 6f 69 6e  nterp, "bad poin
0af0: 74 65 72 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53  ter: ", Tcl_GetS
0b00: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
0b10: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
0b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0b30: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
0b40: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 50 72 69 6f  e3_realloc(pPrio
0b50: 72 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 42 79  r, (unsigned)nBy
0b60: 74 65 29 3b 0a 20 20 70 6f 69 6e 74 65 72 54 6f  te);.  pointerTo
0b70: 54 65 78 74 28 70 2c 20 7a 4f 75 74 29 3b 0a 20  Text(p, zOut);. 
0b80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0b90: 74 28 69 6e 74 65 72 70 2c 20 7a 4f 75 74 2c 20  t(interp, zOut, 
0ba0: 4e 55 4c 4c 29 3b 0a 20 20 72 65 74 75 72 6e 20  NULL);.  return 
0bb0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
0bc0: 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69  * Usage:    sqli
0bd0: 74 65 33 5f 66 72 65 65 20 20 50 52 49 4f 52 0a  te3_free  PRIOR.
0be0: 2a 2a 0a 2a 2a 20 52 61 77 20 74 65 73 74 20 69  **.** Raw test i
0bf0: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 73 71 6c  nterface for sql
0c00: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
0c10: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
0c20: 66 72 65 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  free(.  void * c
0c30: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
0c40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0c50: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
0c60: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
0c70: 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  jv[].){.  void *
0c80: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 6f 62  pPrior;.  if( ob
0c90: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
0ca0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
0cb0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
0cc0: 50 52 49 4f 52 22 29 3b 0a 20 20 20 20 72 65 74  PRIOR");.    ret
0cd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0ce0: 20 7d 0a 20 20 69 66 28 20 74 65 78 74 54 6f 50   }.  if( textToP
0cf0: 6f 69 6e 74 65 72 28 54 63 6c 5f 47 65 74 53 74  ointer(Tcl_GetSt
0d00: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
0d10: 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 54  pPrior) ){.    T
0d20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0d30: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 70 6f 69  interp, "bad poi
0d40: 6e 74 65 72 3a 20 22 2c 20 54 63 6c 5f 47 65 74  nter: ", Tcl_Get
0d50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0d60: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
0d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0d80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
0d90: 66 72 65 65 28 70 50 72 69 6f 72 29 3b 0a 20 20  free(pPrior);.  
0da0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
0db0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
0dc0: 75 74 69 6e 65 73 20 61 72 65 20 69 6e 20 74 65  utines are in te
0dd0: 73 74 5f 68 65 78 69 6f 2e 63 0a 2a 2f 0a 69 6e  st_hexio.c.*/.in
0de0: 74 20 73 71 6c 69 74 65 33 54 65 73 74 48 65 78  t sqlite3TestHex
0df0: 54 6f 42 69 6e 28 63 6f 6e 73 74 20 63 68 61 72  ToBin(const char
0e00: 20 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 29   *, int, char *)
0e10: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73  ;.int sqlite3Tes
0e20: 74 42 69 6e 54 6f 48 65 78 28 63 68 61 72 2a 2c  tBinToHex(char*,
0e30: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  int);../*.** Usa
0e40: 67 65 3a 20 20 20 20 6d 65 6d 73 65 74 20 20 41  ge:    memset  A
0e50: 44 44 52 45 53 53 20 20 53 49 5a 45 20 20 48 45  DDRESS  SIZE  HE
0e60: 58 0a 2a 2a 0a 2a 2a 20 53 65 74 20 61 20 63 68  X.**.** Set a ch
0e70: 75 6e 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 28 6f  unk of memory (o
0e80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
0e90: 6c 6f 63 2c 20 70 72 6f 62 61 62 6c 79 29 20 74  loc, probably) t
0ea0: 6f 20 61 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  o a.** specified
0eb0: 20 68 65 78 20 70 61 74 74 65 72 6e 2e 0a 2a 2f   hex pattern..*/
0ec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
0ed0: 5f 6d 65 6d 73 65 74 28 0a 20 20 76 6f 69 64 20  _memset(.  void 
0ee0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
0ef0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0f00: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
0f10: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
0f20: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69   objv[].){.  voi
0f30: 64 20 2a 70 3b 0a 20 20 69 6e 74 20 73 69 7a 65  d *p;.  int size
0f40: 2c 20 6e 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  , n, i;.  char *
0f50: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  zHex;.  char *zO
0f60: 75 74 3b 0a 20 20 63 68 61 72 20 7a 42 69 6e 5b  ut;.  char zBin[
0f70: 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
0f80: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
0f90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
0fa0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 41  erp, 1, objv, "A
0fb0: 44 44 52 45 53 53 20 53 49 5a 45 20 48 45 58 22  DDRESS SIZE HEX"
0fc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0fd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
0fe0: 66 28 20 74 65 78 74 54 6f 50 6f 69 6e 74 65 72  f( textToPointer
0ff0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
1000: 62 6a 76 5b 31 5d 29 2c 20 26 70 29 20 29 7b 0a  bjv[1]), &p) ){.
1010: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1020: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
1030: 64 20 70 6f 69 6e 74 65 72 3a 20 22 2c 20 54 63  d pointer: ", Tc
1040: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1050: 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
1060: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1070: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1080: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1090: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10a0: 32 5d 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20  2], &size) ){.  
10b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  OR;.  }.  if( si
10d0: 7a 65 3c 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  ze<=0 ){.    Tcl
10e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10f0: 74 65 72 70 2c 20 22 73 69 7a 65 20 6d 75 73 74  terp, "size must
1100: 20 62 65 20 70 6f 73 69 74 69 76 65 22 2c 20 28   be positive", (
1110: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
1120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1130: 20 20 7d 0a 20 20 7a 48 65 78 20 3d 20 54 63 6c    }.  zHex = Tcl
1140: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1150: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 3b 0a  j(objv[3], &n);.
1160: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
1170: 42 69 6e 29 2a 32 20 29 20 6e 20 3d 20 73 69 7a  Bin)*2 ) n = siz
1180: 65 6f 66 28 7a 42 69 6e 29 2a 32 3b 0a 20 20 6e  eof(zBin)*2;.  n
1190: 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 48 65   = sqlite3TestHe
11a0: 78 54 6f 42 69 6e 28 7a 48 65 78 2c 20 6e 2c 20  xToBin(zHex, n, 
11b0: 7a 42 69 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  zBin);.  if( n==
11c0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
11d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11e0: 2c 20 22 6e 6f 20 64 61 74 61 22 2c 20 28 63 68  , "no data", (ch
11f0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
1200: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1210: 7d 0a 20 20 7a 4f 75 74 20 3d 20 70 3b 0a 20 20  }.  zOut = p;.  
1220: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1230: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f 75 74 5b   i++){.    zOut[
1240: 69 5d 20 3d 20 7a 42 69 6e 5b 69 25 6e 5d 3b 0a  i] = zBin[i%n];.
1250: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1260: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1270: 61 67 65 3a 20 20 20 20 6d 65 6d 67 65 74 20 20  age:    memget  
1280: 41 44 44 52 45 53 53 20 20 53 49 5a 45 0a 2a 2a  ADDRESS  SIZE.**
1290: 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72  .** Return memor
12a0: 79 20 61 73 20 68 65 78 61 64 65 63 69 6d 61 6c  y as hexadecimal
12b0: 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   text..*/.static
12c0: 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d 67 65 74   int test_memget
12d0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12e0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1300: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1310: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1320: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  .){.  void *p;. 
1330: 20 69 6e 74 20 73 69 7a 65 2c 20 6e 3b 0a 20 20   int size, n;.  
1340: 63 68 61 72 20 2a 7a 42 69 6e 3b 0a 20 20 63 68  char *zBin;.  ch
1350: 61 72 20 7a 48 65 78 5b 31 30 30 5d 3b 0a 0a 20  ar zHex[100];.. 
1360: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1370: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1380: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1390: 6f 62 6a 76 2c 20 22 41 44 44 52 45 53 53 20 53  objv, "ADDRESS S
13a0: 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IZE");.    retur
13b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13c0: 0a 20 20 69 66 28 20 74 65 78 74 54 6f 50 6f 69  .  if( textToPoi
13d0: 6e 74 65 72 28 54 63 6c 5f 47 65 74 53 74 72 69  nter(Tcl_GetStri
13e0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 29  ng(objv[1]), &p)
13f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1400: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1410: 20 22 62 61 64 20 70 6f 69 6e 74 65 72 3a 20 22   "bad pointer: "
1420: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1430: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
1440: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
1450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1460: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1470: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1480: 62 6a 76 5b 32 5d 2c 20 26 73 69 7a 65 29 20 29  bjv[2], &size) )
1490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
14a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
14b0: 28 20 73 69 7a 65 3c 3d 30 20 29 7b 0a 20 20 20  ( size<=0 ){.   
14c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14d0: 74 28 69 6e 74 65 72 70 2c 20 22 73 69 7a 65 20  t(interp, "size 
14e0: 6d 75 73 74 20 62 65 20 70 6f 73 69 74 69 76 65  must be positive
14f0: 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
1500: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1510: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 42 69 6e 20 3d  OR;.  }.  zBin =
1520: 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 73 69 7a   p;.  while( siz
1530: 65 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  e>0 ){.    if( s
1540: 69 7a 65 3e 28 73 69 7a 65 6f 66 28 7a 48 65 78  ize>(sizeof(zHex
1550: 29 2d 31 29 2f 32 20 29 7b 0a 20 20 20 20 20 20  )-1)/2 ){.      
1560: 6e 20 3d 20 28 73 69 7a 65 6f 66 28 7a 48 65 78  n = (sizeof(zHex
1570: 29 2d 31 29 2f 32 3b 0a 20 20 20 20 7d 65 6c 73  )-1)/2;.    }els
1580: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a  e{.      n = siz
1590: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  e;.    }.    mem
15a0: 63 70 79 28 7a 48 65 78 2c 20 7a 42 69 6e 2c 20  cpy(zHex, zBin, 
15b0: 6e 29 3b 0a 20 20 20 20 7a 42 69 6e 20 2b 3d 20  n);.    zBin += 
15c0: 6e 3b 0a 20 20 20 20 73 69 7a 65 20 2d 3d 20 6e  n;.    size -= n
15d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 65 73  ;.    sqlite3Tes
15e0: 74 42 69 6e 54 6f 48 65 78 28 7a 48 65 78 2c 20  tBinToHex(zHex, 
15f0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  n);.    Tcl_Appe
1600: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1610: 20 7a 48 65 78 2c 20 28 63 68 61 72 2a 29 30 29   zHex, (char*)0)
1620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1630: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1640: 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74 65  Usage:    sqlite
1650: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0a 2a 2a  3_memory_used.**
1660: 0a 2a 2a 20 52 61 77 20 74 65 73 74 20 69 6e 74  .** Raw test int
1670: 65 72 66 61 63 65 20 66 6f 72 20 73 71 6c 69 74  erface for sqlit
1680: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
1690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16a0: 74 65 73 74 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  test_memory_used
16b0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16c0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16e0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16f0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1700: 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  .){.  Tcl_SetObj
1710: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1720: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
1730: 28 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f  (sqlite3_memory_
1740: 75 73 65 64 28 29 29 29 3b 0a 20 20 72 65 74 75  used()));.  retu
1750: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1760: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71  .** Usage:    sq
1770: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
1780: 68 77 61 74 65 72 20 3f 52 45 53 45 54 46 4c 41  hwater ?RESETFLA
1790: 47 3f 0a 2a 2a 0a 2a 2a 20 52 61 77 20 74 65 73  G?.**.** Raw tes
17a0: 74 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  t interface for 
17b0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
17c0: 69 67 68 77 61 74 65 72 28 29 2e 0a 2a 2f 0a 73  ighwater()..*/.s
17d0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
17e0: 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28  emory_highwater(
17f0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1800: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1810: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1820: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1830: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1840: 29 7b 0a 20 20 69 6e 74 20 72 65 73 65 74 46 6c  ){.  int resetFl
1850: 61 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62  ag = 0;.  if( ob
1860: 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=1 && objc!=2
1870: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1880: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1890: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 52 45 53 45   1, objv, "?RESE
18a0: 54 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  T?");.    return
18b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18c0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
18d0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
18e0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
18f0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
1900: 26 72 65 73 65 74 46 6c 61 67 29 20 29 20 72 65  &resetFlag) ) re
1910: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1920: 20 20 7d 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62    } .  Tcl_SetOb
1930: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1940: 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64  .     Tcl_NewWid
1950: 65 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  eIntObj(sqlite3_
1960: 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
1970: 28 72 65 73 65 74 46 6c 61 67 29 29 29 3b 0a 20  (resetFlag)));. 
1980: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1990: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
19b0: 62 75 67 5f 62 61 63 6b 74 72 61 63 65 20 44 45  bug_backtrace DE
19c0: 50 54 48 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  PTH.**.** Set th
19d0: 65 20 64 65 70 74 68 20 6f 66 20 62 61 63 6b 74  e depth of backt
19e0: 72 61 63 69 6e 67 2e 20 20 49 66 20 53 51 4c 49  racing.  If SQLI
19f0: 54 45 5f 4d 45 4d 44 45 42 55 47 20 69 73 20 6e  TE_MEMDEBUG is n
1a00: 6f 74 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  ot defined.** th
1a10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1a20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1a30: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
1a40: 65 6d 64 65 62 75 67 5f 62 61 63 6b 74 72 61 63  emdebug_backtrac
1a50: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1a60: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a80: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a90: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1aa0: 5d 0a 29 7b 0a 20 20 69 6e 74 20 64 65 70 74 68  ].){.  int depth
1ab0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1ac0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1ad0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1ae0: 31 2c 20 6f 62 6a 76 2c 20 22 44 45 50 54 22 29  1, objv, "DEPT")
1af0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1b10: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1b20: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1b30: 5b 31 5d 2c 20 26 64 65 70 74 68 29 20 29 20 72  [1], &depth) ) r
1b40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
1b60: 45 4d 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  EMDEBUG.  {.    
1b70: 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
1b80: 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63 6b 74  te3MemdebugBackt
1b90: 72 61 63 65 28 69 6e 74 29 3b 0a 20 20 20 20 73  race(int);.    s
1ba0: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61  qlite3MemdebugBa
1bb0: 63 6b 74 72 61 63 65 28 64 65 70 74 68 29 3b 0a  cktrace(depth);.
1bc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1bd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1be0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73  *.** Usage:    s
1bf0: 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f  qlite3_memdebug_
1c00: 64 75 6d 70 20 20 46 49 4c 45 4e 41 4d 45 0a 2a  dump  FILENAME.*
1c10: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 73 75 6d  *.** Write a sum
1c20: 6d 61 72 79 20 6f 66 20 75 6e 66 72 65 65 64 20  mary of unfreed 
1c30: 6d 65 6d 6f 72 79 20 74 6f 20 46 49 4c 45 4e 41  memory to FILENA
1c40: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
1c50: 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f  t test_memdebug_
1c60: 64 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  dump(.  void * c
1c70: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c90: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1ca0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1cb0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
1cc0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1cd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1ce0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1cf0: 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20  FILENAME");.    
1d00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d10: 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  ;.  }.#if define
1d20: 64 28 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  d(SQLITE_MEMDEBU
1d30: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1d40: 4c 49 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45  LITE_MEMORY_SIZE
1d50: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
1d60: 6e 65 64 28 53 51 4c 49 54 45 5f 50 4f 57 32 5f  ned(SQLITE_POW2_
1d70: 4d 45 4d 4f 52 59 5f 53 49 5a 45 29 0a 20 20 7b  MEMORY_SIZE).  {
1d80: 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1d90: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
1da0: 44 75 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 2a  Dump(const char*
1db0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65  );.    sqlite3Me
1dc0: 6d 64 65 62 75 67 44 75 6d 70 28 54 63 6c 5f 47  mdebugDump(Tcl_G
1dd0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1de0: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
1df0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1e10: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
1e20: 62 75 67 5f 6d 61 6c 6c 6f 63 5f 63 6f 75 6e 74  bug_malloc_count
1e30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1e40: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1e50: 66 20 74 69 6d 65 73 20 6d 61 6c 6c 6f 63 28 29  f times malloc()
1e60: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e80: 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 6d 61  test_memdebug_ma
1e90: 6c 6c 6f 63 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  lloc_count(.  vo
1ea0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1eb0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ec0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1ed0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1ee0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1ef0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 20 3d 20 2d 31  int nMalloc = -1
1f00: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
1f10: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1f20: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1f30: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
1f40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1f50: 4f 52 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69  OR;.  }.#if defi
1f60: 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45 4d 44 45  ned(SQLITE_MEMDE
1f70: 42 55 47 29 0a 20 20 7b 0a 20 20 20 20 65 78 74  BUG).  {.    ext
1f80: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4d  ern int sqlite3M
1f90: 65 6d 64 65 62 75 67 4d 61 6c 6c 6f 63 43 6f 75  emdebugMallocCou
1fa0: 6e 74 28 29 3b 0a 20 20 20 20 6e 4d 61 6c 6c 6f  nt();.    nMallo
1fb0: 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  c = sqlite3Memde
1fc0: 62 75 67 4d 61 6c 6c 6f 63 43 6f 75 6e 74 28 29  bugMallocCount()
1fd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 54  ;.  }.#endif.  T
1fe0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1ff0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
2000: 6e 74 4f 62 6a 28 6e 4d 61 6c 6c 6f 63 29 29 3b  ntObj(nMalloc));
2010: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2020: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
2030: 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65  e:    sqlite3_me
2040: 6d 64 65 62 75 67 5f 66 61 69 6c 20 20 43 4f 55  mdebug_fail  COU
2050: 4e 54 45 52 20 20 3f 4f 50 54 49 4f 4e 53 3f 0a  NTER  ?OPTIONS?.
2060: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 6f 70 74 69  **.** where opti
2070: 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  ons are:.**.**  
2080: 20 20 20 2d 72 65 70 65 61 74 20 20 20 20 3c 63     -repeat    <c
2090: 6f 75 6e 74 3e 0a 2a 2a 20 20 20 20 20 2d 62 65  ount>.**     -be
20a0: 6e 69 67 6e 63 6e 74 20 3c 76 61 72 6e 61 6d 65  nigncnt <varname
20b0: 3e 0a 2a 2a 0a 2a 2a 20 41 72 72 61 6e 67 65 20  >.**.** Arrange 
20c0: 66 6f 72 20 61 20 73 69 6d 75 6c 61 74 65 64 20  for a simulated 
20d0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
20e0: 20 61 66 74 65 72 20 43 4f 55 4e 54 45 52 20 73   after COUNTER s
20f0: 75 63 63 65 73 73 65 73 2e 0a 2a 2a 20 49 66 20  uccesses..** If 
2100: 61 20 72 65 70 65 61 74 20 63 6f 75 6e 74 20 69  a repeat count i
2110: 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  s specified, the
2120: 20 66 61 75 6c 74 20 69 73 20 72 65 70 65 61 74   fault is repeat
2130: 65 64 20 74 68 61 74 20 6d 61 6e 79 0a 2a 2a 20  ed that many.** 
2140: 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  times..**.** Eac
2150: 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  h call to this r
2160: 6f 75 74 69 6e 65 20 6f 76 65 72 72 69 64 65 73  outine overrides
2170: 20 74 68 65 20 70 72 69 6f 72 20 63 6f 75 6e 74   the prior count
2180: 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 69  er value..** Thi
2190: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
21a0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
21b0: 73 69 6d 75 6c 61 74 65 64 20 66 61 69 6c 75 72  simulated failur
21c0: 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
21d0: 68 61 70 70 65 6e 65 64 20 73 69 6e 63 65 20 74  happened since t
21e0: 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c  he previous call
21f0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
2200: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 64 69 73 61 62  ..**.** To disab
2210: 6c 65 20 73 69 6d 75 6c 61 74 65 64 20 66 61 69  le simulated fai
2220: 6c 75 72 65 73 2c 20 75 73 65 20 61 20 43 4f 55  lures, use a COU
2230: 4e 54 45 52 20 6f 66 20 2d 31 2e 0a 2a 2f 0a 73  NTER of -1..*/.s
2240: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
2250: 65 6d 64 65 62 75 67 5f 66 61 69 6c 28 0a 20 20  emdebug_fail(.  
2260: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
2270: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2280: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2290: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
22a0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
22b0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
22c0: 69 46 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 52 65  iFail;.  int nRe
22d0: 70 65 61 74 20 3d 20 31 3b 0a 20 20 54 63 6c 5f  peat = 1;.  Tcl_
22e0: 4f 62 6a 20 2a 70 42 65 6e 69 67 6e 43 6e 74 20  Obj *pBenignCnt 
22f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 65 6e 69  = 0;.  int nBeni
2300: 67 6e 3b 0a 20 20 69 6e 74 20 6e 46 61 69 6c 20  gn;.  int nFail 
2310: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
2320: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
2330: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2340: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 55  p, 1, objv, "COU
2350: 4e 54 45 52 20 3f 4f 50 54 49 4f 4e 53 3f 22 29  NTER ?OPTIONS?")
2360: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2370: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2380: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2390: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
23a0: 5b 31 5d 2c 20 26 69 46 61 69 6c 29 20 29 20 72  [1], &iFail) ) r
23b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23c0: 0a 0a 20 20 66 6f 72 28 69 69 3d 32 3b 20 69 69  ..  for(ii=2; ii
23d0: 3c 6f 62 6a 63 3b 20 69 69 2b 3d 32 29 7b 0a 20  <objc; ii+=2){. 
23e0: 20 20 20 69 6e 74 20 6e 4f 70 74 69 6f 6e 3b 0a     int nOption;.
23f0: 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 69 6f      char *zOptio
2400: 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  n = Tcl_GetStrin
2410: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 69  gFromObj(objv[ii
2420: 5d 2c 20 26 6e 4f 70 74 69 6f 6e 29 3b 0a 20 20  ], &nOption);.  
2430: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2440: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 70 74 69  ;..    if( nOpti
2450: 6f 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28  on>1 && strncmp(
2460: 7a 4f 70 74 69 6f 6e 2c 20 22 2d 72 65 70 65 61  zOption, "-repea
2470: 74 22 2c 20 6e 4f 70 74 69 6f 6e 29 3d 3d 30 20  t", nOption)==0 
2480: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 69 3d  ){.      if( ii=
2490: 3d 28 6f 62 6a 63 2d 31 29 20 29 7b 0a 20 20 20  =(objc-1) ){.   
24a0: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 6f 70 74       zErr = "opt
24b0: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
24c0: 61 72 67 75 6d 65 6e 74 3a 20 22 3b 0a 20 20 20  argument: ";.   
24d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24e0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
24f0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2500: 6f 62 6a 76 5b 69 69 2b 31 5d 2c 20 26 6e 52 65  objv[ii+1], &nRe
2510: 70 65 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  peat) ){.       
2520: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2530: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
2540: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2550: 20 69 66 28 20 6e 4f 70 74 69 6f 6e 3e 31 20 26   if( nOption>1 &
2560: 26 20 73 74 72 6e 63 6d 70 28 7a 4f 70 74 69 6f  & strncmp(zOptio
2570: 6e 2c 20 22 2d 62 65 6e 69 67 6e 63 6e 74 22 2c  n, "-benigncnt",
2580: 20 6e 4f 70 74 69 6f 6e 29 3d 3d 30 20 29 7b 0a   nOption)==0 ){.
2590: 20 20 20 20 20 20 69 66 28 20 69 69 3d 3d 28 6f        if( ii==(o
25a0: 62 6a 63 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  bjc-1) ){.      
25b0: 20 20 7a 45 72 72 20 3d 20 22 6f 70 74 69 6f 6e    zErr = "option
25c0: 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
25d0: 75 6d 65 6e 74 3a 20 22 3b 0a 20 20 20 20 20 20  ument: ";.      
25e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
25f0: 42 65 6e 69 67 6e 43 6e 74 20 3d 20 6f 62 6a 76  BenignCnt = objv
2600: 5b 69 69 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  [ii+1];.      }.
2610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2620: 20 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e   zErr = "unknown
2630: 20 6f 70 74 69 6f 6e 3a 20 22 3b 0a 20 20 20 20   option: ";.    
2640: 7d 0a 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20  }..    if( zErr 
2650: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
2660: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2670: 2c 20 7a 45 72 72 2c 20 7a 4f 70 74 69 6f 6e 2c  , zErr, zOption,
2680: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
2690: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
26a0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69   }.  }.  .  sqli
26b0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
26c0: 28 2d 31 32 33 34 35 29 3b 20 2f 2a 20 4a 75 73  (-12345); /* Jus
26d0: 74 20 74 6f 20 73 74 72 65 73 73 20 74 68 65 20  t to stress the 
26e0: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  test_control int
26f0: 65 72 66 61 63 65 20 2a 2f 0a 20 20 6e 42 65 6e  erface */.  nBen
2700: 69 67 6e 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  ign = sqlite3_te
2710: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2720: 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54  E_TESTCTRL_FAULT
2730: 5f 42 45 4e 49 47 4e 5f 46 41 49 4c 55 52 45 53  _BENIGN_FAILURES
2740: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 53 51 4c 49 54 45 5f 46 41 55 4c 54 49     SQLITE_FAULTI
2770: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b  NJECTOR_MALLOC);
2780: 0a 20 20 6e 46 61 69 6c 20 3d 20 73 71 6c 69 74  .  nFail = sqlit
2790: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
27a0: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
27b0: 46 41 55 4c 54 5f 46 41 49 4c 55 52 45 53 2c 0a  FAULT_FAILURES,.
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
27e0: 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43  QLITE_FAULTINJEC
27f0: 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 73  TOR_MALLOC);.  s
2800: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2810: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2820: 54 52 4c 5f 46 41 55 4c 54 5f 43 4f 4e 46 49 47  TRL_FAULT_CONFIG
2830: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2840: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2850: 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41  FAULTINJECTOR_MA
2860: 4c 4c 4f 43 2c 20 69 46 61 69 6c 2c 20 6e 52 65  LLOC, iFail, nRe
2870: 70 65 61 74 29 3b 0a 20 20 69 66 28 20 70 42 65  peat);.  if( pBe
2880: 6e 69 67 6e 43 6e 74 20 29 7b 0a 20 20 20 20 54  nignCnt ){.    T
2890: 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
28a0: 74 65 72 70 2c 20 70 42 65 6e 69 67 6e 43 6e 74  terp, pBenignCnt
28b0: 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  , 0, Tcl_NewIntO
28c0: 62 6a 28 6e 42 65 6e 69 67 6e 29 2c 20 30 29 3b  bj(nBenign), 0);
28d0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
28e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
28f0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 46  Tcl_NewIntObj(nF
2900: 61 69 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ail));.  return 
2910: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2920: 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74   Usage:    sqlit
2930: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 70 65 6e 64  e3_memdebug_pend
2940: 69 6e 67 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ing.**.** Return
2950: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
2960: 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 73 20 74 68  alloc() calls th
2970: 61 74 20 77 69 6c 6c 20 73 75 63 63 65 65 64 20  at will succeed 
2980: 62 65 66 6f 72 65 20 61 20 0a 2a 2a 20 73 69 6d  before a .** sim
2990: 75 6c 61 74 65 64 20 66 61 69 6c 75 72 65 20 6f  ulated failure o
29a0: 63 63 75 72 73 2e 20 41 20 6e 65 67 61 74 69 76  ccurs. A negativ
29b0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
29c0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
29d0: 20 6e 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   no malloc() fai
29e0: 6c 75 72 65 20 69 73 20 73 63 68 65 64 75 6c 65  lure is schedule
29f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2a00: 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 70   test_memdebug_p
2a10: 65 6e 64 69 6e 67 28 0a 20 20 76 6f 69 64 20 2a  ending(.  void *
2a20: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2a30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a40: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2a50: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2a60: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2a70: 6e 50 65 6e 64 69 6e 67 3b 0a 20 20 69 66 28 20  nPending;.  if( 
2a80: 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
2a90: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2aa0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2ab0: 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
2ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2ad0: 20 20 6e 50 65 6e 64 69 6e 67 20 3d 20 73 71 6c    nPending = sql
2ae0: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2af0: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2b00: 4c 5f 46 41 55 4c 54 5f 50 45 4e 44 49 4e 47 2c  L_FAULT_PENDING,
2b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 53 51 4c 49 54 45 5f 46 41 55 4c 54 49     SQLITE_FAULTI
2b40: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b  NJECTOR_MALLOC);
2b50: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
2b60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2b70: 4e 65 77 49 6e 74 4f 62 6a 28 6e 50 65 6e 64 69  NewIntObj(nPendi
2b80: 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ng));.  return T
2b90: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
2ba0: 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74   Usage:    sqlit
2bb0: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 73 65 74 74  e3_memdebug_sett
2bc0: 69 74 6c 65 20 54 49 54 4c 45 0a 2a 2a 0a 2a 2a  itle TITLE.**.**
2bd0: 20 53 65 74 20 61 20 74 69 74 6c 65 20 73 74 72   Set a title str
2be0: 69 6e 67 20 73 74 6f 72 65 64 20 77 69 74 68 20  ing stored with 
2bf0: 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  each allocation.
2c00: 20 20 54 68 65 20 54 49 54 4c 45 20 69 73 0a 2a    The TITLE is.*
2c10: 2a 20 74 79 70 69 63 61 6c 6c 79 20 74 68 65 20  * typically the 
2c20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 73 74  name of the test
2c30: 20 74 68 61 74 20 77 61 73 20 72 75 6e 6e 69 6e   that was runnin
2c40: 67 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 61 6c  g when the.** al
2c50: 6c 6f 63 61 74 69 6f 6e 20 6f 63 63 75 72 72 65  location occurre
2c60: 64 2e 20 20 54 68 65 20 54 49 54 4c 45 20 69 73  d.  The TITLE is
2c70: 20 73 74 6f 72 65 64 20 77 69 74 68 20 74 68 65   stored with the
2c80: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 61   allocation.** a
2c90: 6e 64 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  nd can be used t
2ca0: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 69  o figure out whi
2cb0: 63 68 20 74 65 73 74 73 20 61 72 65 20 6c 65 61  ch tests are lea
2cc0: 6b 69 6e 67 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  king memory..**.
2cd0: 2a 2a 20 45 61 63 68 20 74 69 74 6c 65 20 6f 76  ** Each title ov
2ce0: 65 72 77 72 69 74 65 20 74 68 65 20 70 72 65 76  erwrite the prev
2cf0: 69 6f 75 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ious..*/.static 
2d00: 69 6e 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75  int test_memdebu
2d10: 67 5f 73 65 74 74 69 74 6c 65 28 0a 20 20 76 6f  g_settitle(.  vo
2d20: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2d30: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2d40: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2d50: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2d60: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2d70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74  const char *zTit
2d80: 6c 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  le;.  if( objc!=
2d90: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2da0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2db0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54 49 54 4c  , 1, objv, "TITL
2dc0: 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
2dd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2de0: 20 7a 54 69 74 6c 65 20 3d 20 54 63 6c 5f 47 65   zTitle = Tcl_Ge
2df0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2e00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2e10: 4d 45 4d 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  MEMDEBUG.  {.   
2e20: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2e30: 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 74 69  te3MemdebugSetti
2e40: 74 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  tle(const char*)
2e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d  ;.    sqlite3Mem
2e60: 64 65 62 75 67 53 65 74 74 69 74 6c 65 28 7a 54  debugSettitle(zT
2e70: 69 74 6c 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  itle);.  }.#endi
2e80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
2e90: 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4d 41  K;.}..#define MA
2ea0: 4c 4c 4f 43 5f 4c 4f 47 5f 46 52 41 4d 45 53 20  LLOC_LOG_FRAMES 
2eb0: 31 30 20 0a 73 74 61 74 69 63 20 54 63 6c 5f 48  10 .static Tcl_H
2ec0: 61 73 68 54 61 62 6c 65 20 61 4d 61 6c 6c 6f 63  ashTable aMalloc
2ed0: 4c 6f 67 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  Log;.static int 
2ee0: 6d 61 6c 6c 6f 63 4c 6f 67 45 6e 61 62 6c 65 64  mallocLogEnabled
2ef0: 20 3d 20 30 3b 0a 0a 74 79 70 65 64 65 66 20 73   = 0;..typedef s
2f00: 74 72 75 63 74 20 4d 61 6c 6c 6f 63 4c 6f 67 20  truct MallocLog 
2f10: 4d 61 6c 6c 6f 63 4c 6f 67 3b 0a 73 74 72 75 63  MallocLog;.struc
2f20: 74 20 4d 61 6c 6c 6f 63 4c 6f 67 20 7b 0a 20 20  t MallocLog {.  
2f30: 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20 20 69 6e 74  int nCall;.  int
2f40: 20 6e 42 79 74 65 3b 0a 7d 3b 0a 0a 23 69 66 64   nByte;.};..#ifd
2f50: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
2f60: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  UG.static void t
2f70: 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 63 61 6c  est_memdebug_cal
2f80: 6c 62 61 63 6b 28 69 6e 74 20 6e 42 79 74 65 2c  lback(int nByte,
2f90: 20 69 6e 74 20 6e 46 72 61 6d 65 2c 20 76 6f 69   int nFrame, voi
2fa0: 64 20 2a 2a 61 46 72 61 6d 65 29 7b 0a 20 20 69  d **aFrame){.  i
2fb0: 66 28 20 6d 61 6c 6c 6f 63 4c 6f 67 45 6e 61 62  f( mallocLogEnab
2fc0: 6c 65 64 20 29 7b 0a 20 20 20 20 4d 61 6c 6c 6f  led ){.    Mallo
2fd0: 63 4c 6f 67 20 2a 70 4c 6f 67 3b 0a 20 20 20 20  cLog *pLog;.    
2fe0: 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 70  Tcl_HashEntry *p
2ff0: 45 6e 74 72 79 3b 0a 20 20 20 20 69 6e 74 20 69  Entry;.    int i
3000: 73 4e 65 77 3b 0a 0a 20 20 20 20 69 6e 74 20 61  sNew;..    int a
3010: 4b 65 79 5b 4d 41 4c 4c 4f 43 5f 4c 4f 47 5f 46  Key[MALLOC_LOG_F
3020: 52 41 4d 45 53 5d 3b 0a 20 20 20 20 69 6e 74 20  RAMES];.    int 
3030: 6e 4b 65 79 20 3d 20 73 69 7a 65 6f 66 28 69 6e  nKey = sizeof(in
3040: 74 29 2a 4d 41 4c 4c 4f 43 5f 4c 4f 47 5f 46 52  t)*MALLOC_LOG_FR
3050: 41 4d 45 53 3b 0a 0a 20 20 20 20 6d 65 6d 73 65  AMES;..    memse
3060: 74 28 61 4b 65 79 2c 20 30 2c 20 6e 4b 65 79 29  t(aKey, 0, nKey)
3070: 3b 0a 20 20 20 20 69 66 28 20 28 73 69 7a 65 6f  ;.    if( (sizeo
3080: 66 28 76 6f 69 64 2a 29 2a 6e 46 72 61 6d 65 29  f(void*)*nFrame)
3090: 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  <nKey ){.      n
30a0: 4b 65 79 20 3d 20 6e 46 72 61 6d 65 2a 73 69 7a  Key = nFrame*siz
30b0: 65 6f 66 28 76 6f 69 64 2a 29 3b 0a 20 20 20 20  eof(void*);.    
30c0: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 4b 65  }.    memcpy(aKe
30d0: 79 2c 20 61 46 72 61 6d 65 2c 20 6e 4b 65 79 29  y, aFrame, nKey)
30e0: 3b 0a 0a 20 20 20 20 70 45 6e 74 72 79 20 3d 20  ;..    pEntry = 
30f0: 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68 45 6e  Tcl_CreateHashEn
3100: 74 72 79 28 26 61 4d 61 6c 6c 6f 63 4c 6f 67 2c  try(&aMallocLog,
3110: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 61   (const char *)a
3120: 4b 65 79 2c 20 26 69 73 4e 65 77 29 3b 0a 20 20  Key, &isNew);.  
3130: 20 20 69 66 28 20 69 73 4e 65 77 20 29 7b 0a 20    if( isNew ){. 
3140: 20 20 20 20 20 70 4c 6f 67 20 3d 20 28 4d 61 6c       pLog = (Mal
3150: 6c 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 41 6c 6c  locLog *)Tcl_All
3160: 6f 63 28 73 69 7a 65 6f 66 28 4d 61 6c 6c 6f 63  oc(sizeof(Malloc
3170: 4c 6f 67 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Log));.      mem
3180: 73 65 74 28 70 4c 6f 67 2c 20 30 2c 20 73 69 7a  set(pLog, 0, siz
3190: 65 6f 66 28 4d 61 6c 6c 6f 63 4c 6f 67 29 29 3b  eof(MallocLog));
31a0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 48 61  .      Tcl_SetHa
31b0: 73 68 56 61 6c 75 65 28 70 45 6e 74 72 79 2c 20  shValue(pEntry, 
31c0: 28 43 6c 69 65 6e 74 44 61 74 61 29 70 4c 6f 67  (ClientData)pLog
31d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
31e0: 20 20 20 20 70 4c 6f 67 20 3d 20 28 4d 61 6c 6c      pLog = (Mall
31f0: 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 47 65 74 48  ocLog *)Tcl_GetH
3200: 61 73 68 56 61 6c 75 65 28 70 45 6e 74 72 79 29  ashValue(pEntry)
3210: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4c 6f  ;.    }..    pLo
3220: 67 2d 3e 6e 43 61 6c 6c 2b 2b 3b 0a 20 20 20 20  g->nCall++;.    
3230: 70 4c 6f 67 2d 3e 6e 42 79 74 65 20 2b 3d 20 6e  pLog->nByte += n
3240: 42 79 74 65 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Byte;.  }.}.#end
3250: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 45 4d  if /* SQLITE_MEM
3260: 44 45 42 55 47 20 2a 2f 0a 0a 73 74 61 74 69 63  DEBUG */..static
3270: 20 76 6f 69 64 20 74 65 73 74 5f 6d 65 6d 64 65   void test_memde
3280: 62 75 67 5f 6c 6f 67 5f 63 6c 65 61 72 28 29 7b  bug_log_clear(){
3290: 0a 20 20 54 63 6c 5f 48 61 73 68 53 65 61 72 63  .  Tcl_HashSearc
32a0: 68 20 73 65 61 72 63 68 3b 0a 20 20 54 63 6c 5f  h search;.  Tcl_
32b0: 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74 72  HashEntry *pEntr
32c0: 79 3b 0a 20 20 66 6f 72 28 0a 20 20 20 20 70 45  y;.  for(.    pE
32d0: 6e 74 72 79 3d 54 63 6c 5f 46 69 72 73 74 48 61  ntry=Tcl_FirstHa
32e0: 73 68 45 6e 74 72 79 28 26 61 4d 61 6c 6c 6f 63  shEntry(&aMalloc
32f0: 4c 6f 67 2c 20 26 73 65 61 72 63 68 29 3b 0a 20  Log, &search);. 
3300: 20 20 20 70 45 6e 74 72 79 3b 0a 20 20 20 20 70     pEntry;.    p
3310: 45 6e 74 72 79 3d 54 63 6c 5f 4e 65 78 74 48 61  Entry=Tcl_NextHa
3320: 73 68 45 6e 74 72 79 28 26 73 65 61 72 63 68 29  shEntry(&search)
3330: 0a 20 20 29 7b 0a 20 20 20 20 4d 61 6c 6c 6f 63  .  ){.    Malloc
3340: 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 4d 61 6c  Log *pLog = (Mal
3350: 6c 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 47 65 74  locLog *)Tcl_Get
3360: 48 61 73 68 56 61 6c 75 65 28 70 45 6e 74 72 79  HashValue(pEntry
3370: 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  );.    Tcl_Free(
3380: 28 63 68 61 72 20 2a 29 70 4c 6f 67 29 3b 0a 20  (char *)pLog);. 
3390: 20 7d 0a 20 20 54 63 6c 5f 44 65 6c 65 74 65 48   }.  Tcl_DeleteH
33a0: 61 73 68 54 61 62 6c 65 28 26 61 4d 61 6c 6c 6f  ashTable(&aMallo
33b0: 63 4c 6f 67 29 3b 0a 20 20 54 63 6c 5f 49 6e 69  cLog);.  Tcl_Ini
33c0: 74 48 61 73 68 54 61 62 6c 65 28 26 61 4d 61 6c  tHashTable(&aMal
33d0: 6c 6f 63 4c 6f 67 2c 20 4d 41 4c 4c 4f 43 5f 4c  locLog, MALLOC_L
33e0: 4f 47 5f 46 52 41 4d 45 53 29 3b 0a 7d 0a 0a 73  OG_FRAMES);.}..s
33f0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
3400: 65 6d 64 65 62 75 67 5f 6c 6f 67 28 0a 20 20 76  emdebug_log(.  v
3410: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
3420: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3430: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
3440: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
3450: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
3460: 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e   static int isIn
3470: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53  it = 0;.  int iS
3480: 75 62 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f  ub;..  static co
3490: 6e 73 74 20 63 68 61 72 20 2a 4d 42 5f 73 74 72  nst char *MB_str
34a0: 73 5b 5d 20 3d 20 7b 20 22 73 74 61 72 74 22 2c  s[] = { "start",
34b0: 20 22 73 74 6f 70 22 2c 20 22 64 75 6d 70 22 2c   "stop", "dump",
34c0: 20 22 63 6c 65 61 72 22 2c 20 22 73 79 6e 63 22   "clear", "sync"
34d0: 20 7d 3b 0a 20 20 65 6e 75 6d 20 4d 42 5f 65 6e   };.  enum MB_en
34e0: 75 6d 20 7b 20 0a 20 20 20 20 20 20 4d 42 5f 4c  um { .      MB_L
34f0: 4f 47 5f 53 54 41 52 54 2c 20 4d 42 5f 4c 4f 47  OG_START, MB_LOG
3500: 5f 53 54 4f 50 2c 20 4d 42 5f 4c 4f 47 5f 44 55  _STOP, MB_LOG_DU
3510: 4d 50 2c 20 4d 42 5f 4c 4f 47 5f 43 4c 45 41 52  MP, MB_LOG_CLEAR
3520: 2c 20 4d 42 5f 4c 4f 47 5f 53 59 4e 43 20 0a 20  , MB_LOG_SYNC . 
3530: 20 7d 3b 0a 0a 20 20 69 66 28 20 21 69 73 49 6e   };..  if( !isIn
3540: 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  it ){.#ifdef SQL
3550: 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20  ITE_MEMDEBUG.   
3560: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
3570: 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63 6b  ite3MemdebugBack
3580: 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 0a 20  traceCallback(. 
3590: 20 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 42         void (*xB
35a0: 61 63 6b 74 72 61 63 65 29 28 69 6e 74 2c 20 69  acktrace)(int, i
35b0: 6e 74 2c 20 76 6f 69 64 20 2a 2a 29 29 3b 0a 20  nt, void **));. 
35c0: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62     sqlite3Memdeb
35d0: 75 67 42 61 63 6b 74 72 61 63 65 43 61 6c 6c 62  ugBacktraceCallb
35e0: 61 63 6b 28 74 65 73 74 5f 6d 65 6d 64 65 62 75  ack(test_memdebu
35f0: 67 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e  g_callback);.#en
3600: 64 69 66 0a 20 20 20 20 54 63 6c 5f 49 6e 69 74  dif.    Tcl_Init
3610: 48 61 73 68 54 61 62 6c 65 28 26 61 4d 61 6c 6c  HashTable(&aMall
3620: 6f 63 4c 6f 67 2c 20 4d 41 4c 4c 4f 43 5f 4c 4f  ocLog, MALLOC_LO
3630: 47 5f 46 52 41 4d 45 53 29 3b 0a 20 20 20 20 69  G_FRAMES);.    i
3640: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 0a  sInit = 1;.  }..
3650: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
3660: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
3670: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
3680: 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41  objv, "SUB-COMMA
3690: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d 0a 20 20  ND ...");.  }.  
36a0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
36b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
36c0: 6f 62 6a 76 5b 31 5d 2c 20 4d 42 5f 73 74 72 73  objv[1], MB_strs
36d0: 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c  , "sub-command",
36e0: 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20 20   0, &iSub) ){.  
36f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
3700: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  OR;.  }..  switc
3710: 68 28 20 28 65 6e 75 6d 20 4d 42 5f 65 6e 75 6d  h( (enum MB_enum
3720: 29 69 53 75 62 20 29 7b 0a 20 20 20 20 63 61 73  )iSub ){.    cas
3730: 65 20 4d 42 5f 4c 4f 47 5f 53 54 41 52 54 3a 0a  e MB_LOG_START:.
3740: 20 20 20 20 20 20 6d 61 6c 6c 6f 63 4c 6f 67 45        mallocLogE
3750: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  nabled = 1;.    
3760: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
3770: 65 20 4d 42 5f 4c 4f 47 5f 53 54 4f 50 3a 0a 20  e MB_LOG_STOP:. 
3780: 20 20 20 20 20 6d 61 6c 6c 6f 63 4c 6f 67 45 6e       mallocLogEn
3790: 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  abled = 0;.     
37a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
37b0: 20 4d 42 5f 4c 4f 47 5f 44 55 4d 50 3a 20 7b 0a   MB_LOG_DUMP: {.
37c0: 20 20 20 20 20 20 54 63 6c 5f 48 61 73 68 53 65        Tcl_HashSe
37d0: 61 72 63 68 20 73 65 61 72 63 68 3b 0a 20 20 20  arch search;.   
37e0: 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79     Tcl_HashEntry
37f0: 20 2a 70 45 6e 74 72 79 3b 0a 20 20 20 20 20 20   *pEntry;.      
3800: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
3810: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 0a 20  Tcl_NewObj();.. 
3820: 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65       assert(size
3830: 6f 66 28 69 6e 74 29 3d 3d 73 69 7a 65 6f 66 28  of(int)==sizeof(
3840: 76 6f 69 64 2a 29 29 3b 0a 0a 20 20 20 20 20 20  void*));..      
3850: 66 6f 72 28 0a 20 20 20 20 20 20 20 20 70 45 6e  for(.        pEn
3860: 74 72 79 3d 54 63 6c 5f 46 69 72 73 74 48 61 73  try=Tcl_FirstHas
3870: 68 45 6e 74 72 79 28 26 61 4d 61 6c 6c 6f 63 4c  hEntry(&aMallocL
3880: 6f 67 2c 20 26 73 65 61 72 63 68 29 3b 0a 20 20  og, &search);.  
3890: 20 20 20 20 20 20 70 45 6e 74 72 79 3b 0a 20 20        pEntry;.  
38a0: 20 20 20 20 20 20 70 45 6e 74 72 79 3d 54 63 6c        pEntry=Tcl
38b0: 5f 4e 65 78 74 48 61 73 68 45 6e 74 72 79 28 26  _NextHashEntry(&
38c0: 73 65 61 72 63 68 29 0a 20 20 20 20 20 20 29 7b  search).      ){
38d0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
38e0: 20 2a 61 70 45 6c 65 6d 5b 4d 41 4c 4c 4f 43 5f   *apElem[MALLOC_
38f0: 4c 4f 47 5f 46 52 41 4d 45 53 2b 32 5d 3b 0a 20  LOG_FRAMES+2];. 
3900: 20 20 20 20 20 20 20 4d 61 6c 6c 6f 63 4c 6f 67         MallocLog
3910: 20 2a 70 4c 6f 67 20 3d 20 28 4d 61 6c 6c 6f 63   *pLog = (Malloc
3920: 4c 6f 67 20 2a 29 54 63 6c 5f 47 65 74 48 61 73  Log *)Tcl_GetHas
3930: 68 56 61 6c 75 65 28 70 45 6e 74 72 79 29 3b 0a  hValue(pEntry);.
3940: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 4b 65          int *aKe
3950: 79 20 3d 20 28 69 6e 74 20 2a 29 54 63 6c 5f 47  y = (int *)Tcl_G
3960: 65 74 48 61 73 68 4b 65 79 28 26 61 4d 61 6c 6c  etHashKey(&aMall
3970: 6f 63 4c 6f 67 2c 20 70 45 6e 74 72 79 29 3b 0a  ocLog, pEntry);.
3980: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
3990: 20 20 0a 20 20 20 20 20 20 20 20 61 70 45 6c 65    .        apEle
39a0: 6d 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  m[0] = Tcl_NewIn
39b0: 74 4f 62 6a 28 70 4c 6f 67 2d 3e 6e 43 61 6c 6c  tObj(pLog->nCall
39c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 70 45 6c 65  );.        apEle
39d0: 6d 5b 31 5d 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  m[1] = Tcl_NewIn
39e0: 74 4f 62 6a 28 70 4c 6f 67 2d 3e 6e 42 79 74 65  tObj(pLog->nByte
39f0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
3a00: 69 3d 30 3b 20 69 69 3c 4d 41 4c 4c 4f 43 5f 4c  i=0; ii<MALLOC_L
3a10: 4f 47 5f 46 52 41 4d 45 53 3b 20 69 69 2b 2b 29  OG_FRAMES; ii++)
3a20: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 45 6c  {.          apEl
3a30: 65 6d 5b 69 69 2b 32 5d 20 3d 20 54 63 6c 5f 4e  em[ii+2] = Tcl_N
3a40: 65 77 49 6e 74 4f 62 6a 28 61 4b 65 79 5b 69 69  ewIntObj(aKey[ii
3a50: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ]);.        }.. 
3a60: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
3a70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3a80: 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 0a 20 20  interp, pRet,.  
3a90: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65            Tcl_Ne
3aa0: 77 4c 69 73 74 4f 62 6a 28 4d 41 4c 4c 4f 43 5f  wListObj(MALLOC_
3ab0: 4c 4f 47 5f 46 52 41 4d 45 53 2b 32 2c 20 61 70  LOG_FRAMES+2, ap
3ac0: 45 6c 65 6d 29 0a 20 20 20 20 20 20 20 20 29 3b  Elem).        );
3ad0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
3ae0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
3af0: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
3b00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b10: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 42 5f 4c   }.    case MB_L
3b20: 4f 47 5f 43 4c 45 41 52 3a 20 7b 0a 20 20 20 20  OG_CLEAR: {.    
3b30: 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f    test_memdebug_
3b40: 6c 6f 67 5f 63 6c 65 61 72 28 29 3b 0a 20 20 20  log_clear();.   
3b50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3b60: 0a 20 20 20 20 63 61 73 65 20 4d 42 5f 4c 4f 47  .    case MB_LOG
3b70: 5f 53 59 4e 43 3a 20 7b 0a 23 69 66 64 65 66 20  _SYNC: {.#ifdef 
3b80: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a  SQLITE_MEMDEBUG.
3b90: 20 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69        extern voi
3ba0: 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  d sqlite3Memdebu
3bb0: 67 53 79 6e 63 28 29 3b 0a 20 20 20 20 20 20 74  gSync();.      t
3bc0: 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 6c 6f 67  est_memdebug_log
3bd0: 5f 63 6c 65 61 72 28 29 3b 0a 20 20 20 20 20 20  _clear();.      
3be0: 6d 61 6c 6c 6f 63 4c 6f 67 45 6e 61 62 6c 65 64  mallocLogEnabled
3bf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
3c00: 74 65 33 4d 65 6d 64 65 62 75 67 53 79 6e 63 28  te3MemdebugSync(
3c10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
3c20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3c30: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
3c40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3c50: 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  e:    sqlite3_co
3c60: 6e 66 69 67 5f 73 63 72 61 74 63 68 20 53 49 5a  nfig_scratch SIZ
3c70: 45 20 4e 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  E N.**.** Set th
3c80: 65 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  e scratch memory
3c90: 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 53 51   buffer using SQ
3ca0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
3cb0: 54 43 48 2e 0a 2a 2a 20 54 68 65 20 62 75 66 66  TCH..** The buff
3cc0: 65 72 20 69 73 20 73 74 61 74 69 63 20 61 6e 64  er is static and
3cd0: 20 69 73 20 6f 66 20 6c 69 6d 69 74 65 64 20 73   is of limited s
3ce0: 69 7a 65 2e 20 20 4e 20 6d 69 67 68 74 20 62 65  ize.  N might be
3cf0: 0a 2a 2a 20 61 64 6a 75 73 74 65 64 20 64 6f 77  .** adjusted dow
3d00: 6e 77 61 72 64 20 61 73 20 6e 65 65 64 65 64 20  nward as needed 
3d10: 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
3d20: 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
3d30: 2e 0a 2a 2a 20 54 68 65 20 72 65 76 69 73 65 64  ..** The revised
3d40: 20 76 61 6c 75 65 20 6f 66 20 4e 20 69 73 20 72   value of N is r
3d50: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eturned..**.** A
3d60: 20 6e 65 67 61 74 69 76 65 20 53 49 5a 45 20 63   negative SIZE c
3d70: 61 75 73 65 73 20 74 68 65 20 62 75 66 66 65 72  auses the buffer
3d80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 4e   pointer to be N
3d90: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL..*/.static i
3da0: 6e 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73  nt test_config_s
3db0: 63 72 61 74 63 68 28 0a 20 20 76 6f 69 64 20 2a  cratch(.  void *
3dc0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
3dd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3de0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
3df0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
3e00: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
3e10: 73 7a 2c 20 4e 2c 20 72 63 3b 0a 20 20 54 63 6c  sz, N, rc;.  Tcl
3e20: 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20  _Obj *pResult;. 
3e30: 20 73 74 61 74 69 63 20 63 68 61 72 20 62 75 66   static char buf
3e40: 5b 33 30 30 30 30 5d 3b 0a 20 20 69 66 28 20 6f  [30000];.  if( o
3e50: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
3e60: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
3e70: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
3e80: 22 53 49 5a 45 20 4e 22 29 3b 0a 20 20 20 20 72  "SIZE N");.    r
3e90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3ea0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
3eb0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
3ec0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 73  erp, objv[1], &s
3ed0: 7a 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  z) ) return TCL_
3ee0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
3ef0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
3f00: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
3f10: 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &N) ) return TCL
3f20: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 7a  _ERROR;.  if( sz
3f30: 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  <0 ){.    rc = s
3f40: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
3f50: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
3f60: 54 43 48 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  TCH, 0, 0, 0);. 
3f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
3f80: 6d 78 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 29  mx = sizeof(buf)
3f90: 2f 28 73 7a 2b 34 29 3b 0a 20 20 20 20 69 66 28  /(sz+4);.    if(
3fa0: 20 4e 3e 6d 78 20 29 20 4e 20 3d 20 6d 78 3b 0a   N>mx ) N = mx;.
3fb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3fc0: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
3fd0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 2c 20 62  ONFIG_SCRATCH, b
3fe0: 75 66 2c 20 73 7a 2c 20 4e 29 3b 0a 20 20 7d 0a  uf, sz, N);.  }.
3ff0: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
4000: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
4010: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4020: 6d 65 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c  ment(0, pResult,
4030: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
4040: 63 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  c));.  Tcl_ListO
4050: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4060: 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
4070: 4e 65 77 49 6e 74 4f 62 6a 28 4e 29 29 3b 0a 20  NewIntObj(N));. 
4080: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
4090: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c  t(interp, pResul
40a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
40b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
40c0: 61 67 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f  age:    sqlite3_
40d0: 63 6f 6e 66 69 67 5f 70 61 67 65 63 61 63 68 65  config_pagecache
40e0: 20 53 49 5a 45 20 4e 0a 2a 2a 0a 2a 2a 20 53 65   SIZE N.**.** Se
40f0: 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
4100: 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20 75   memory buffer u
4110: 73 69 6e 67 20 53 51 4c 49 54 45 5f 43 4f 4e 46  sing SQLITE_CONF
4120: 49 47 5f 50 41 47 45 43 41 43 48 45 2e 0a 2a 2a  IG_PAGECACHE..**
4130: 20 54 68 65 20 62 75 66 66 65 72 20 69 73 20 73   The buffer is s
4140: 74 61 74 69 63 20 61 6e 64 20 69 73 20 6f 66 20  tatic and is of 
4150: 6c 69 6d 69 74 65 64 20 73 69 7a 65 2e 20 20 4e  limited size.  N
4160: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 64 6a   might be.** adj
4170: 75 73 74 65 64 20 64 6f 77 6e 77 61 72 64 20 61  usted downward a
4180: 73 20 6e 65 65 64 65 64 20 74 6f 20 61 63 63 6f  s needed to acco
4190: 6d 6f 64 61 74 65 20 74 68 65 20 72 65 71 75 65  modate the reque
41a0: 73 74 65 64 20 73 69 7a 65 2e 0a 2a 2a 20 54 68  sted size..** Th
41b0: 65 20 72 65 76 69 73 65 64 20 76 61 6c 75 65 20  e revised value 
41c0: 6f 66 20 4e 20 69 73 20 72 65 74 75 72 6e 65 64  of N is returned
41d0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 67 61 74 69  ..**.** A negati
41e0: 76 65 20 53 49 5a 45 20 63 61 75 73 65 73 20 74  ve SIZE causes t
41f0: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
4200: 72 20 74 6f 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2f  r to be NULL..*/
4210: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
4220: 5f 63 6f 6e 66 69 67 5f 70 61 67 65 63 61 63 68  _config_pagecach
4230: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
4240: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
4250: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
4260: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
4270: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
4280: 5d 0a 29 7b 0a 20 20 69 6e 74 20 73 7a 2c 20 4e  ].){.  int sz, N
4290: 2c 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  , rc;.  Tcl_Obj 
42a0: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 73 74 61 74  *pResult;.  stat
42b0: 69 63 20 63 68 61 72 20 62 75 66 5b 31 30 30 30  ic char buf[1000
42c0: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
42d0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
42e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
42f0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 49 5a  p, 1, objv, "SIZ
4300: 45 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  E N");.    retur
4310: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4320: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
4330: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
4340: 20 6f 62 6a 76 5b 31 5d 2c 20 26 73 7a 29 20 29   objv[1], &sz) )
4350: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4360: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
4370: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
4380: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20  p, objv[2], &N) 
4390: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
43a0: 4f 52 3b 0a 20 20 69 66 28 20 73 7a 3c 30 20 29  OR;.  if( sz<0 )
43b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
43c0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
43d0: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
43e0: 45 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  E, 0, 0, 0);.  }
43f0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 78  else{.    int mx
4400: 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 29 2f 28   = sizeof(buf)/(
4410: 73 7a 2b 34 29 3b 0a 20 20 20 20 69 66 28 20 4e  sz+4);.    if( N
4420: 3e 6d 78 20 29 20 4e 20 3d 20 6d 78 3b 0a 20 20  >mx ) N = mx;.  
4430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
4440: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
4450: 46 49 47 5f 50 41 47 45 43 41 43 48 45 2c 20 62  FIG_PAGECACHE, b
4460: 75 66 2c 20 73 7a 2c 20 4e 29 3b 0a 20 20 7d 0a  uf, sz, N);.  }.
4470: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
4480: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
4490: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
44a0: 6d 65 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c  ment(0, pResult,
44b0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
44c0: 63 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  c));.  Tcl_ListO
44d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
44e0: 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
44f0: 4e 65 77 49 6e 74 4f 62 6a 28 4e 29 29 3b 0a 20  NewIntObj(N));. 
4500: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
4510: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c  t(interp, pResul
4520: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
4530: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4540: 61 67 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f  age:    sqlite3_
4550: 73 74 61 74 75 73 20 20 4f 50 43 4f 44 45 20 20  status  OPCODE  
4560: 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20  RESETFLAG.**.** 
4570: 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
4580: 20 74 68 72 65 65 20 65 6c 65 6d 65 6e 74 73 20   three elements 
4590: 77 68 69 63 68 20 61 72 65 20 74 68 65 20 73 71  which are the sq
45a0: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 29 20 72  lite3_status() r
45b0: 65 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 2c 20 74  eturn.** code, t
45c0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
45d0: 2c 20 61 6e 64 20 74 68 65 20 68 69 67 68 2d 77  , and the high-w
45e0: 61 74 65 72 20 6d 61 72 6b 20 76 61 6c 75 65 2e  ater mark value.
45f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
4600: 65 73 74 5f 73 74 61 74 75 73 28 0a 20 20 76 6f  est_status(.  vo
4610: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
4620: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4630: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
4640: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
4650: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
4660: 69 6e 74 20 72 63 2c 20 69 56 61 6c 75 65 2c 20  int rc, iValue, 
4670: 6d 78 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20 69  mxValue;.  int i
4680: 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 3b  , op, resetFlag;
4690: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
46a0: 4f 70 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63  OpName;.  static
46b0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
46c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
46d0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f  zName;.    int o
46e0: 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b  p;.  } aOp[] = {
46f0: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
4700: 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45  TATUS_MEMORY_USE
4710: 44 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  D",         SQLI
4720: 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59  TE_STATUS_MEMORY
4730: 5f 55 53 45 44 20 20 20 20 20 20 20 20 20 7d 2c  _USED         },
4740: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
4750: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
4760: 55 53 45 44 22 2c 20 20 20 20 20 20 53 51 4c 49  USED",      SQLI
4770: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
4780: 43 48 45 5f 55 53 45 44 20 20 20 20 20 20 7d 2c  CHE_USED      },
4790: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
47a0: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
47b0: 4f 56 45 52 46 4c 4f 57 22 2c 20 20 53 51 4c 49  OVERFLOW",  SQLI
47c0: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
47d0: 43 48 45 5f 4f 56 45 52 46 4c 4f 57 20 20 7d 2c  CHE_OVERFLOW  },
47e0: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
47f0: 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 55 53  TATUS_SCRATCH_US
4800: 45 44 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  ED",        SQLI
4810: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
4820: 48 5f 55 53 45 44 20 20 20 20 20 20 20 20 7d 2c  H_USED        },
4830: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
4840: 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f 4f 56  TATUS_SCRATCH_OV
4850: 45 52 46 4c 4f 57 22 2c 20 20 20 20 53 51 4c 49  ERFLOW",    SQLI
4860: 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43  TE_STATUS_SCRATC
4870: 48 5f 4f 56 45 52 46 4c 4f 57 20 20 20 20 7d 2c  H_OVERFLOW    },
4880: 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53  .    { "SQLITE_S
4890: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
48a0: 45 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  E",         SQLI
48b0: 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
48c0: 5f 53 49 5a 45 20 20 20 20 20 20 20 20 20 7d 2c  _SIZE         },
48d0: 0a 20 20 7d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  .  };.  Tcl_Obj 
48e0: 2a 70 52 65 73 75 6c 74 3b 0a 20 20 69 66 28 20  *pResult;.  if( 
48f0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
4900: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4910: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
4920: 20 22 50 41 52 41 4d 45 54 45 52 20 52 45 53 45   "PARAMETER RESE
4930: 54 46 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74  TFLAG");.    ret
4940: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4950: 20 7d 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54   }.  zOpName = T
4960: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
4970: 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[1]);.  for(i=0
4980: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f  ; i<ArraySize(aO
4990: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  p); i++){.    if
49a0: 28 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e  ( strcmp(aOp[i].
49b0: 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d  zName, zOpName)=
49c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d  =0 ){.      op =
49d0: 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20   aOp[i].op;.    
49e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
49f0: 20 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61   }.  if( i>=Arra
4a00: 79 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20  ySize(aOp) ){.  
4a10: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
4a20: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
4a30: 6f 62 6a 76 5b 31 5d 2c 20 26 6f 70 29 20 29 20  objv[1], &op) ) 
4a40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4a50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
4a60: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
4a70: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
4a80: 5d 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29  ], &resetFlag) )
4a90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4aa0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
4ab0: 33 5f 73 74 61 74 75 73 28 6f 70 2c 20 26 69 56  3_status(op, &iV
4ac0: 61 6c 75 65 2c 20 26 6d 78 56 61 6c 75 65 2c 20  alue, &mxValue, 
4ad0: 72 65 73 65 74 46 6c 61 67 29 3b 0a 20 20 70 52  resetFlag);.  pR
4ae0: 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  esult = Tcl_NewO
4af0: 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
4b00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4b10: 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c  (0, pResult, Tcl
4b20: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
4b30: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
4b40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
4b50: 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49  Result, Tcl_NewI
4b60: 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29 3b 0a  ntObj(iValue));.
4b70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4b80: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
4b90: 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e  esult, Tcl_NewIn
4ba0: 74 4f 62 6a 28 6d 78 56 61 6c 75 65 29 29 3b 0a  tObj(mxValue));.
4bb0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
4bc0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75  lt(interp, pResu
4bd0: 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  lt);.  return TC
4be0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  L_OK;.}../*.** R
4bf0: 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
4c00: 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
4c10: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
4c20: 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c  t Sqlitetest_mal
4c30: 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  loc_Init(Tcl_Int
4c40: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
4c50: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
4c60: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
4c70: 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d  ;.     Tcl_ObjCm
4c80: 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
4c90: 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a  } aObjCmd[] = {.
4ca0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
4cb0: 6d 61 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  malloc",        
4cc0: 20 20 20 20 20 74 65 73 74 5f 6d 61 6c 6c 6f 63       test_malloc
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
4cf0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 22 2c 20  lite3_realloc", 
4d00: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
4d10: 72 65 61 6c 6c 6f 63 20 20 20 20 20 20 20 20 20  realloc         
4d20: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4d30: 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 72 65 65   { "sqlite3_free
4d40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4d50: 20 74 65 73 74 5f 66 72 65 65 20 20 20 20 20 20   test_free      
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4d70: 2c 0a 20 20 20 20 20 7b 20 22 6d 65 6d 73 65 74  ,.     { "memset
4d80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4d90: 20 20 20 20 20 20 20 74 65 73 74 5f 6d 65 6d 73         test_mems
4da0: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
4db0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
4dc0: 6d 65 6d 67 65 74 22 2c 20 20 20 20 20 20 20 20  memget",        
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
4de0: 74 5f 6d 65 6d 67 65 74 20 20 20 20 20 20 20 20  t_memget        
4df0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
4e00: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65     { "sqlite3_me
4e10: 6d 6f 72 79 5f 75 73 65 64 22 2c 20 20 20 20 20  mory_used",     
4e20: 20 20 20 74 65 73 74 5f 6d 65 6d 6f 72 79 5f 75     test_memory_u
4e30: 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  sed             
4e40: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
4e50: 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77  te3_memory_highw
4e60: 61 74 65 72 22 2c 20 20 20 74 65 73 74 5f 6d 65  ater",   test_me
4e70: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 20  mory_highwater  
4e80: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
4e90: 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62   "sqlite3_memdeb
4ea0: 75 67 5f 62 61 63 6b 74 72 61 63 65 22 2c 20 74  ug_backtrace", t
4eb0: 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 62 61 63  est_memdebug_bac
4ec0: 6b 74 72 61 63 65 20 20 20 20 20 20 20 7d 2c 0a  ktrace       },.
4ed0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
4ee0: 6d 65 6d 64 65 62 75 67 5f 64 75 6d 70 22 2c 20  memdebug_dump", 
4ef0: 20 20 20 20 20 74 65 73 74 5f 6d 65 6d 64 65 62       test_memdeb
4f00: 75 67 5f 64 75 6d 70 20 20 20 20 20 20 20 20 20  ug_dump         
4f10: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
4f20: 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66  lite3_memdebug_f
4f30: 61 69 6c 22 2c 20 20 20 20 20 20 74 65 73 74 5f  ail",      test_
4f40: 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 20 20  memdebug_fail   
4f50: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4f60: 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d 64   { "sqlite3_memd
4f70: 65 62 75 67 5f 70 65 6e 64 69 6e 67 22 2c 20 20  ebug_pending",  
4f80: 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 70   test_memdebug_p
4f90: 65 6e 64 69 6e 67 20 20 20 20 20 20 20 20 20 7d  ending         }
4fa0: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
4fb0: 33 5f 6d 65 6d 64 65 62 75 67 5f 73 65 74 74 69  3_memdebug_setti
4fc0: 74 6c 65 22 2c 20 20 74 65 73 74 5f 6d 65 6d 64  tle",  test_memd
4fd0: 65 62 75 67 5f 73 65 74 74 69 74 6c 65 20 20 20  ebug_settitle   
4fe0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
4ff0: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
5000: 5f 6d 61 6c 6c 6f 63 5f 63 6f 75 6e 74 22 2c 20  _malloc_count", 
5010: 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 6d 61  test_memdebug_ma
5020: 6c 6c 6f 63 5f 63 6f 75 6e 74 20 7d 2c 0a 20 20  lloc_count },.  
5030: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65     { "sqlite3_me
5040: 6d 64 65 62 75 67 5f 6c 6f 67 22 2c 20 20 20 20  mdebug_log",    
5050: 20 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67     test_memdebug
5060: 5f 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 20  _log            
5070: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
5080: 74 65 33 5f 63 6f 6e 66 69 67 5f 73 63 72 61 74  te3_config_scrat
5090: 63 68 22 2c 20 20 20 20 20 74 65 73 74 5f 63 6f  ch",     test_co
50a0: 6e 66 69 67 5f 73 63 72 61 74 63 68 20 20 20 20  nfig_scratch    
50b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
50c0: 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67   "sqlite3_config
50d0: 5f 70 61 67 65 63 61 63 68 65 22 2c 20 20 20 74  _pagecache",   t
50e0: 65 73 74 5f 63 6f 6e 66 69 67 5f 70 61 67 65 63  est_config_pagec
50f0: 61 63 68 65 20 20 20 20 20 20 20 20 20 7d 2c 0a  ache         },.
5100: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
5110: 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
5120: 20 20 20 20 20 74 65 73 74 5f 73 74 61 74 75 73       test_status
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
5150: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
5160: 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29  <sizeof(aObjCmd)
5170: 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b  /sizeof(aObjCmd[
5180: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
5190: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
51a0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a  and(interp, aObj
51b0: 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4f  Cmd[i].zName, aO
51c0: 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
51d0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
51e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a        urn TCL_OK;.}.