/ Hex Artifact Content
Login

Artifact 5c2c698355613d321f216ece25901be1040cc1fb:


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 33 20 32 30 30 38 2f  c.c,v 1.23 2008/
0200: 30 35 2f 32 39 20 30 32 3a 35 37 3a 34 38 20 73  05/29 02:57:48 s
0210: 68 61 6e 65 20 45 78 70 20 24 0a 2a 2f 0a 23 69  hane Exp $.*/.#i
0220: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0230: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74  t.h".#include "t
0240: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
0250: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
0260: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0270: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0280: 3e 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f  >../*.** Transfo
0290: 72 6d 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rm pointers to t
02a0: 65 78 74 20 61 6e 64 20 62 61 63 6b 20 61 67 61  ext and back aga
02b0: 69 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  in.*/.static voi
02c0: 64 20 70 6f 69 6e 74 65 72 54 6f 54 65 78 74 28  d pointerToText(
02d0: 76 6f 69 64 20 2a 70 2c 20 63 68 61 72 20 2a 7a  void *p, char *z
02e0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
02f0: 74 20 63 68 61 72 20 7a 48 65 78 5b 5d 20 3d 20  t char zHex[] = 
0300: 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
0310: 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6b 3b 0a  f";.  int i, k;.
0320: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75    unsigned int u
0330: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  ;.  sqlite3_uint
0340: 36 34 20 6e 3b 0a 20 20 69 66 28 20 73 69 7a 65  64 n;.  if( size
0350: 6f 66 28 6e 29 3d 3d 73 69 7a 65 6f 66 28 70 29  of(n)==sizeof(p)
0360: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
0370: 6e 2c 20 26 70 2c 20 73 69 7a 65 6f 66 28 70 29  n, &p, sizeof(p)
0380: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
0390: 69 7a 65 6f 66 28 75 29 3d 3d 73 69 7a 65 6f 66  izeof(u)==sizeof
03a0: 28 70 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  (p) ){.    memcp
03b0: 79 28 26 75 2c 20 26 70 2c 20 73 69 7a 65 6f 66  y(&u, &p, sizeof
03c0: 28 75 29 29 3b 0a 20 20 20 20 6e 20 3d 20 75 3b  (u));.    n = u;
03d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
03e0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
03f0: 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 73 69 7a 65   for(i=0, k=size
0400: 6f 66 28 70 29 2a 32 2d 31 3b 20 69 3c 73 69 7a  of(p)*2-1; i<siz
0410: 65 6f 66 28 70 29 2a 32 3b 20 69 2b 2b 2c 20 6b  eof(p)*2; i++, k
0420: 2d 2d 29 7b 0a 20 20 20 20 7a 5b 6b 5d 20 3d 20  --){.    z[k] = 
0430: 7a 48 65 78 5b 6e 26 30 78 66 5d 3b 0a 20 20 20  zHex[n&0xf];.   
0440: 20 6e 20 3e 3e 3d 20 34 3b 0a 20 20 7d 0a 20 20   n >>= 4;.  }.  
0450: 7a 5b 73 69 7a 65 6f 66 28 70 29 2a 32 5d 20 3d  z[sizeof(p)*2] =
0460: 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74   0;.}.static int
0470: 20 68 65 78 54 6f 49 6e 74 28 69 6e 74 20 68 29   hexToInt(int h)
0480: 7b 0a 20 20 69 66 28 20 68 3e 3d 27 30 27 20 26  {.  if( h>='0' &
0490: 26 20 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20  & h<='9' ){.    
04a0: 72 65 74 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a  return h - '0';.
04b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d 27    }else if( h>='
04c0: 61 27 20 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a  a' && h<='f' ){.
04d0: 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27      return h - '
04e0: 61 27 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65  a' + 10;.  }else
04f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
0500: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
0510: 74 20 74 65 78 74 54 6f 50 6f 69 6e 74 65 72 28  t textToPointer(
0520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 76  const char *z, v
0530: 6f 69 64 20 2a 2a 70 70 29 7b 0a 20 20 73 71 6c  oid **pp){.  sql
0540: 69 74 65 33 5f 75 69 6e 74 36 34 20 6e 20 3d 20  ite3_uint64 n = 
0550: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  0;.  int i;.  un
0560: 73 69 67 6e 65 64 20 69 6e 74 20 75 3b 0a 20 20  signed int u;.  
0570: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
0580: 66 28 76 6f 69 64 2a 29 2a 32 20 26 26 20 7a 5b  f(void*)*2 && z[
0590: 30 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  0]; i++){.    in
05a0: 74 20 76 3b 0a 20 20 20 20 76 20 3d 20 68 65 78  t v;.    v = hex
05b0: 54 6f 49 6e 74 28 2a 7a 2b 2b 29 3b 0a 20 20 20  ToInt(*z++);.   
05c0: 20 69 66 28 20 76 3c 30 20 29 20 72 65 74 75 72   if( v<0 ) retur
05d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
05e0: 20 6e 20 3d 20 6e 2a 31 36 20 2b 20 76 3b 0a 20   n = n*16 + v;. 
05f0: 20 7d 0a 20 20 69 66 28 20 2a 7a 21 3d 30 20 29   }.  if( *z!=0 )
0600: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0610: 52 3b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  R;.  if( sizeof(
0620: 6e 29 3d 3d 73 69 7a 65 6f 66 28 2a 70 70 29 20  n)==sizeof(*pp) 
0630: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 70  ){.    memcpy(pp
0640: 2c 20 26 6e 2c 20 73 69 7a 65 6f 66 28 6e 29 29  , &n, sizeof(n))
0650: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69  ;.  }else if( si
0660: 7a 65 6f 66 28 75 29 3d 3d 73 69 7a 65 6f 66 28  zeof(u)==sizeof(
0670: 2a 70 70 29 20 29 7b 0a 20 20 20 20 75 20 3d 20  *pp) ){.    u = 
0680: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 6e 3b  (unsigned int)n;
0690: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 70 2c 20  .    memcpy(pp, 
06a0: 26 75 2c 20 73 69 7a 65 6f 66 28 75 29 29 3b 0a  &u, sizeof(u));.
06b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
06c0: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
06d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
06e0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
06f0: 20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63    sqlite3_malloc
0700: 20 20 4e 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 52    NBYTES.**.** R
0710: 61 77 20 74 65 73 74 20 69 6e 74 65 72 66 61 63  aw test interfac
0720: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6d 61  e for sqlite3_ma
0730: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
0740: 63 20 69 6e 74 20 74 65 73 74 5f 6d 61 6c 6c 6f  c int test_mallo
0750: 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
0760: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
0770: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
0780: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
0790: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
07a0: 5d 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ].){.  int nByte
07b0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 63  ;.  void *p;.  c
07c0: 68 61 72 20 7a 4f 75 74 5b 31 30 30 5d 3b 0a 20  har zOut[100];. 
07d0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
07e0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
07f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
0800: 6f 62 6a 76 2c 20 22 4e 42 59 54 45 53 22 29 3b  objv, "NBYTES");
0810: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0820: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
0830: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
0840: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
0850: 31 5d 2c 20 26 6e 42 79 74 65 29 20 29 20 72 65  1], &nByte) ) re
0860: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0870: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
0880: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 6e  lloc((unsigned)n
0890: 42 79 74 65 29 3b 0a 20 20 70 6f 69 6e 74 65 72  Byte);.  pointer
08a0: 54 6f 54 65 78 74 28 70 2c 20 7a 4f 75 74 29 3b  ToText(p, zOut);
08b0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
08c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 4f 75 74  ult(interp, zOut
08d0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 72 65 74 75 72  , NULL);.  retur
08e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
08f0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c  ** Usage:    sql
0900: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 20 20 50 52  ite3_realloc  PR
0910: 49 4f 52 20 20 4e 42 59 54 45 53 0a 2a 2a 0a 2a  IOR  NBYTES.**.*
0920: 2a 20 52 61 77 20 74 65 73 74 20 69 6e 74 65 72  * Raw test inter
0930: 66 61 63 65 20 66 6f 72 20 73 71 6c 69 74 65 33  face for sqlite3
0940: 5f 72 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  _realloc()..*/.s
0950: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72  tatic int test_r
0960: 65 61 6c 6c 6f 63 28 0a 20 20 76 6f 69 64 20 2a  ealloc(.  void *
0970: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
0980: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0990: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
09a0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
09b0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
09c0: 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 70  nByte;.  void *p
09d0: 50 72 69 6f 72 2c 20 2a 70 3b 0a 20 20 63 68 61  Prior, *p;.  cha
09e0: 72 20 7a 4f 75 74 5b 31 30 30 5d 3b 0a 20 20 69  r zOut[100];.  i
09f0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
0a00: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
0a10: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
0a20: 6a 76 2c 20 22 50 52 49 4f 52 20 4e 42 59 54 45  jv, "PRIOR NBYTE
0a30: 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  S");.    return 
0a40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0a50: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
0a60: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
0a70: 62 6a 76 5b 32 5d 2c 20 26 6e 42 79 74 65 29 20  bjv[2], &nByte) 
0a80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
0a90: 4f 52 3b 0a 20 20 69 66 28 20 74 65 78 74 54 6f  OR;.  if( textTo
0aa0: 50 6f 69 6e 74 65 72 28 54 63 6c 5f 47 65 74 53  Pointer(Tcl_GetS
0ab0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
0ac0: 26 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20  &pPrior) ){.    
0ad0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0ae0: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 70 6f  (interp, "bad po
0af0: 69 6e 74 65 72 3a 20 22 2c 20 54 63 6c 5f 47 65  inter: ", Tcl_Ge
0b00: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
0b10: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
0b20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0b30: 52 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  R;.  }.  p = sql
0b40: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 50 72  ite3_realloc(pPr
0b50: 69 6f 72 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e  ior, (unsigned)n
0b60: 42 79 74 65 29 3b 0a 20 20 70 6f 69 6e 74 65 72  Byte);.  pointer
0b70: 54 6f 54 65 78 74 28 70 2c 20 7a 4f 75 74 29 3b  ToText(p, zOut);
0b80: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
0b90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 4f 75 74  ult(interp, zOut
0ba0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 72 65 74 75 72  , NULL);.  retur
0bb0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
0bc0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71  .** Usage:    sq
0bd0: 6c 69 74 65 33 5f 66 72 65 65 20 20 50 52 49 4f  lite3_free  PRIO
0be0: 52 0a 2a 2a 0a 2a 2a 20 52 61 77 20 74 65 73 74  R.**.** Raw test
0bf0: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 73   interface for s
0c00: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
0c10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
0c20: 74 5f 66 72 65 65 28 0a 20 20 76 6f 69 64 20 2a  t_free(.  void *
0c30: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
0c40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0c50: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
0c60: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
0c70: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69 64  objv[].){.  void
0c80: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20   *pPrior;.  if( 
0c90: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
0ca0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
0cb0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
0cc0: 20 22 50 52 49 4f 52 22 29 3b 0a 20 20 20 20 72   "PRIOR");.    r
0cd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0ce0: 0a 20 20 7d 0a 20 20 69 66 28 20 74 65 78 74 54  .  }.  if( textT
0cf0: 6f 50 6f 69 6e 74 65 72 28 54 63 6c 5f 47 65 74  oPointer(Tcl_Get
0d00: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0d10: 20 26 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20   &pPrior) ){.   
0d20: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0d30: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 70  t(interp, "bad p
0d40: 6f 69 6e 74 65 72 3a 20 22 2c 20 54 63 6c 5f 47  ointer: ", Tcl_G
0d50: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
0d60: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
0d70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0d80: 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
0d90: 33 5f 66 72 65 65 28 70 50 72 69 6f 72 29 3b 0a  3_free(pPrior);.
0da0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
0db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
0dc0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6e 20  routines are in 
0dd0: 74 65 73 74 5f 68 65 78 69 6f 2e 63 0a 2a 2f 0a  test_hexio.c.*/.
0de0: 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 48  int sqlite3TestH
0df0: 65 78 54 6f 42 69 6e 28 63 6f 6e 73 74 20 63 68  exToBin(const ch
0e00: 61 72 20 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20  ar *, int, char 
0e10: 2a 29 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  *);.int sqlite3T
0e20: 65 73 74 42 69 6e 54 6f 48 65 78 28 63 68 61 72  estBinToHex(char
0e30: 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55  *,int);../*.** U
0e40: 73 61 67 65 3a 20 20 20 20 6d 65 6d 73 65 74 20  sage:    memset 
0e50: 20 41 44 44 52 45 53 53 20 20 53 49 5a 45 20 20   ADDRESS  SIZE  
0e60: 48 45 58 0a 2a 2a 0a 2a 2a 20 53 65 74 20 61 20  HEX.**.** Set a 
0e70: 63 68 75 6e 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  chunk of memory 
0e80: 28 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d  (obtained from m
0e90: 61 6c 6c 6f 63 2c 20 70 72 6f 62 61 62 6c 79 29  alloc, probably)
0ea0: 20 74 6f 20 61 0a 2a 2a 20 73 70 65 63 69 66 69   to a.** specifi
0eb0: 65 64 20 68 65 78 20 70 61 74 74 65 72 6e 2e 0a  ed hex pattern..
0ec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
0ed0: 73 74 5f 6d 65 6d 73 65 74 28 0a 20 20 76 6f 69  st_memset(.  voi
0ee0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0ef0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0f00: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0f10: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0f20: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 76  ST objv[].){.  v
0f30: 6f 69 64 20 2a 70 3b 0a 20 20 69 6e 74 20 73 69  oid *p;.  int si
0f40: 7a 65 2c 20 6e 2c 20 69 3b 0a 20 20 63 68 61 72  ze, n, i;.  char
0f50: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 2a   *zHex;.  char *
0f60: 7a 4f 75 74 3b 0a 20 20 63 68 61 72 20 7a 42 69  zOut;.  char zBi
0f70: 6e 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  n[100];..  if( o
0f80: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
0f90: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
0fa0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
0fb0: 22 41 44 44 52 45 53 53 20 53 49 5a 45 20 48 45  "ADDRESS SIZE HE
0fc0: 58 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  X");.    return 
0fd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0fe0: 20 69 66 28 20 74 65 78 74 54 6f 50 6f 69 6e 74   if( textToPoint
0ff0: 65 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  er(Tcl_GetString
1000: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 29 20 29  (objv[1]), &p) )
1010: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1020: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1030: 62 61 64 20 70 6f 69 6e 74 65 72 3a 20 22 2c 20  bad pointer: ", 
1040: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1050: 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
1060: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1070: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1080: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1090: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
10a0: 76 5b 32 5d 2c 20 26 73 69 7a 65 29 20 29 7b 0a  v[2], &size) ){.
10b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
10d0: 73 69 7a 65 3c 3d 30 20 29 7b 0a 20 20 20 20 54  size<=0 ){.    T
10e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10f0: 69 6e 74 65 72 70 2c 20 22 73 69 7a 65 20 6d 75  interp, "size mu
1100: 73 74 20 62 65 20 70 6f 73 69 74 69 76 65 22 2c  st be positive",
1110: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1120: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1130: 3b 0a 20 20 7d 0a 20 20 7a 48 65 78 20 3d 20 54  ;.  }.  zHex = T
1140: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1150: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29  Obj(objv[3], &n)
1160: 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66  ;.  if( n>sizeof
1170: 28 7a 42 69 6e 29 2a 32 20 29 20 6e 20 3d 20 73  (zBin)*2 ) n = s
1180: 69 7a 65 6f 66 28 7a 42 69 6e 29 2a 32 3b 0a 20  izeof(zBin)*2;. 
1190: 20 6e 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74   n = sqlite3Test
11a0: 48 65 78 54 6f 42 69 6e 28 7a 48 65 78 2c 20 6e  HexToBin(zHex, n
11b0: 2c 20 7a 42 69 6e 29 3b 0a 20 20 69 66 28 20 6e  , zBin);.  if( n
11c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  ==0 ){.    Tcl_A
11d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11e0: 72 70 2c 20 22 6e 6f 20 64 61 74 61 22 2c 20 28  rp, "no data", (
11f0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
1200: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1210: 20 20 7d 0a 20 20 7a 4f 75 74 20 3d 20 70 3b 0a    }.  zOut = p;.
1220: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1230: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f 75  e; i++){.    zOu
1240: 74 5b 69 5d 20 3d 20 7a 42 69 6e 5b 69 25 6e 5d  t[i] = zBin[i%n]
1250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1260: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1270: 55 73 61 67 65 3a 20 20 20 20 6d 65 6d 67 65 74  Usage:    memget
1280: 20 20 41 44 44 52 45 53 53 20 20 53 49 5a 45 0a    ADDRESS  SIZE.
1290: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 6d  **.** Return mem
12a0: 6f 72 79 20 61 73 20 68 65 78 61 64 65 63 69 6d  ory as hexadecim
12b0: 61 6c 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74  al text..*/.stat
12c0: 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d 67  ic int test_memg
12d0: 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  et(.  void * cli
12e0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
12f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1300: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1310: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1320: 5b 5d 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b  [].){.  void *p;
1330: 0a 20 20 69 6e 74 20 73 69 7a 65 2c 20 6e 3b 0a  .  int size, n;.
1340: 20 20 63 68 61 72 20 2a 7a 42 69 6e 3b 0a 20 20    char *zBin;.  
1350: 63 68 61 72 20 7a 48 65 78 5b 31 30 30 5d 3b 0a  char zHex[100];.
1360: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1370: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1380: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1390: 2c 20 6f 62 6a 76 2c 20 22 41 44 44 52 45 53 53  , objv, "ADDRESS
13a0: 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74   SIZE");.    ret
13b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13c0: 20 7d 0a 20 20 69 66 28 20 74 65 78 74 54 6f 50   }.  if( textToP
13d0: 6f 69 6e 74 65 72 28 54 63 6c 5f 47 65 74 53 74  ointer(Tcl_GetSt
13e0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
13f0: 70 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  p) ){.    Tcl_Ap
1400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1410: 70 2c 20 22 62 61 64 20 70 6f 69 6e 74 65 72 3a  p, "bad pointer:
1420: 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   ", Tcl_GetStrin
1430: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
1440: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
1450: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1460: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1470: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1480: 20 6f 62 6a 76 5b 32 5d 2c 20 26 73 69 7a 65 29   objv[2], &size)
1490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
14a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
14b0: 69 66 28 20 73 69 7a 65 3c 3d 30 20 29 7b 0a 20  if( size<=0 ){. 
14c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 69 7a  ult(interp, "siz
14e0: 65 20 6d 75 73 74 20 62 65 20 70 6f 73 69 74 69  e must be positi
14f0: 76 65 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ve", (char*)0);.
1500: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1510: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 42 69 6e  RROR;.  }.  zBin
1520: 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 73   = p;.  while( s
1530: 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ize>0 ){.    if(
1540: 20 73 69 7a 65 3e 28 73 69 7a 65 6f 66 28 7a 48   size>(sizeof(zH
1550: 65 78 29 2d 31 29 2f 32 20 29 7b 0a 20 20 20 20  ex)-1)/2 ){.    
1560: 20 20 6e 20 3d 20 28 73 69 7a 65 6f 66 28 7a 48    n = (sizeof(zH
1570: 65 78 29 2d 31 29 2f 32 3b 0a 20 20 20 20 7d 65  ex)-1)/2;.    }e
1580: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  lse{.      n = s
1590: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ize;.    }.    m
15a0: 65 6d 63 70 79 28 7a 48 65 78 2c 20 7a 42 69 6e  emcpy(zHex, zBin
15b0: 2c 20 6e 29 3b 0a 20 20 20 20 7a 42 69 6e 20 2b  , n);.    zBin +
15c0: 3d 20 6e 3b 0a 20 20 20 20 73 69 7a 65 20 2d 3d  = n;.    size -=
15d0: 20 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   n;.    sqlite3T
15e0: 65 73 74 42 69 6e 54 6f 48 65 78 28 7a 48 65 78  estBinToHex(zHex
15f0: 2c 20 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  , n);.    Tcl_Ap
1600: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1610: 70 2c 20 7a 48 65 78 2c 20 28 63 68 61 72 2a 29  p, zHex, (char*)
1620: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1630: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1640: 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69  * Usage:    sqli
1650: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0a  te3_memory_used.
1660: 2a 2a 0a 2a 2a 20 52 61 77 20 74 65 73 74 20 69  **.** Raw test i
1670: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 73 71 6c  nterface for sql
1680: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
1690: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
16a0: 74 20 74 65 73 74 5f 6d 65 6d 6f 72 79 5f 75 73  t test_memory_us
16b0: 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
16c0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16e0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16f0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1700: 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f  [].){.  Tcl_SetO
1710: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1720: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
1730: 62 6a 28 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  bj(sqlite3_memor
1740: 79 5f 75 73 65 64 28 29 29 29 3b 0a 20 20 72 65  y_used()));.  re
1750: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1760: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
1770: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
1780: 69 67 68 77 61 74 65 72 20 3f 52 45 53 45 54 46  ighwater ?RESETF
1790: 4c 41 47 3f 0a 2a 2a 0a 2a 2a 20 52 61 77 20 74  LAG?.**.** Raw t
17a0: 65 73 74 20 69 6e 74 65 72 66 61 63 65 20 66 6f  est interface fo
17b0: 72 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  r sqlite3_memory
17c0: 5f 68 69 67 68 77 61 74 65 72 28 29 2e 0a 2a 2f  _highwater()..*/
17d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
17e0: 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
17f0: 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
1800: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1810: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1820: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1830: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1840: 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 65 74  ].){.  int reset
1850: 46 6c 61 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  Flag = 0;.  if( 
1860: 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21  objc!=1 && objc!
1870: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1880: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1890: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 52 45  p, 1, objv, "?RE
18a0: 53 45 54 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  SET?");.    retu
18b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18c0: 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  }.  if( objc==2 
18d0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
18e0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
18f0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
1900: 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29 20  , &resetFlag) ) 
1910: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1920: 3b 0a 20 20 7d 20 0a 20 20 54 63 6c 5f 53 65 74  ;.  } .  Tcl_Set
1930: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1940: 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 57  , .     Tcl_NewW
1950: 69 64 65 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  ideIntObj(sqlite
1960: 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74  3_memory_highwat
1970: 65 72 28 72 65 73 65 74 46 6c 61 67 29 29 29 3b  er(resetFlag)));
1980: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19a0: 3a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d  :    sqlite3_mem
19b0: 64 65 62 75 67 5f 62 61 63 6b 74 72 61 63 65 20  debug_backtrace 
19c0: 44 45 50 54 48 0a 2a 2a 0a 2a 2a 20 53 65 74 20  DEPTH.**.** Set 
19d0: 74 68 65 20 64 65 70 74 68 20 6f 66 20 62 61 63  the depth of bac
19e0: 6b 74 72 61 63 69 6e 67 2e 20 20 49 66 20 53 51  ktracing.  If SQ
19f0: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 69 73  LITE_MEMDEBUG is
1a00: 20 6e 6f 74 20 64 65 66 69 6e 65 64 0a 2a 2a 20   not defined.** 
1a10: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1a20: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1a40: 5f 6d 65 6d 64 65 62 75 67 5f 62 61 63 6b 74 72  _memdebug_backtr
1a50: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ace(.  void * cl
1a60: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1a70: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1a80: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1a90: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1aa0: 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 64 65 70  v[].){.  int dep
1ab0: 74 68 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  th;.  if( objc!=
1ac0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1ad0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1ae0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 45 50 54  , 1, objv, "DEPT
1af0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1b00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1b10: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1b20: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1b30: 6a 76 5b 31 5d 2c 20 26 64 65 70 74 68 29 20 29  jv[1], &depth) )
1b40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b50: 52 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  R;.#ifdef SQLITE
1b60: 5f 4d 45 4d 44 45 42 55 47 0a 20 20 7b 0a 20 20  _MEMDEBUG.  {.  
1b70: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71    extern void sq
1b80: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63  lite3MemdebugBac
1b90: 6b 74 72 61 63 65 28 69 6e 74 29 3b 0a 20 20 20  ktrace(int);.   
1ba0: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
1bb0: 42 61 63 6b 74 72 61 63 65 28 64 65 70 74 68 29  Backtrace(depth)
1bc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1bd0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1be0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1bf0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75   sqlite3_memdebu
1c00: 67 5f 64 75 6d 70 20 20 46 49 4c 45 4e 41 4d 45  g_dump  FILENAME
1c10: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 73  .**.** Write a s
1c20: 75 6d 6d 61 72 79 20 6f 66 20 75 6e 66 72 65 65  ummary of unfree
1c30: 64 20 6d 65 6d 6f 72 79 20 74 6f 20 46 49 4c 45  d memory to FILE
1c40: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
1c50: 69 6e 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75  int test_memdebu
1c60: 67 5f 64 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a  g_dump(.  void *
1c70: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c90: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1ca0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1cb0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
1cc0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1cd0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1ce0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1cf0: 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20   "FILENAME");.  
1d00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d10: 4f 52 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69  OR;.  }.#if defi
1d20: 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45 4d 44 45  ned(SQLITE_MEMDE
1d30: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1d40: 53 51 4c 49 54 45 5f 4d 45 4d 4f 52 59 5f 53 49  SQLITE_MEMORY_SI
1d50: 5a 45 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  ZE) \.     || de
1d60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 50 4f 57  fined(SQLITE_POW
1d70: 32 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 29 0a 20  2_MEMORY_SIZE). 
1d80: 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f   {.    extern vo
1d90: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  id sqlite3Memdeb
1da0: 75 67 44 75 6d 70 28 63 6f 6e 73 74 20 63 68 61  ugDump(const cha
1db0: 72 2a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r*);.    sqlite3
1dc0: 4d 65 6d 64 65 62 75 67 44 75 6d 70 28 54 63 6c  MemdebugDump(Tcl
1dd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1de0: 31 5d 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  1]));.  }.#endif
1df0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e10: 3a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d  :    sqlite3_mem
1e20: 64 65 62 75 67 5f 6d 61 6c 6c 6f 63 5f 63 6f 75  debug_malloc_cou
1e30: 6e 74 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  nt.**.** Return 
1e40: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1e50: 20 6f 66 20 74 69 6d 65 73 20 6d 61 6c 6c 6f 63   of times malloc
1e60: 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1e70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1e80: 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f  t test_memdebug_
1e90: 6d 61 6c 6c 6f 63 5f 63 6f 75 6e 74 28 0a 20 20  malloc_count(.  
1ea0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1eb0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ec0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1ed0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ee0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1ef0: 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f 63 20 3d 20    int nMalloc = 
1f00: 2d 31 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  -1;.  if( objc!=
1f10: 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
1f20: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1f30: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
1f40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f50: 52 52 4f 52 3b 0a 20 20 7d 0a 23 69 66 20 64 65  RROR;.  }.#if de
1f60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45 4d  fined(SQLITE_MEM
1f70: 44 45 42 55 47 29 0a 20 20 7b 0a 20 20 20 20 65  DEBUG).  {.    e
1f80: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1f90: 33 4d 65 6d 64 65 62 75 67 4d 61 6c 6c 6f 63 43  3MemdebugMallocC
1fa0: 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6e 4d 61 6c  ount();.    nMal
1fb0: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  loc = sqlite3Mem
1fc0: 64 65 62 75 67 4d 61 6c 6c 6f 63 43 6f 75 6e 74  debugMallocCount
1fd0: 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ();.  }.#endif. 
1fe0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1ff0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2000: 77 49 6e 74 4f 62 6a 28 6e 4d 61 6c 6c 6f 63 29  wIntObj(nMalloc)
2010: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2020: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
2030: 61 67 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f  age:    sqlite3_
2040: 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 20 43  memdebug_fail  C
2050: 4f 55 4e 54 45 52 20 20 3f 4f 50 54 49 4f 4e 53  OUNTER  ?OPTIONS
2060: 3f 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 6f 70  ?.**.** where op
2070: 74 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  tions are:.**.**
2080: 20 20 20 20 20 2d 72 65 70 65 61 74 20 20 20 20       -repeat    
2090: 3c 63 6f 75 6e 74 3e 0a 2a 2a 20 20 20 20 20 2d  <count>.**     -
20a0: 62 65 6e 69 67 6e 63 6e 74 20 3c 76 61 72 6e 61  benigncnt <varna
20b0: 6d 65 3e 0a 2a 2a 0a 2a 2a 20 41 72 72 61 6e 67  me>.**.** Arrang
20c0: 65 20 66 6f 72 20 61 20 73 69 6d 75 6c 61 74 65  e for a simulate
20d0: 64 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  d malloc() failu
20e0: 72 65 20 61 66 74 65 72 20 43 4f 55 4e 54 45 52  re after COUNTER
20f0: 20 73 75 63 63 65 73 73 65 73 2e 0a 2a 2a 20 49   successes..** I
2100: 66 20 61 20 72 65 70 65 61 74 20 63 6f 75 6e 74  f a repeat count
2110: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74   is specified, t
2120: 68 65 20 66 61 75 6c 74 20 69 73 20 72 65 70 65  he fault is repe
2130: 61 74 65 64 20 74 68 61 74 20 6d 61 6e 79 0a 2a  ated that many.*
2140: 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  * times..**.** E
2150: 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
2160: 20 72 6f 75 74 69 6e 65 20 6f 76 65 72 72 69 64   routine overrid
2170: 65 73 20 74 68 65 20 70 72 69 6f 72 20 63 6f 75  es the prior cou
2180: 6e 74 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  nter value..** T
2190: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
21a0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
21b0: 66 20 73 69 6d 75 6c 61 74 65 64 20 66 61 69 6c  f simulated fail
21c0: 75 72 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ures that have.*
21d0: 2a 20 68 61 70 70 65 6e 65 64 20 73 69 6e 63 65  * happened since
21e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 61   the previous ca
21f0: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
2200: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 64 69 73  ne..**.** To dis
2210: 61 62 6c 65 20 73 69 6d 75 6c 61 74 65 64 20 66  able simulated f
2220: 61 69 6c 75 72 65 73 2c 20 75 73 65 20 61 20 43  ailures, use a C
2230: 4f 55 4e 54 45 52 20 6f 66 20 2d 31 2e 0a 2a 2f  OUNTER of -1..*/
2240: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2250: 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 28 0a  _memdebug_fail(.
2260: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
2270: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2280: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2290: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
22a0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
22b0: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  {.  int ii;.  in
22c0: 74 20 69 46 61 69 6c 3b 0a 20 20 69 6e 74 20 6e  t iFail;.  int n
22d0: 52 65 70 65 61 74 20 3d 20 31 3b 0a 20 20 54 63  Repeat = 1;.  Tc
22e0: 6c 5f 4f 62 6a 20 2a 70 42 65 6e 69 67 6e 43 6e  l_Obj *pBenignCn
22f0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 65  t = 0;.  int nBe
2300: 6e 69 67 6e 3b 0a 20 20 69 6e 74 20 6e 46 61 69  nign;.  int nFai
2310: 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  l = 0;..  if( ob
2320: 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
2330: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2340: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
2350: 4f 55 4e 54 45 52 20 3f 4f 50 54 49 4f 4e 53 3f  OUNTER ?OPTIONS?
2360: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2370: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2380: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
2390: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
23a0: 6a 76 5b 31 5d 2c 20 26 69 46 61 69 6c 29 20 29  jv[1], &iFail) )
23b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23c0: 52 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 32 3b 20  R;..  for(ii=2; 
23d0: 69 69 3c 6f 62 6a 63 3b 20 69 69 2b 3d 32 29 7b  ii<objc; ii+=2){
23e0: 0a 20 20 20 20 69 6e 74 20 6e 4f 70 74 69 6f 6e  .    int nOption
23f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  ;.    char *zOpt
2400: 69 6f 6e 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ion = Tcl_GetStr
2410: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2420: 69 69 5d 2c 20 26 6e 4f 70 74 69 6f 6e 29 3b 0a  ii], &nOption);.
2430: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d      char *zErr =
2440: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 70   0;..    if( nOp
2450: 74 69 6f 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  tion>1 && strncm
2460: 70 28 7a 4f 70 74 69 6f 6e 2c 20 22 2d 72 65 70  p(zOption, "-rep
2470: 65 61 74 22 2c 20 6e 4f 70 74 69 6f 6e 29 3d 3d  eat", nOption)==
2480: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
2490: 69 3d 3d 28 6f 62 6a 63 2d 31 29 20 29 7b 0a 20  i==(objc-1) ){. 
24a0: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 6f         zErr = "o
24b0: 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
24c0: 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22 3b 0a 20  n argument: ";. 
24d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24e0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
24f0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2500: 2c 20 6f 62 6a 76 5b 69 69 2b 31 5d 2c 20 26 6e  , objv[ii+1], &n
2510: 52 65 70 65 61 74 29 20 29 7b 0a 20 20 20 20 20  Repeat) ){.     
2520: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2530: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
2540: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2550: 73 65 20 69 66 28 20 6e 4f 70 74 69 6f 6e 3e 31  se if( nOption>1
2560: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 4f 70 74   && strncmp(zOpt
2570: 69 6f 6e 2c 20 22 2d 62 65 6e 69 67 6e 63 6e 74  ion, "-benigncnt
2580: 22 2c 20 6e 4f 70 74 69 6f 6e 29 3d 3d 30 20 29  ", nOption)==0 )
2590: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 69 3d 3d  {.      if( ii==
25a0: 28 6f 62 6a 63 2d 31 29 20 29 7b 0a 20 20 20 20  (objc-1) ){.    
25b0: 20 20 20 20 7a 45 72 72 20 3d 20 22 6f 70 74 69      zErr = "opti
25c0: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
25d0: 72 67 75 6d 65 6e 74 3a 20 22 3b 0a 20 20 20 20  rgument: ";.    
25e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25f0: 20 70 42 65 6e 69 67 6e 43 6e 74 20 3d 20 6f 62   pBenignCnt = ob
2600: 6a 76 5b 69 69 2b 31 5d 3b 0a 20 20 20 20 20 20  jv[ii+1];.      
2610: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2620: 20 20 20 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f     zErr = "unkno
2630: 77 6e 20 6f 70 74 69 6f 6e 3a 20 22 3b 0a 20 20  wn option: ";.  
2640: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a 45 72    }..    if( zEr
2650: 72 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  r ){.      Tcl_A
2660: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2670: 72 70 2c 20 7a 45 72 72 2c 20 7a 4f 70 74 69 6f  rp, zErr, zOptio
2680: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  n, 0);.      ret
2690: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71     }.  }.  .  sq
26b0: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
26c0: 6f 6c 28 2d 31 32 33 34 35 29 3b 20 2f 2a 20 4a  ol(-12345); /* J
26d0: 75 73 74 20 74 6f 20 73 74 72 65 73 73 20 74 68  ust to stress th
26e0: 65 20 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 69  e test_control i
26f0: 6e 74 65 72 66 61 63 65 20 2a 2f 0a 20 20 6e 42  nterface */.  nB
2700: 65 6e 69 67 6e 20 3d 20 73 71 6c 69 74 65 33 5f  enign = sqlite3_
2710: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2720: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
2730: 4c 54 5f 42 45 4e 49 47 4e 5f 46 41 49 4c 55 52  LT_BENIGN_FAILUR
2740: 45 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ES,.            
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 41 55 4c       SQLITE_FAUL
2770: 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43  TINJECTOR_MALLOC
2780: 29 3b 0a 20 20 6e 46 61 69 6c 20 3d 20 73 71 6c  );.  nFail = sql
2790: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
27a0: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
27b0: 4c 5f 46 41 55 4c 54 5f 46 41 49 4c 55 52 45 53  L_FAULT_FAILURES
27c0: 2c 0a 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 20                  
27e0: 20 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a   SQLITE_FAULTINJ
27f0: 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20  ECTOR_MALLOC);. 
2800: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2810: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2820: 54 43 54 52 4c 5f 46 41 55 4c 54 5f 43 4f 4e 46  TCTRL_FAULT_CONF
2830: 49 47 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IG,.            
2840: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2850: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
2860: 4d 41 4c 4c 4f 43 2c 20 69 46 61 69 6c 2c 20 6e  MALLOC, iFail, n
2870: 52 65 70 65 61 74 29 3b 0a 20 20 69 66 28 20 70  Repeat);.  if( p
2880: 42 65 6e 69 67 6e 43 6e 74 20 29 7b 0a 20 20 20  BenignCnt ){.   
2890: 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
28a0: 69 6e 74 65 72 70 2c 20 70 42 65 6e 69 67 6e 43  interp, pBenignC
28b0: 6e 74 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 49 6e  nt, 0, Tcl_NewIn
28c0: 74 4f 62 6a 28 6e 42 65 6e 69 67 6e 29 2c 20 30  tObj(nBenign), 0
28d0: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  );.  }.  Tcl_Set
28e0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
28f0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
2900: 6e 46 61 69 6c 29 29 3b 0a 20 20 72 65 74 75 72  nFail));.  retur
2910: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2920: 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c  ** Usage:    sql
2930: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 70 65  ite3_memdebug_pe
2940: 6e 64 69 6e 67 0a 2a 2a 0a 2a 2a 20 52 65 74 75  nding.**.** Retu
2950: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2960: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6c 6c 73 20   malloc() calls 
2970: 74 68 61 74 20 77 69 6c 6c 20 73 75 63 63 65 65  that will succee
2980: 64 20 62 65 66 6f 72 65 20 61 20 0a 2a 2a 20 73  d before a .** s
2990: 69 6d 75 6c 61 74 65 64 20 66 61 69 6c 75 72 65  imulated failure
29a0: 20 6f 63 63 75 72 73 2e 20 41 20 6e 65 67 61 74   occurs. A negat
29b0: 69 76 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ive return value
29c0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
29d0: 2a 2a 20 6e 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ** no malloc() f
29e0: 61 69 6c 75 72 65 20 69 73 20 73 63 68 65 64 75  ailure is schedu
29f0: 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
2a00: 6e 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67  nt test_memdebug
2a10: 5f 70 65 6e 64 69 6e 67 28 0a 20 20 76 6f 69 64  _pending(.  void
2a20: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2a30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2a40: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2a50: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2a60: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
2a70: 74 20 6e 50 65 6e 64 69 6e 67 3b 0a 20 20 69 66  t nPending;.  if
2a80: 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
2a90: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2aa0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2ab0: 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
2ac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2ad0: 7d 0a 20 20 6e 50 65 6e 64 69 6e 67 20 3d 20 73  }.  nPending = s
2ae0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2af0: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2b00: 54 52 4c 5f 46 41 55 4c 54 5f 50 45 4e 44 49 4e  TRL_FAULT_PENDIN
2b10: 47 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  G,.             
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 41 55 4c       SQLITE_FAUL
2b40: 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43  TINJECTOR_MALLOC
2b50: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
2b60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2b70: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 50 65 6e  l_NewIntObj(nPen
2b80: 64 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  ding));.  return
2b90: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
2ba0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c  ** Usage:    sql
2bb0: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 73 65  ite3_memdebug_se
2bc0: 74 74 69 74 6c 65 20 54 49 54 4c 45 0a 2a 2a 0a  ttitle TITLE.**.
2bd0: 2a 2a 20 53 65 74 20 61 20 74 69 74 6c 65 20 73  ** Set a title s
2be0: 74 72 69 6e 67 20 73 74 6f 72 65 64 20 77 69 74  tring stored wit
2bf0: 68 20 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f  h each allocatio
2c00: 6e 2e 20 20 54 68 65 20 54 49 54 4c 45 20 69 73  n.  The TITLE is
2c10: 0a 2a 2a 20 74 79 70 69 63 61 6c 6c 79 20 74 68  .** typically th
2c20: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  e name of the te
2c30: 73 74 20 74 68 61 74 20 77 61 73 20 72 75 6e 6e  st that was runn
2c40: 69 6e 67 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ing when the.** 
2c50: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 63 63 75 72  allocation occur
2c60: 72 65 64 2e 20 20 54 68 65 20 54 49 54 4c 45 20  red.  The TITLE 
2c70: 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 20 74  is stored with t
2c80: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  he allocation.**
2c90: 20 61 6e 64 20 63 61 6e 20 62 65 20 75 73 65 64   and can be used
2ca0: 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77   to figure out w
2cb0: 68 69 63 68 20 74 65 73 74 73 20 61 72 65 20 6c  hich tests are l
2cc0: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 2e 0a 2a  eaking memory..*
2cd0: 2a 0a 2a 2a 20 45 61 63 68 20 74 69 74 6c 65 20  *.** Each title 
2ce0: 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 70 72  overwrite the pr
2cf0: 65 76 69 6f 75 73 2e 0a 2a 2f 0a 73 74 61 74 69  evious..*/.stati
2d00: 63 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d 64 65  c int test_memde
2d10: 62 75 67 5f 73 65 74 74 69 74 6c 65 28 0a 20 20  bug_settitle(.  
2d20: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
2d30: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2d40: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2d50: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2d60: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2d70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2d80: 69 74 6c 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  itle;.  if( objc
2d90: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2da0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2db0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54 49  rp, 1, objv, "TI
2dc0: 54 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TLE");.    retur
2dd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2de0: 0a 20 20 7a 54 69 74 6c 65 20 3d 20 54 63 6c 5f  .  zTitle = Tcl_
2df0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2e00: 5d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ]);.#ifdef SQLIT
2e10: 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 7b 0a 20  E_MEMDEBUG.  {. 
2e20: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
2e30: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74  lite3MemdebugSet
2e40: 74 69 74 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  title(const char
2e50: 2a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d  *);.    sqlite3M
2e60: 65 6d 64 65 62 75 67 53 65 74 74 69 74 6c 65 28  emdebugSettitle(
2e70: 7a 54 69 74 6c 65 29 3b 0a 20 20 7d 0a 23 65 6e  zTitle);.  }.#en
2e80: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
2e90: 5f 4f 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  _OK;.}..#define 
2ea0: 4d 41 4c 4c 4f 43 5f 4c 4f 47 5f 46 52 41 4d 45  MALLOC_LOG_FRAME
2eb0: 53 20 31 30 20 0a 73 74 61 74 69 63 20 54 63 6c  S 10 .static Tcl
2ec0: 5f 48 61 73 68 54 61 62 6c 65 20 61 4d 61 6c 6c  _HashTable aMall
2ed0: 6f 63 4c 6f 67 3b 0a 73 74 61 74 69 63 20 69 6e  ocLog;.static in
2ee0: 74 20 6d 61 6c 6c 6f 63 4c 6f 67 45 6e 61 62 6c  t mallocLogEnabl
2ef0: 65 64 20 3d 20 30 3b 0a 0a 74 79 70 65 64 65 66  ed = 0;..typedef
2f00: 20 73 74 72 75 63 74 20 4d 61 6c 6c 6f 63 4c 6f   struct MallocLo
2f10: 67 20 4d 61 6c 6c 6f 63 4c 6f 67 3b 0a 73 74 72  g MallocLog;.str
2f20: 75 63 74 20 4d 61 6c 6c 6f 63 4c 6f 67 20 7b 0a  uct MallocLog {.
2f30: 20 20 69 6e 74 20 6e 43 61 6c 6c 3b 0a 20 20 69    int nCall;.  i
2f40: 6e 74 20 6e 42 79 74 65 3b 0a 7d 3b 0a 0a 23 69  nt nByte;.};..#i
2f50: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
2f60: 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
2f70: 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 63   test_memdebug_c
2f80: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6e 42 79 74  allback(int nByt
2f90: 65 2c 20 69 6e 74 20 6e 46 72 61 6d 65 2c 20 76  e, int nFrame, v
2fa0: 6f 69 64 20 2a 2a 61 46 72 61 6d 65 29 7b 0a 20  oid **aFrame){. 
2fb0: 20 69 66 28 20 6d 61 6c 6c 6f 63 4c 6f 67 45 6e   if( mallocLogEn
2fc0: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 4d 61 6c  abled ){.    Mal
2fd0: 6c 6f 63 4c 6f 67 20 2a 70 4c 6f 67 3b 0a 20 20  locLog *pLog;.  
2fe0: 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20    Tcl_HashEntry 
2ff0: 2a 70 45 6e 74 72 79 3b 0a 20 20 20 20 69 6e 74  *pEntry;.    int
3000: 20 69 73 4e 65 77 3b 0a 0a 20 20 20 20 69 6e 74   isNew;..    int
3010: 20 61 4b 65 79 5b 4d 41 4c 4c 4f 43 5f 4c 4f 47   aKey[MALLOC_LOG
3020: 5f 46 52 41 4d 45 53 5d 3b 0a 20 20 20 20 69 6e  _FRAMES];.    in
3030: 74 20 6e 4b 65 79 20 3d 20 73 69 7a 65 6f 66 28  t nKey = sizeof(
3040: 69 6e 74 29 2a 4d 41 4c 4c 4f 43 5f 4c 4f 47 5f  int)*MALLOC_LOG_
3050: 46 52 41 4d 45 53 3b 0a 0a 20 20 20 20 6d 65 6d  FRAMES;..    mem
3060: 73 65 74 28 61 4b 65 79 2c 20 30 2c 20 6e 4b 65  set(aKey, 0, nKe
3070: 79 29 3b 0a 20 20 20 20 69 66 28 20 28 73 69 7a  y);.    if( (siz
3080: 65 6f 66 28 76 6f 69 64 2a 29 2a 6e 46 72 61 6d  eof(void*)*nFram
3090: 65 29 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  e)<nKey ){.     
30a0: 20 6e 4b 65 79 20 3d 20 6e 46 72 61 6d 65 2a 73   nKey = nFrame*s
30b0: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 3b 0a 20 20  izeof(void*);.  
30c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 61    }.    memcpy(a
30d0: 4b 65 79 2c 20 61 46 72 61 6d 65 2c 20 6e 4b 65  Key, aFrame, nKe
30e0: 79 29 3b 0a 0a 20 20 20 20 70 45 6e 74 72 79 20  y);..    pEntry 
30f0: 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68  = Tcl_CreateHash
3100: 45 6e 74 72 79 28 26 61 4d 61 6c 6c 6f 63 4c 6f  Entry(&aMallocLo
3110: 67 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  g, (const char *
3120: 29 61 4b 65 79 2c 20 26 69 73 4e 65 77 29 3b 0a  )aKey, &isNew);.
3130: 20 20 20 20 69 66 28 20 69 73 4e 65 77 20 29 7b      if( isNew ){
3140: 0a 20 20 20 20 20 20 70 4c 6f 67 20 3d 20 28 4d  .      pLog = (M
3150: 61 6c 6c 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 41  allocLog *)Tcl_A
3160: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 4d 61 6c 6c  lloc(sizeof(Mall
3170: 6f 63 4c 6f 67 29 29 3b 0a 20 20 20 20 20 20 6d  ocLog));.      m
3180: 65 6d 73 65 74 28 70 4c 6f 67 2c 20 30 2c 20 73  emset(pLog, 0, s
3190: 69 7a 65 6f 66 28 4d 61 6c 6c 6f 63 4c 6f 67 29  izeof(MallocLog)
31a0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
31b0: 48 61 73 68 56 61 6c 75 65 28 70 45 6e 74 72 79  HashValue(pEntry
31c0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 70 4c  , (ClientData)pL
31d0: 6f 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  og);.    }else{.
31e0: 20 20 20 20 20 20 70 4c 6f 67 20 3d 20 28 4d 61        pLog = (Ma
31f0: 6c 6c 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 47 65  llocLog *)Tcl_Ge
3200: 74 48 61 73 68 56 61 6c 75 65 28 70 45 6e 74 72  tHashValue(pEntr
3210: 79 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  y);.    }..    p
3220: 4c 6f 67 2d 3e 6e 43 61 6c 6c 2b 2b 3b 0a 20 20  Log->nCall++;.  
3230: 20 20 70 4c 6f 67 2d 3e 6e 42 79 74 65 20 2b 3d    pLog->nByte +=
3240: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 7d 0a 23 65   nByte;.  }.}.#e
3250: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
3260: 45 4d 44 45 42 55 47 20 2a 2f 0a 0a 73 74 61 74  EMDEBUG */..stat
3270: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 6d 65 6d  ic void test_mem
3280: 64 65 62 75 67 5f 6c 6f 67 5f 63 6c 65 61 72 28  debug_log_clear(
3290: 29 7b 0a 20 20 54 63 6c 5f 48 61 73 68 53 65 61  ){.  Tcl_HashSea
32a0: 72 63 68 20 73 65 61 72 63 68 3b 0a 20 20 54 63  rch search;.  Tc
32b0: 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e  l_HashEntry *pEn
32c0: 74 72 79 3b 0a 20 20 66 6f 72 28 0a 20 20 20 20  try;.  for(.    
32d0: 70 45 6e 74 72 79 3d 54 63 6c 5f 46 69 72 73 74  pEntry=Tcl_First
32e0: 48 61 73 68 45 6e 74 72 79 28 26 61 4d 61 6c 6c  HashEntry(&aMall
32f0: 6f 63 4c 6f 67 2c 20 26 73 65 61 72 63 68 29 3b  ocLog, &search);
3300: 0a 20 20 20 20 70 45 6e 74 72 79 3b 0a 20 20 20  .    pEntry;.   
3310: 20 70 45 6e 74 72 79 3d 54 63 6c 5f 4e 65 78 74   pEntry=Tcl_Next
3320: 48 61 73 68 45 6e 74 72 79 28 26 73 65 61 72 63  HashEntry(&searc
3330: 68 29 0a 20 20 29 7b 0a 20 20 20 20 4d 61 6c 6c  h).  ){.    Mall
3340: 6f 63 4c 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 4d  ocLog *pLog = (M
3350: 61 6c 6c 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 47  allocLog *)Tcl_G
3360: 65 74 48 61 73 68 56 61 6c 75 65 28 70 45 6e 74  etHashValue(pEnt
3370: 72 79 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65  ry);.    Tcl_Fre
3380: 65 28 28 63 68 61 72 20 2a 29 70 4c 6f 67 29 3b  e((char *)pLog);
3390: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 6c 65 74  .  }.  Tcl_Delet
33a0: 65 48 61 73 68 54 61 62 6c 65 28 26 61 4d 61 6c  eHashTable(&aMal
33b0: 6c 6f 63 4c 6f 67 29 3b 0a 20 20 54 63 6c 5f 49  locLog);.  Tcl_I
33c0: 6e 69 74 48 61 73 68 54 61 62 6c 65 28 26 61 4d  nitHashTable(&aM
33d0: 61 6c 6c 6f 63 4c 6f 67 2c 20 4d 41 4c 4c 4f 43  allocLog, MALLOC
33e0: 5f 4c 4f 47 5f 46 52 41 4d 45 53 29 3b 0a 7d 0a  _LOG_FRAMES);.}.
33f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
3400: 5f 6d 65 6d 64 65 62 75 67 5f 6c 6f 67 28 0a 20  _memdebug_log(. 
3410: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
3420: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
3430: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
3440: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
3450: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
3460: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
3470: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Init = 0;.  int 
3480: 69 53 75 62 3b 0a 0a 20 20 73 74 61 74 69 63 20  iSub;..  static 
3490: 63 6f 6e 73 74 20 63 68 61 72 20 2a 4d 42 5f 73  const char *MB_s
34a0: 74 72 73 5b 5d 20 3d 20 7b 20 22 73 74 61 72 74  trs[] = { "start
34b0: 22 2c 20 22 73 74 6f 70 22 2c 20 22 64 75 6d 70  ", "stop", "dump
34c0: 22 2c 20 22 63 6c 65 61 72 22 2c 20 22 73 79 6e  ", "clear", "syn
34d0: 63 22 20 7d 3b 0a 20 20 65 6e 75 6d 20 4d 42 5f  c" };.  enum MB_
34e0: 65 6e 75 6d 20 7b 20 0a 20 20 20 20 20 20 4d 42  enum { .      MB
34f0: 5f 4c 4f 47 5f 53 54 41 52 54 2c 20 4d 42 5f 4c  _LOG_START, MB_L
3500: 4f 47 5f 53 54 4f 50 2c 20 4d 42 5f 4c 4f 47 5f  OG_STOP, MB_LOG_
3510: 44 55 4d 50 2c 20 4d 42 5f 4c 4f 47 5f 43 4c 45  DUMP, MB_LOG_CLE
3520: 41 52 2c 20 4d 42 5f 4c 4f 47 5f 53 59 4e 43 20  AR, MB_LOG_SYNC 
3530: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 21 69 73  .  };..  if( !is
3540: 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53  Init ){.#ifdef S
3550: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20  QLITE_MEMDEBUG. 
3560: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73     extern void s
3570: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61  qlite3MemdebugBa
3580: 63 6b 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28  cktraceCallback(
3590: 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 28 2a  .        void (*
35a0: 78 42 61 63 6b 74 72 61 63 65 29 28 69 6e 74 2c  xBacktrace)(int,
35b0: 20 69 6e 74 2c 20 76 6f 69 64 20 2a 2a 29 29 3b   int, void **));
35c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 64  .    sqlite3Memd
35d0: 65 62 75 67 42 61 63 6b 74 72 61 63 65 43 61 6c  ebugBacktraceCal
35e0: 6c 62 61 63 6b 28 74 65 73 74 5f 6d 65 6d 64 65  lback(test_memde
35f0: 62 75 67 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 23  bug_callback);.#
3600: 65 6e 64 69 66 0a 20 20 20 20 54 63 6c 5f 49 6e  endif.    Tcl_In
3610: 69 74 48 61 73 68 54 61 62 6c 65 28 26 61 4d 61  itHashTable(&aMa
3620: 6c 6c 6f 63 4c 6f 67 2c 20 4d 41 4c 4c 4f 43 5f  llocLog, MALLOC_
3630: 4c 4f 47 5f 46 52 41 4d 45 53 29 3b 0a 20 20 20  LOG_FRAMES);.   
3640: 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d   isInit = 1;.  }
3650: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
3660: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
3670: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
3680: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d  , objv, "SUB-COM
3690: 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d 0a  MAND ...");.  }.
36a0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
36b0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
36c0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 4d 42 5f 73 74  , objv[1], MB_st
36d0: 72 73 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64  rs, "sub-command
36e0: 22 2c 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a  ", 0, &iSub) ){.
36f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3700: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
3710: 74 63 68 28 20 28 65 6e 75 6d 20 4d 42 5f 65 6e  tch( (enum MB_en
3720: 75 6d 29 69 53 75 62 20 29 7b 0a 20 20 20 20 63  um)iSub ){.    c
3730: 61 73 65 20 4d 42 5f 4c 4f 47 5f 53 54 41 52 54  ase MB_LOG_START
3740: 3a 0a 20 20 20 20 20 20 6d 61 6c 6c 6f 63 4c 6f  :.      mallocLo
3750: 67 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20  gEnabled = 1;.  
3760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
3770: 61 73 65 20 4d 42 5f 4c 4f 47 5f 53 54 4f 50 3a  ase MB_LOG_STOP:
3780: 0a 20 20 20 20 20 20 6d 61 6c 6c 6f 63 4c 6f 67  .      mallocLog
3790: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20  Enabled = 0;.   
37a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
37b0: 73 65 20 4d 42 5f 4c 4f 47 5f 44 55 4d 50 3a 20  se MB_LOG_DUMP: 
37c0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 48 61 73 68  {.      Tcl_Hash
37d0: 53 65 61 72 63 68 20 73 65 61 72 63 68 3b 0a 20  Search search;. 
37e0: 20 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74       Tcl_HashEnt
37f0: 72 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20 20 20  ry *pEntry;.    
3800: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
3810: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
3820: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69  .      assert(si
3830: 7a 65 6f 66 28 69 6e 74 29 3d 3d 73 69 7a 65 6f  zeof(int)==sizeo
3840: 66 28 76 6f 69 64 2a 29 29 3b 0a 0a 20 20 20 20  f(void*));..    
3850: 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 70    for(.        p
3860: 45 6e 74 72 79 3d 54 63 6c 5f 46 69 72 73 74 48  Entry=Tcl_FirstH
3870: 61 73 68 45 6e 74 72 79 28 26 61 4d 61 6c 6c 6f  ashEntry(&aMallo
3880: 63 4c 6f 67 2c 20 26 73 65 61 72 63 68 29 3b 0a  cLog, &search);.
3890: 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 3b 0a          pEntry;.
38a0: 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 3d 54          pEntry=T
38b0: 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e 74 72 79  cl_NextHashEntry
38c0: 28 26 73 65 61 72 63 68 29 0a 20 20 20 20 20 20  (&search).      
38d0: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f  ){.        Tcl_O
38e0: 62 6a 20 2a 61 70 45 6c 65 6d 5b 4d 41 4c 4c 4f  bj *apElem[MALLO
38f0: 43 5f 4c 4f 47 5f 46 52 41 4d 45 53 2b 32 5d 3b  C_LOG_FRAMES+2];
3900: 0a 20 20 20 20 20 20 20 20 4d 61 6c 6c 6f 63 4c  .        MallocL
3910: 6f 67 20 2a 70 4c 6f 67 20 3d 20 28 4d 61 6c 6c  og *pLog = (Mall
3920: 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 47 65 74 48  ocLog *)Tcl_GetH
3930: 61 73 68 56 61 6c 75 65 28 70 45 6e 74 72 79 29  ashValue(pEntry)
3940: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61  ;.        int *a
3950: 4b 65 79 20 3d 20 28 69 6e 74 20 2a 29 54 63 6c  Key = (int *)Tcl
3960: 5f 47 65 74 48 61 73 68 4b 65 79 28 26 61 4d 61  _GetHashKey(&aMa
3970: 6c 6c 6f 63 4c 6f 67 2c 20 70 45 6e 74 72 79 29  llocLog, pEntry)
3980: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
3990: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 61 70 45  ;.  .        apE
39a0: 6c 65 6d 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65 77  lem[0] = Tcl_New
39b0: 49 6e 74 4f 62 6a 28 70 4c 6f 67 2d 3e 6e 43 61  IntObj(pLog->nCa
39c0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 70 45  ll);.        apE
39d0: 6c 65 6d 5b 31 5d 20 3d 20 54 63 6c 5f 4e 65 77  lem[1] = Tcl_New
39e0: 49 6e 74 4f 62 6a 28 70 4c 6f 67 2d 3e 6e 42 79  IntObj(pLog->nBy
39f0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  te);.        for
3a00: 28 69 69 3d 30 3b 20 69 69 3c 4d 41 4c 4c 4f 43  (ii=0; ii<MALLOC
3a10: 5f 4c 4f 47 5f 46 52 41 4d 45 53 3b 20 69 69 2b  _LOG_FRAMES; ii+
3a20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70  +){.          ap
3a30: 45 6c 65 6d 5b 69 69 2b 32 5d 20 3d 20 54 63 6c  Elem[ii+2] = Tcl
3a40: 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 4b 65 79 5b  _NewIntObj(aKey[
3a50: 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ii]);.        }.
3a60: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  .        Tcl_Lis
3a70: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3a80: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 0a  t(interp, pRet,.
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
3aa0: 4e 65 77 4c 69 73 74 4f 62 6a 28 4d 41 4c 4c 4f  NewListObj(MALLO
3ab0: 43 5f 4c 4f 47 5f 46 52 41 4d 45 53 2b 32 2c 20  C_LOG_FRAMES+2, 
3ac0: 61 70 45 6c 65 6d 29 0a 20 20 20 20 20 20 20 20  apElem).        
3ad0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
3ae0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
3af0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
3b00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3b10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 42     }.    case MB
3b20: 5f 4c 4f 47 5f 43 4c 45 41 52 3a 20 7b 0a 20 20  _LOG_CLEAR: {.  
3b30: 20 20 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75      test_memdebu
3b40: 67 5f 6c 6f 67 5f 63 6c 65 61 72 28 29 3b 0a 20  g_log_clear();. 
3b50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3b60: 7d 0a 0a 20 20 20 20 63 61 73 65 20 4d 42 5f 4c  }..    case MB_L
3b70: 4f 47 5f 53 59 4e 43 3a 20 7b 0a 23 69 66 64 65  OG_SYNC: {.#ifde
3b80: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
3b90: 47 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 76  G.      extern v
3ba0: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  oid sqlite3Memde
3bb0: 62 75 67 53 79 6e 63 28 29 3b 0a 20 20 20 20 20  bugSync();.     
3bc0: 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 6c   test_memdebug_l
3bd0: 6f 67 5f 63 6c 65 61 72 28 29 3b 0a 20 20 20 20  og_clear();.    
3be0: 20 20 6d 61 6c 6c 6f 63 4c 6f 67 45 6e 61 62 6c    mallocLogEnabl
3bf0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ed = 1;.      sq
3c00: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 79 6e  lite3MemdebugSyn
3c10: 63 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  c();.#endif.    
3c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3c30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
3c40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
3c50: 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20  gister commands 
3c60: 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
3c70: 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
3c80: 20 53 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c   Sqlitetest_mall
3c90: 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  oc_Init(Tcl_Inte
3ca0: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73  rp *interp){.  s
3cb0: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
3cc0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
3cd0: 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64  .     Tcl_ObjCmd
3ce0: 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d  Proc *xProc;.  }
3cf0: 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20   aObjCmd[] = {. 
3d00: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
3d10: 61 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  alloc",         
3d20: 20 20 20 20 74 65 73 74 5f 6d 61 6c 6c 6f 63 20      test_malloc 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
3d50: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 22 2c 20 20  ite3_realloc",  
3d60: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 72            test_r
3d70: 65 61 6c 6c 6f 63 20 20 20 20 20 20 20 20 20 20  ealloc          
3d80: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
3d90: 7b 20 22 73 71 6c 69 74 65 33 5f 66 72 65 65 22  { "sqlite3_free"
3da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3db0: 74 65 73 74 5f 66 72 65 65 20 20 20 20 20 20 20  test_free       
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
3dd0: 0a 20 20 20 20 20 7b 20 22 6d 65 6d 73 65 74 22  .     { "memset"
3de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3df0: 20 20 20 20 20 20 74 65 73 74 5f 6d 65 6d 73 65        test_memse
3e00: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
3e10: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d      },.     { "m
3e20: 65 6d 67 65 74 22 2c 20 20 20 20 20 20 20 20 20  emget",         
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
3e40: 5f 6d 65 6d 67 65 74 20 20 20 20 20 20 20 20 20  _memget         
3e50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
3e60: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d    { "sqlite3_mem
3e70: 6f 72 79 5f 75 73 65 64 22 2c 20 20 20 20 20 20  ory_used",      
3e80: 20 20 74 65 73 74 5f 6d 65 6d 6f 72 79 5f 75 73    test_memory_us
3e90: 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
3ea0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
3eb0: 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61  e3_memory_highwa
3ec0: 74 65 72 22 2c 20 20 20 74 65 73 74 5f 6d 65 6d  ter",   test_mem
3ed0: 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 20 20  ory_highwater   
3ee0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
3ef0: 22 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75  "sqlite3_memdebu
3f00: 67 5f 62 61 63 6b 74 72 61 63 65 22 2c 20 74 65  g_backtrace", te
3f10: 73 74 5f 6d 65 6d 64 65 62 75 67 5f 62 61 63 6b  st_memdebug_back
3f20: 74 72 61 63 65 20 20 20 20 20 20 20 7d 2c 0a 20  trace       },. 
3f30: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
3f40: 65 6d 64 65 62 75 67 5f 64 75 6d 70 22 2c 20 20  emdebug_dump",  
3f50: 20 20 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75      test_memdebu
3f60: 67 5f 64 75 6d 70 20 20 20 20 20 20 20 20 20 20  g_dump          
3f70: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
3f80: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61  ite3_memdebug_fa
3f90: 69 6c 22 2c 20 20 20 20 20 20 74 65 73 74 5f 6d  il",      test_m
3fa0: 65 6d 64 65 62 75 67 5f 66 61 69 6c 20 20 20 20  emdebug_fail    
3fb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
3fc0: 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65  { "sqlite3_memde
3fd0: 62 75 67 5f 70 65 6e 64 69 6e 67 22 2c 20 20 20  bug_pending",   
3fe0: 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 70 65  test_memdebug_pe
3ff0: 6e 64 69 6e 67 20 20 20 20 20 20 20 20 20 7d 2c  nding         },
4000: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
4010: 5f 6d 65 6d 64 65 62 75 67 5f 73 65 74 74 69 74  _memdebug_settit
4020: 6c 65 22 2c 20 20 74 65 73 74 5f 6d 65 6d 64 65  le",  test_memde
4030: 62 75 67 5f 73 65 74 74 69 74 6c 65 20 20 20 20  bug_settitle    
4040: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
4050: 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f  qlite3_memdebug_
4060: 6d 61 6c 6c 6f 63 5f 63 6f 75 6e 74 22 2c 20 74  malloc_count", t
4070: 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 6d 61 6c  est_memdebug_mal
4080: 6c 6f 63 5f 63 6f 75 6e 74 20 7d 2c 0a 20 20 20  loc_count },.   
4090: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d    { "sqlite3_mem
40a0: 64 65 62 75 67 5f 6c 6f 67 22 2c 20 20 20 20 20  debug_log",     
40b0: 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f    test_memdebug_
40c0: 6c 6f 67 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  log },.  };.  in
40d0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
40e0: 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
40f0: 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
4100: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
4110: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
4120: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
4130: 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  jCmd[i].zName, a
4140: 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  ObjCmd[i].xProc,
4150: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
4160: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a     turn TCL_OK;.}.