/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact eedcc63c9f3111f2ebf6137b117e5644b3bb4c5d:


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 31 39 20 32 30 30 38 2f  c.c,v 1.19 2008/
0200: 30 33 2f 32 35 20 30 39 3a 34 37 3a 33 35 20 64  03/25 09:47:35 d
0210: 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24  anielk1977 Exp $
0220: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0230: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0240: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0250: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0260: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0270: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
0280: 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  sert.h>../*.** T
0290: 72 61 6e 73 66 6f 72 6d 20 70 6f 69 6e 74 65 72  ransform pointer
02a0: 73 20 74 6f 20 74 65 78 74 20 61 6e 64 20 62 61  s to text and ba
02b0: 63 6b 20 61 67 61 69 6e 0a 2a 2f 0a 73 74 61 74  ck again.*/.stat
02c0: 69 63 20 76 6f 69 64 20 70 6f 69 6e 74 65 72 54  ic void pointerT
02d0: 6f 54 65 78 74 28 76 6f 69 64 20 2a 70 2c 20 63  oText(void *p, c
02e0: 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69  har *z){.  stati
02f0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 48 65  c const char zHe
0300: 78 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  x[] = "012345678
0310: 39 61 62 63 64 65 66 22 3b 0a 20 20 69 6e 74 20  9abcdef";.  int 
0320: 69 2c 20 6b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  i, k;.  unsigned
0330: 20 69 6e 74 20 75 3b 0a 20 20 73 71 6c 69 74 65   int u;.  sqlite
0340: 33 5f 75 69 6e 74 36 34 20 6e 3b 0a 20 20 69 66  3_uint64 n;.  if
0350: 28 20 73 69 7a 65 6f 66 28 6e 29 3d 3d 73 69 7a  ( sizeof(n)==siz
0360: 65 6f 66 28 70 29 20 29 7b 0a 20 20 20 20 6d 65  eof(p) ){.    me
0370: 6d 63 70 79 28 26 6e 2c 20 26 70 2c 20 73 69 7a  mcpy(&n, &p, siz
0380: 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65  eof(p));.  }else
0390: 20 69 66 28 20 73 69 7a 65 6f 66 28 75 29 3d 3d   if( sizeof(u)==
03a0: 73 69 7a 65 6f 66 28 70 29 20 29 7b 0a 20 20 20  sizeof(p) ){.   
03b0: 20 6d 65 6d 63 70 79 28 26 75 2c 20 26 70 2c 20   memcpy(&u, &p, 
03c0: 73 69 7a 65 6f 66 28 75 29 29 3b 0a 20 20 20 20  sizeof(u));.    
03d0: 6e 20 3d 20 75 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = u;.  }else{.
03e0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
03f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20  .  }.  for(i=0, 
0400: 6b 3d 73 69 7a 65 6f 66 28 70 29 2a 32 2d 31 3b  k=sizeof(p)*2-1;
0410: 20 69 3c 73 69 7a 65 6f 66 28 70 29 2a 32 3b 20   i<sizeof(p)*2; 
0420: 69 2b 2b 2c 20 6b 2d 2d 29 7b 0a 20 20 20 20 7a  i++, k--){.    z
0430: 5b 6b 5d 20 3d 20 7a 48 65 78 5b 6e 26 30 78 66  [k] = zHex[n&0xf
0440: 5d 3b 0a 20 20 20 20 6e 20 3e 3e 3d 20 34 3b 0a  ];.    n >>= 4;.
0450: 20 20 7d 0a 20 20 7a 5b 73 69 7a 65 6f 66 28 70    }.  z[sizeof(p
0460: 29 2a 32 5d 20 3d 20 30 3b 0a 7d 0a 73 74 61 74  )*2] = 0;.}.stat
0470: 69 63 20 69 6e 74 20 68 65 78 54 6f 49 6e 74 28  ic int hexToInt(
0480: 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20 68 3e  int h){.  if( h>
0490: 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27 20 29  ='0' && h<='9' )
04a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 20 2d  {.    return h -
04b0: 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66   '0';.  }else if
04c0: 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c 3d 27  ( h>='a' && h<='
04d0: 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  f' ){.    return
04e0: 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20   h - 'a' + 10;. 
04f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
0500: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 73 74 61  rn -1;.  }.}.sta
0510: 74 69 63 20 69 6e 74 20 74 65 78 74 54 6f 50 6f  tic int textToPo
0520: 69 6e 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  inter(const char
0530: 20 2a 7a 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b   *z, void **pp){
0540: 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  .  sqlite3_uint6
0550: 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  4 n = 0;.  int i
0560: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
0570: 20 75 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   u;.  for(i=0; i
0580: 3c 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 2a 32  <sizeof(void*)*2
0590: 20 26 26 20 7a 5b 30 5d 3b 20 69 2b 2b 29 7b 0a   && z[0]; i++){.
05a0: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 76      int v;.    v
05b0: 20 3d 20 68 65 78 54 6f 49 6e 74 28 2a 7a 2b 2b   = hexToInt(*z++
05c0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3c 30 20 29  );.    if( v<0 )
05d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
05e0: 52 3b 0a 20 20 20 20 6e 20 3d 20 6e 2a 31 36 20  R;.    n = n*16 
05f0: 2b 20 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  + v;.  }.  if( *
0600: 7a 21 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  z!=0 ) return TC
0610: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73  L_ERROR;.  if( s
0620: 69 7a 65 6f 66 28 6e 29 3d 3d 73 69 7a 65 6f 66  izeof(n)==sizeof
0630: 28 2a 70 70 29 20 29 7b 0a 20 20 20 20 6d 65 6d  (*pp) ){.    mem
0640: 63 70 79 28 70 70 2c 20 26 6e 2c 20 73 69 7a 65  cpy(pp, &n, size
0650: 6f 66 28 6e 29 29 3b 0a 20 20 7d 65 6c 73 65 20  of(n));.  }else 
0660: 69 66 28 20 73 69 7a 65 6f 66 28 75 29 3d 3d 73  if( sizeof(u)==s
0670: 69 7a 65 6f 66 28 2a 70 70 29 20 29 7b 0a 20 20  izeof(*pp) ){.  
0680: 20 20 75 20 3d 20 28 75 6e 73 69 67 6e 65 64 20    u = (unsigned 
0690: 69 6e 74 29 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  int)n;.    memcp
06a0: 79 28 70 70 2c 20 26 75 2c 20 73 69 7a 65 6f 66  y(pp, &u, sizeof
06b0: 28 75 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (u));.  }else{. 
06c0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
06d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
06e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
06f0: 61 67 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f  age:    sqlite3_
0700: 6d 61 6c 6c 6f 63 20 20 4e 42 59 54 45 53 0a 2a  malloc  NBYTES.*
0710: 2a 0a 2a 2a 20 52 61 77 20 74 65 73 74 20 69 6e  *.** Raw test in
0720: 74 65 72 66 61 63 65 20 66 6f 72 20 73 71 6c 69  terface for sqli
0730: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
0740: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
0750: 5f 6d 61 6c 6c 6f 63 28 0a 20 20 76 6f 69 64 20  _malloc(.  void 
0760: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
0770: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0780: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
0790: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
07a0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
07b0: 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a   nByte;.  void *
07c0: 70 3b 0a 20 20 63 68 61 72 20 7a 4f 75 74 5b 31  p;.  char zOut[1
07d0: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
07e0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
07f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0800: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4e 42 59  p, 1, objv, "NBY
0810: 54 45 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TES");.    retur
0820: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0830: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
0840: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
0850: 20 6f 62 6a 76 5b 31 5d 2c 20 26 6e 42 79 74 65   objv[1], &nByte
0860: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
0870: 52 52 4f 52 3b 0a 20 20 70 20 3d 20 73 71 6c 69  RROR;.  p = sqli
0880: 74 65 33 5f 6d 61 6c 6c 6f 63 28 28 75 6e 73 69  te3_malloc((unsi
0890: 67 6e 65 64 29 6e 42 79 74 65 29 3b 0a 20 20 70  gned)nByte);.  p
08a0: 6f 69 6e 74 65 72 54 6f 54 65 78 74 28 70 2c 20  ointerToText(p, 
08b0: 7a 4f 75 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zOut);.  Tcl_App
08c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
08d0: 2c 20 7a 4f 75 74 2c 20 4e 55 4c 4c 29 3b 0a 20  , zOut, NULL);. 
08e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
08f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
0900: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c     sqlite3_reall
0910: 6f 63 20 20 50 52 49 4f 52 20 20 4e 42 59 54 45  oc  PRIOR  NBYTE
0920: 53 0a 2a 2a 0a 2a 2a 20 52 61 77 20 74 65 73 74  S.**.** Raw test
0930: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 73   interface for s
0940: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 29  qlite3_realloc()
0950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0960: 74 65 73 74 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  test_realloc(.  
0970: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
0980: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
0990: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
09a0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
09b0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
09c0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76    int nByte;.  v
09d0: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 2a 70 3b  oid *pPrior, *p;
09e0: 0a 20 20 63 68 61 72 20 7a 4f 75 74 5b 31 30 30  .  char zOut[100
09f0: 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ];.  if( objc!=3
0a00: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
0a10: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
0a20: 20 31 2c 20 6f 62 6a 76 2c 20 22 50 52 49 4f 52   1, objv, "PRIOR
0a30: 20 4e 42 59 54 45 53 22 29 3b 0a 20 20 20 20 72   NBYTES");.    r
0a40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0a50: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
0a60: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
0a70: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e  erp, objv[2], &n
0a80: 42 79 74 65 29 20 29 20 72 65 74 75 72 6e 20 54  Byte) ) return T
0a90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
0aa0: 74 65 78 74 54 6f 50 6f 69 6e 74 65 72 28 54 63  textToPointer(Tc
0ab0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
0ac0: 5b 31 5d 29 2c 20 26 70 50 72 69 6f 72 29 20 29  [1]), &pPrior) )
0ad0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
0ae0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
0af0: 62 61 64 20 70 6f 69 6e 74 65 72 3a 20 22 2c 20  bad pointer: ", 
0b00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
0b10: 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
0b20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0b30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
0b40: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
0b50: 6f 63 28 70 50 72 69 6f 72 2c 20 28 75 6e 73 69  oc(pPrior, (unsi
0b60: 67 6e 65 64 29 6e 42 79 74 65 29 3b 0a 20 20 70  gned)nByte);.  p
0b70: 6f 69 6e 74 65 72 54 6f 54 65 78 74 28 70 2c 20  ointerToText(p, 
0b80: 7a 4f 75 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70  zOut);.  Tcl_App
0b90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0ba0: 2c 20 7a 4f 75 74 2c 20 4e 55 4c 4c 29 3b 0a 20  , zOut, NULL);. 
0bb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0bc0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
0bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
0be0: 20 20 50 52 49 4f 52 0a 2a 2a 0a 2a 2a 20 52 61    PRIOR.**.** Ra
0bf0: 77 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65  w test interface
0c00: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 66 72 65   for sqlite3_fre
0c10: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
0c20: 6e 74 20 74 65 73 74 5f 66 72 65 65 28 0a 20 20  nt test_free(.  
0c30: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
0c40: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
0c50: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
0c60: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
0c70: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
0c80: 20 20 76 6f 69 64 20 2a 70 50 72 69 6f 72 3b 0a    void *pPrior;.
0c90: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
0ca0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
0cb0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
0cc0: 20 6f 62 6a 76 2c 20 22 50 52 49 4f 52 22 29 3b   objv, "PRIOR");
0cd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0ce0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
0cf0: 20 74 65 78 74 54 6f 50 6f 69 6e 74 65 72 28 54   textToPointer(T
0d00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
0d10: 76 5b 31 5d 29 2c 20 26 70 50 72 69 6f 72 29 20  v[1]), &pPrior) 
0d20: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
0d30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0d40: 22 62 61 64 20 70 6f 69 6e 74 65 72 3a 20 22 2c  "bad pointer: ",
0d50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
0d60: 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
0d70: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
0d80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
0d90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 72  sqlite3_free(pPr
0da0: 69 6f 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ior);.  return T
0db0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
0dc0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
0dd0: 72 65 20 69 6e 20 74 65 73 74 5f 68 65 78 69 6f  re in test_hexio
0de0: 2e 63 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .c.*/.int sqlite
0df0: 33 54 65 73 74 48 65 78 54 6f 42 69 6e 28 63 6f  3TestHexToBin(co
0e00: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
0e10: 20 63 68 61 72 20 2a 29 3b 0a 69 6e 74 20 73 71   char *);.int sq
0e20: 6c 69 74 65 33 54 65 73 74 42 69 6e 54 6f 48 65  lite3TestBinToHe
0e30: 78 28 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  x(char*,int);../
0e40: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 6d  *.** Usage:    m
0e50: 65 6d 73 65 74 20 20 41 44 44 52 45 53 53 20 20  emset  ADDRESS  
0e60: 53 49 5a 45 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20  SIZE  HEX.**.** 
0e70: 53 65 74 20 61 20 63 68 75 6e 6b 20 6f 66 20 6d  Set a chunk of m
0e80: 65 6d 6f 72 79 20 28 6f 62 74 61 69 6e 65 64 20  emory (obtained 
0e90: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2c 20 70 72 6f  from malloc, pro
0ea0: 62 61 62 6c 79 29 20 74 6f 20 61 0a 2a 2a 20 73  bably) to a.** s
0eb0: 70 65 63 69 66 69 65 64 20 68 65 78 20 70 61 74  pecified hex pat
0ec0: 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tern..*/.static 
0ed0: 69 6e 74 20 74 65 73 74 5f 6d 65 6d 73 65 74 28  int test_memset(
0ee0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
0ef0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
0f00: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
0f10: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
0f20: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
0f30: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  ){.  void *p;.  
0f40: 69 6e 74 20 73 69 7a 65 2c 20 6e 2c 20 69 3b 0a  int size, n, i;.
0f50: 20 20 63 68 61 72 20 2a 7a 48 65 78 3b 0a 20 20    char *zHex;.  
0f60: 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 63 68  char *zOut;.  ch
0f70: 61 72 20 7a 42 69 6e 5b 31 30 30 5d 3b 0a 0a 20  ar zBin[100];.. 
0f80: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
0f90: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
0fa0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
0fb0: 6f 62 6a 76 2c 20 22 41 44 44 52 45 53 53 20 53  objv, "ADDRESS S
0fc0: 49 5a 45 20 48 45 58 22 29 3b 0a 20 20 20 20 72  IZE HEX");.    r
0fd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0fe0: 0a 20 20 7d 0a 20 20 69 66 28 20 74 65 78 74 54  .  }.  if( textT
0ff0: 6f 50 6f 69 6e 74 65 72 28 54 63 6c 5f 47 65 74  oPointer(Tcl_Get
1000: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1010: 20 26 70 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f   &p) ){.    Tcl_
1020: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1030: 65 72 70 2c 20 22 62 61 64 20 70 6f 69 6e 74 65  erp, "bad pointe
1040: 72 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53 74 72  r: ", Tcl_GetStr
1050: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63  ing(objv[1]), (c
1060: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
1070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1080: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
1090: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
10a0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 73 69 7a  p, objv[2], &siz
10b0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
10c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10d0: 20 20 69 66 28 20 73 69 7a 65 3c 3d 30 20 29 7b    if( size<=0 ){
10e0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
10f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73  esult(interp, "s
1100: 69 7a 65 20 6d 75 73 74 20 62 65 20 70 6f 73 69  ize must be posi
1110: 74 69 76 65 22 2c 20 28 63 68 61 72 2a 29 30 29  tive", (char*)0)
1120: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1130: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 48  _ERROR;.  }.  zH
1140: 65 78 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ex = Tcl_GetStri
1150: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
1160: 5d 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3e  ], &n);.  if( n>
1170: 73 69 7a 65 6f 66 28 7a 42 69 6e 29 2a 32 20 29  sizeof(zBin)*2 )
1180: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 42 69 6e   n = sizeof(zBin
1190: 29 2a 32 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  )*2;.  n = sqlit
11a0: 65 33 54 65 73 74 48 65 78 54 6f 42 69 6e 28 7a  e3TestHexToBin(z
11b0: 48 65 78 2c 20 6e 2c 20 7a 42 69 6e 29 3b 0a 20  Hex, n, zBin);. 
11c0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
11d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11e0: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 64 61  t(interp, "no da
11f0: 74 61 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ta", (char*)0);.
1200: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1210: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74  RROR;.  }.  zOut
1220: 20 3d 20 70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = p;.  for(i=0;
1230: 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20   i<size; i++){. 
1240: 20 20 20 7a 4f 75 74 5b 69 5d 20 3d 20 7a 42 69     zOut[i] = zBi
1250: 6e 5b 69 25 6e 5d 3b 0a 20 20 7d 0a 20 20 72 65  n[i%n];.  }.  re
1260: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1270: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
1280: 6d 65 6d 67 65 74 20 20 41 44 44 52 45 53 53 20  memget  ADDRESS 
1290: 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75   SIZE.**.** Retu
12a0: 72 6e 20 6d 65 6d 6f 72 79 20 61 73 20 68 65 78  rn memory as hex
12b0: 61 64 65 63 69 6d 61 6c 20 74 65 78 74 2e 0a 2a  adecimal text..*
12c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
12d0: 74 5f 6d 65 6d 67 65 74 28 0a 20 20 76 6f 69 64  t_memget(.  void
12e0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
12f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1300: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1310: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1320: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f  T objv[].){.  vo
1330: 69 64 20 2a 70 3b 0a 20 20 69 6e 74 20 73 69 7a  id *p;.  int siz
1340: 65 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42  e, n;.  char *zB
1350: 69 6e 3b 0a 20 20 63 68 61 72 20 7a 48 65 78 5b  in;.  char zHex[
1360: 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
1370: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1380: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1390: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 41  erp, 1, objv, "A
13a0: 44 44 52 45 53 53 20 53 49 5a 45 22 29 3b 0a 20  DDRESS SIZE");. 
13b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13c0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ROR;.  }.  if( t
13d0: 65 78 74 54 6f 50 6f 69 6e 74 65 72 28 54 63 6c  extToPointer(Tcl
13e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13f0: 31 5d 29 2c 20 26 70 29 20 29 7b 0a 20 20 20 20  1]), &p) ){.    
1400: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1410: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 70 6f  (interp, "bad po
1420: 69 6e 74 65 72 3a 20 22 2c 20 54 63 6c 5f 47 65  inter: ", Tcl_Ge
1430: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1440: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
1450: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1460: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
1470: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1480: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1490: 26 73 69 7a 65 29 20 29 7b 0a 20 20 20 20 72 65  &size) ){.    re
14a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14b0: 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 3c 3d    }.  if( size<=
14c0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
14d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
14e0: 2c 20 22 73 69 7a 65 20 6d 75 73 74 20 62 65 20  , "size must be 
14f0: 70 6f 73 69 74 69 76 65 22 2c 20 28 63 68 61 72  positive", (char
1500: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
1510: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1520: 20 20 7a 42 69 6e 20 3d 20 70 3b 0a 20 20 77 68    zBin = p;.  wh
1530: 69 6c 65 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20  ile( size>0 ){. 
1540: 20 20 20 69 66 28 20 73 69 7a 65 3e 28 73 69 7a     if( size>(siz
1550: 65 6f 66 28 7a 48 65 78 29 2d 31 29 2f 32 20 29  eof(zHex)-1)/2 )
1560: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 73 69 7a  {.      n = (siz
1570: 65 6f 66 28 7a 48 65 78 29 2d 31 29 2f 32 3b 0a  eof(zHex)-1)/2;.
1580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1590: 20 6e 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 7d   n = size;.    }
15a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 78  .    memcpy(zHex
15b0: 2c 20 7a 42 69 6e 2c 20 6e 29 3b 0a 20 20 20 20  , zBin, n);.    
15c0: 7a 42 69 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 73  zBin += n;.    s
15d0: 69 7a 65 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 71  ize -= n;.    sq
15e0: 6c 69 74 65 33 54 65 73 74 42 69 6e 54 6f 48 65  lite3TestBinToHe
15f0: 78 28 7a 48 65 78 2c 20 6e 29 3b 0a 20 20 20 20  x(zHex, n);.    
1600: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1610: 28 69 6e 74 65 72 70 2c 20 7a 48 65 78 2c 20 28  (interp, zHex, (
1620: 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  char*)0);.  }.  
1630: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1640: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1650: 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79    sqlite3_memory
1660: 5f 75 73 65 64 0a 2a 2a 0a 2a 2a 20 52 61 77 20  _used.**.** Raw 
1670: 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 20 66  test interface f
1680: 6f 72 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  or sqlite3_memor
1690: 79 5f 75 73 65 64 28 29 2e 0a 2a 2f 0a 73 74 61  y_used()..*/.sta
16a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d  tic int test_mem
16b0: 6f 72 79 5f 75 73 65 64 28 0a 20 20 76 6f 69 64  ory_used(.  void
16c0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
16d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16e0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
16f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1700: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1710: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1720: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
1730: 64 65 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  deIntObj(sqlite3
1740: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 29 29  _memory_used()))
1750: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1770: 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65  e:    sqlite3_me
1780: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 3f  mory_highwater ?
1790: 52 45 53 45 54 46 4c 41 47 3f 0a 2a 2a 0a 2a 2a  RESETFLAG?.**.**
17a0: 20 52 61 77 20 74 65 73 74 20 69 6e 74 65 72 66   Raw test interf
17b0: 61 63 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ace for sqlite3_
17c0: 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
17d0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
17e0: 74 20 74 65 73 74 5f 6d 65 6d 6f 72 79 5f 68 69  t test_memory_hi
17f0: 67 68 77 61 74 65 72 28 0a 20 20 76 6f 69 64 20  ghwater(.  void 
1800: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1810: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1820: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1830: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1840: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
1850: 20 72 65 73 65 74 46 6c 61 67 20 3d 20 30 3b 0a   resetFlag = 0;.
1860: 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26    if( objc!=1 &&
1870: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1880: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1890: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
18a0: 2c 20 22 3f 52 45 53 45 54 3f 22 29 3b 0a 20 20  , "?RESET?");.  
18b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
18d0: 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
18e0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
18f0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1900: 62 6a 76 5b 31 5d 2c 20 26 72 65 73 65 74 46 6c  bjv[1], &resetFl
1910: 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ag) ) return TCL
1920: 5f 45 52 52 4f 52 3b 0a 20 20 7d 20 0a 20 20 54  _ERROR;.  } .  T
1930: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1940: 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
1950: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
1960: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
1970: 69 67 68 77 61 74 65 72 28 72 65 73 65 74 46 6c  ighwater(resetFl
1980: 61 67 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ag)));.  return 
1990: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19a0: 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74   Usage:    sqlit
19b0: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 62 61 63 6b  e3_memdebug_back
19c0: 74 72 61 63 65 20 44 45 50 54 48 0a 2a 2a 0a 2a  trace DEPTH.**.*
19d0: 2a 20 53 65 74 20 74 68 65 20 64 65 70 74 68 20  * Set the depth 
19e0: 6f 66 20 62 61 63 6b 74 72 61 63 69 6e 67 2e 20  of backtracing. 
19f0: 20 49 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45   If SQLITE_MEMDE
1a00: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
1a10: 65 64 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ed.** then this 
1a20: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1a30: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
1a40: 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f  t test_memdebug_
1a50: 62 61 63 6b 74 72 61 63 65 28 0a 20 20 76 6f 69  backtrace(.  voi
1a60: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1a70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a80: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1a90: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1aa0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
1ab0: 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20  nt depth;.  if( 
1ac0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1ad0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1ae0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1af0: 20 22 44 45 50 54 22 29 3b 0a 20 20 20 20 72 65   "DEPT");.    re
1b00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b10: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
1b20: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1b30: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 64 65  rp, objv[1], &de
1b40: 70 74 68 29 20 29 20 72 65 74 75 72 6e 20 54 43  pth) ) return TC
1b50: 4c 5f 45 52 52 4f 52 3b 0a 23 69 66 64 65 66 20  L_ERROR;.#ifdef 
1b60: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a  SQLITE_MEMDEBUG.
1b70: 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76    {.    extern v
1b80: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  oid sqlite3Memde
1b90: 62 75 67 42 61 63 6b 74 72 61 63 65 28 69 6e 74  bugBacktrace(int
1ba0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65  );.    sqlite3Me
1bb0: 6d 64 65 62 75 67 42 61 63 6b 74 72 61 63 65 28  mdebugBacktrace(
1bc0: 64 65 70 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  depth);.  }.#end
1bd0: 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
1be0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1bf0: 67 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ge:    sqlite3_m
1c00: 65 6d 64 65 62 75 67 5f 64 75 6d 70 20 20 46 49  emdebug_dump  FI
1c10: 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 57 72 69  LENAME.**.** Wri
1c20: 74 65 20 61 20 73 75 6d 6d 61 72 79 20 6f 66 20  te a summary of 
1c30: 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 74  unfreed memory t
1c40: 6f 20 46 49 4c 45 4e 41 4d 45 2e 0a 2a 2f 0a 73  o FILENAME..*/.s
1c50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
1c60: 65 6d 64 65 62 75 67 5f 64 75 6d 70 28 0a 20 20  emdebug_dump(.  
1c70: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1c80: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1c90: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1ca0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1cb0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1cc0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1cd0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1ce0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1cf0: 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45   objv, "FILENAME
1d00: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1d10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 69  CL_ERROR;.  }.#i
1d20: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d30: 5f 4d 45 4d 44 45 42 55 47 29 20 7c 7c 20 64 65  _MEMDEBUG) || de
1d40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45 4d  fined(SQLITE_MEM
1d50: 4f 52 59 5f 53 49 5a 45 29 20 5c 0a 20 20 20 20  ORY_SIZE) \.    
1d60: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1d70: 54 45 5f 50 4f 57 32 5f 4d 45 4d 4f 52 59 5f 53  TE_POW2_MEMORY_S
1d80: 49 5a 45 29 0a 20 20 7b 0a 20 20 20 20 65 78 74  IZE).  {.    ext
1d90: 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 33  ern void sqlite3
1da0: 4d 65 6d 64 65 62 75 67 44 75 6d 70 28 63 6f 6e  MemdebugDump(con
1db0: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 73  st char*);.    s
1dc0: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 44 75  qlite3MemdebugDu
1dd0: 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
1de0: 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 7d 0a  (objv[1]));.  }.
1df0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1e00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e10: 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74   Usage:    sqlit
1e20: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6d 61 6c 6c  e3_memdebug_mall
1e30: 6f 63 5f 63 6f 75 6e 74 0a 2a 2a 0a 2a 2a 20 52  oc_count.**.** R
1e40: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1e50: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
1e60: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 62 65 65  malloc() has bee
1e70: 6e 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  n called..*/.sta
1e80: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d  tic int test_mem
1e90: 64 65 62 75 67 5f 6d 61 6c 6c 6f 63 5f 63 6f 75  debug_malloc_cou
1ea0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
1eb0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ec0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ed0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1ee0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ef0: 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 6c  [].){.  int nMal
1f00: 6c 6f 63 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  loc = -1;.  if( 
1f10: 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
1f20: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f30: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f40: 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
1f50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f60: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1f70: 54 45 5f 4d 45 4d 44 45 42 55 47 29 0a 20 20 7b  TE_MEMDEBUG).  {
1f80: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1f90: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 4d  sqlite3MemdebugM
1fa0: 61 6c 6c 6f 63 43 6f 75 6e 74 28 29 3b 0a 20 20  allocCount();.  
1fb0: 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c 69    nMalloc = sqli
1fc0: 74 65 33 4d 65 6d 64 65 62 75 67 4d 61 6c 6c 6f  te3MemdebugMallo
1fd0: 63 43 6f 75 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  cCount();.  }.#e
1fe0: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
1ff0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2000: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d  Tcl_NewIntObj(nM
2010: 61 6c 6c 6f 63 29 29 3b 0a 20 20 72 65 74 75 72  alloc));.  retur
2020: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
2030: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71  .** Usage:    sq
2040: 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66  lite3_memdebug_f
2050: 61 69 6c 20 20 43 4f 55 4e 54 45 52 20 20 3f 4f  ail  COUNTER  ?O
2060: 50 54 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 77 68  PTIONS?.**.** wh
2070: 65 72 65 20 6f 70 74 69 6f 6e 73 20 61 72 65 3a  ere options are:
2080: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2d 72 65 70 65  .**.**     -repe
2090: 61 74 20 20 20 20 3c 63 6f 75 6e 74 3e 0a 2a 2a  at    <count>.**
20a0: 20 20 20 20 20 2d 62 65 6e 69 67 6e 63 6e 74 20       -benigncnt 
20b0: 3c 76 61 72 6e 61 6d 65 3e 0a 2a 2a 0a 2a 2a 20  <varname>.**.** 
20c0: 41 72 72 61 6e 67 65 20 66 6f 72 20 61 20 73 69  Arrange for a si
20d0: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
20e0: 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20 43   failure after C
20f0: 4f 55 4e 54 45 52 20 73 75 63 63 65 73 73 65 73  OUNTER successes
2100: 2e 0a 2a 2a 20 49 66 20 61 20 72 65 70 65 61 74  ..** If a repeat
2110: 20 63 6f 75 6e 74 20 69 73 20 73 70 65 63 69 66   count is specif
2120: 69 65 64 2c 20 74 68 65 20 66 61 75 6c 74 20 69  ied, the fault i
2130: 73 20 72 65 70 65 61 74 65 64 20 74 68 61 74 20  s repeated that 
2140: 6d 61 6e 79 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  many.** times..*
2150: 2a 0a 2a 2a 20 45 61 63 68 20 63 61 6c 6c 20 74  *.** Each call t
2160: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  o this routine o
2170: 76 65 72 72 69 64 65 73 20 74 68 65 20 70 72 69  verrides the pri
2180: 6f 72 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65  or counter value
2190: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
21a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
21b0: 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 61 74 65  mber of simulate
21c0: 64 20 66 61 69 6c 75 72 65 73 20 74 68 61 74 20  d failures that 
21d0: 68 61 76 65 0a 2a 2a 20 68 61 70 70 65 6e 65 64  have.** happened
21e0: 20 73 69 6e 63 65 20 74 68 65 20 70 72 65 76 69   since the previ
21f0: 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ous call to this
2200: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
2210: 54 6f 20 64 69 73 61 62 6c 65 20 73 69 6d 75 6c  To disable simul
2220: 61 74 65 64 20 66 61 69 6c 75 72 65 73 2c 20 75  ated failures, u
2230: 73 65 20 61 20 43 4f 55 4e 54 45 52 20 6f 66 20  se a COUNTER of 
2240: 2d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  -1..*/.static in
2250: 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f  t test_memdebug_
2260: 66 61 69 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  fail(.  void * c
2270: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2280: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2290: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
22a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22b0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 69  jv[].){.  int ii
22c0: 3b 0a 20 20 69 6e 74 20 69 46 61 69 6c 3b 0a 20  ;.  int iFail;. 
22d0: 20 69 6e 74 20 6e 52 65 70 65 61 74 20 3d 20 31   int nRepeat = 1
22e0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 42 65  ;.  Tcl_Obj *pBe
22f0: 6e 69 67 6e 43 6e 74 20 3d 20 30 3b 0a 20 20 69  nignCnt = 0;.  i
2300: 6e 74 20 6e 42 65 6e 69 67 6e 3b 0a 20 20 69 6e  nt nBenign;.  in
2310: 74 20 6e 46 61 69 6c 20 3d 20 30 3b 0a 0a 20 20  t nFail = 0;..  
2320: 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
2330: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2340: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2350: 6a 76 2c 20 22 43 4f 55 4e 54 45 52 20 3f 4f 50  jv, "COUNTER ?OP
2360: 54 49 4f 4e 53 3f 22 29 3b 0a 20 20 20 20 72 65  TIONS?");.    re
2370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2380: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
2390: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
23a0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69 46  rp, objv[1], &iF
23b0: 61 69 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  ail) ) return TC
23c0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 66 6f 72 28  L_ERROR;..  for(
23d0: 69 69 3d 32 3b 20 69 69 3c 6f 62 6a 63 3b 20 69  ii=2; ii<objc; i
23e0: 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 6e  i+=2){.    int n
23f0: 4f 70 74 69 6f 6e 3b 0a 20 20 20 20 63 68 61 72  Option;.    char
2400: 20 2a 7a 4f 70 74 69 6f 6e 20 3d 20 54 63 6c 5f   *zOption = Tcl_
2410: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
2420: 28 6f 62 6a 76 5b 69 69 5d 2c 20 26 6e 4f 70 74  (objv[ii], &nOpt
2430: 69 6f 6e 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ion);.    char *
2440: 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69  zErr = 0;..    i
2450: 66 28 20 6e 4f 70 74 69 6f 6e 3e 31 20 26 26 20  f( nOption>1 && 
2460: 73 74 72 6e 63 6d 70 28 7a 4f 70 74 69 6f 6e 2c  strncmp(zOption,
2470: 20 22 2d 72 65 70 65 61 74 22 2c 20 6e 4f 70 74   "-repeat", nOpt
2480: 69 6f 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ion)==0 ){.     
2490: 20 69 66 28 20 69 69 3d 3d 28 6f 62 6a 63 2d 31   if( ii==(objc-1
24a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72  ) ){.        zEr
24b0: 72 20 3d 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  r = "option requ
24c0: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
24d0: 3a 20 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : ";.      }else
24e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 54 63  {.        if( Tc
24f0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2500: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 69 2b  interp, objv[ii+
2510: 31 5d 2c 20 26 6e 52 65 70 65 61 74 29 20 29 7b  1], &nRepeat) ){
2520: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2550: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4f 70     }else if( nOp
2560: 74 69 6f 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  tion>1 && strncm
2570: 70 28 7a 4f 70 74 69 6f 6e 2c 20 22 2d 62 65 6e  p(zOption, "-ben
2580: 69 67 6e 63 6e 74 22 2c 20 6e 4f 70 74 69 6f 6e  igncnt", nOption
2590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
25a0: 28 20 69 69 3d 3d 28 6f 62 6a 63 2d 31 29 20 29  ( ii==(objc-1) )
25b0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
25c0: 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   "option require
25d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 22  s an argument: "
25e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25f0: 20 20 20 20 20 20 20 70 42 65 6e 69 67 6e 43 6e         pBenignCn
2600: 74 20 3d 20 6f 62 6a 76 5b 69 69 2b 31 5d 3b 0a  t = objv[ii+1];.
2610: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2620: 65 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20  e{.      zErr = 
2630: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
2640: 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   ";.    }..    i
2650: 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
2660: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2670: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
2680: 7a 4f 70 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  zOption, 0);.   
2690: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
26b0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74   .  sqlite3_test
26c0: 5f 63 6f 6e 74 72 6f 6c 28 2d 31 32 33 34 35 29  _control(-12345)
26d0: 3b 20 2f 2a 20 4a 75 73 74 20 74 6f 20 73 74 72  ; /* Just to str
26e0: 65 73 73 20 74 68 65 20 74 65 73 74 5f 63 6f 6e  ess the test_con
26f0: 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 2a  trol interface *
2700: 2f 0a 20 20 6e 42 65 6e 69 67 6e 20 3d 20 73 71  /.  nBenign = sq
2710: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2720: 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2730: 52 4c 5f 46 41 55 4c 54 5f 42 45 4e 49 47 4e 5f  RL_FAULT_BENIGN_
2740: 46 41 49 4c 55 52 45 53 2c 0a 20 20 20 20 20 20  FAILURES,.      
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2770: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
2780: 4d 41 4c 4c 4f 43 29 3b 0a 20 20 6e 46 61 69 6c  MALLOC);.  nFail
2790: 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
27a0: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
27b0: 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 46 41  ESTCTRL_FAULT_FA
27c0: 49 4c 55 52 45 53 2c 0a 20 20 20 20 20 20 20 20  ILURES,.        
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 41         SQLITE_FA
27f0: 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c  ULTINJECTOR_MALL
2800: 4f 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  OC);.  sqlite3_t
2810: 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2820: 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
2830: 54 5f 43 4f 4e 46 49 47 2c 0a 20 20 20 20 20 20  T_CONFIG,.      
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a   SQLITE_FAULTINJ
2860: 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20 69 46  ECTOR_MALLOC, iF
2870: 61 69 6c 2c 20 6e 52 65 70 65 61 74 29 3b 0a 20  ail, nRepeat);. 
2880: 20 69 66 28 20 70 42 65 6e 69 67 6e 43 6e 74 20   if( pBenignCnt 
2890: 29 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65  ){.    Tcl_ObjSe
28a0: 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 70 42  tVar2(interp, pB
28b0: 65 6e 69 67 6e 43 6e 74 2c 20 30 2c 20 54 63 6c  enignCnt, 0, Tcl
28c0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 65 6e 69  _NewIntObj(nBeni
28d0: 67 6e 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54  gn), 0);.  }.  T
28e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
28f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
2900: 6e 74 4f 62 6a 28 6e 46 61 69 6c 29 29 3b 0a 20  ntObj(nFail));. 
2910: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2920: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2930: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
2940: 62 75 67 5f 70 65 6e 64 69 6e 67 0a 2a 2a 0a 2a  bug_pending.**.*
2950: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
2960: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20  ber of malloc() 
2970: 63 61 6c 6c 73 20 74 68 61 74 20 77 69 6c 6c 20  calls that will 
2980: 73 75 63 63 65 65 64 20 62 65 66 6f 72 65 20 61  succeed before a
2990: 20 0a 2a 2a 20 73 69 6d 75 6c 61 74 65 64 20 66   .** simulated f
29a0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 20 41  ailure occurs. A
29b0: 20 6e 65 67 61 74 69 76 65 20 72 65 74 75 72 6e   negative return
29c0: 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
29d0: 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 6d 61 6c 6c   that.** no mall
29e0: 6f 63 28 29 20 66 61 69 6c 75 72 65 20 69 73 20  oc() failure is 
29f0: 73 63 68 65 64 75 6c 65 64 2e 0a 2a 2f 0a 73 74  scheduled..*/.st
2a00: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 65  atic int test_me
2a10: 6d 64 65 62 75 67 5f 70 65 6e 64 69 6e 67 28 0a  mdebug_pending(.
2a20: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
2a30: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2a40: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2a50: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2a60: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2a70: 7b 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67  {.  int nPending
2a80: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
2a90: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2aa0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2ab0: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
2ac0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ad0: 4f 52 3b 0a 20 20 7d 0a 20 20 6e 50 65 6e 64 69  OR;.  }.  nPendi
2ae0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  ng = sqlite3_tes
2af0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
2b00: 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f  _TESTCTRL_FAULT_
2b10: 50 45 4e 44 49 4e 47 2c 0a 20 20 20 20 20 20 20  PENDING,.       
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2b40: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
2b50: 4d 41 4c 4c 4f 43 29 3b 0a 20 20 54 63 6c 5f 53  MALLOC);.  Tcl_S
2b60: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2b70: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
2b80: 6a 28 6e 50 65 6e 64 69 6e 67 29 29 3b 0a 20 20  j(nPending));.  
2b90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2ba0: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
2bb0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
2bc0: 62 75 67 5f 73 65 74 74 69 74 6c 65 20 54 49 54  bug_settitle TIT
2bd0: 4c 45 0a 2a 2a 0a 2a 2a 20 53 65 74 20 61 20 74  LE.**.** Set a t
2be0: 69 74 6c 65 20 73 74 72 69 6e 67 20 73 74 6f 72  itle string stor
2bf0: 65 64 20 77 69 74 68 20 65 61 63 68 20 61 6c 6c  ed with each all
2c00: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 54 49  ocation.  The TI
2c10: 54 4c 45 20 69 73 0a 2a 2a 20 74 79 70 69 63 61  TLE is.** typica
2c20: 6c 6c 79 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lly the name of 
2c30: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
2c40: 73 20 72 75 6e 6e 69 6e 67 20 77 68 65 6e 20 74  s running when t
2c50: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
2c60: 20 6f 63 63 75 72 72 65 64 2e 20 20 54 68 65 20   occurred.  The 
2c70: 54 49 54 4c 45 20 69 73 20 73 74 6f 72 65 64 20  TITLE is stored 
2c80: 77 69 74 68 20 74 68 65 20 61 6c 6c 6f 63 61 74  with the allocat
2c90: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 63 61 6e 20 62  ion.** and can b
2ca0: 65 20 75 73 65 64 20 74 6f 20 66 69 67 75 72 65  e used to figure
2cb0: 20 6f 75 74 20 77 68 69 63 68 20 74 65 73 74 73   out which tests
2cc0: 20 61 72 65 20 6c 65 61 6b 69 6e 67 20 6d 65 6d   are leaking mem
2cd0: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ory..**.** Each 
2ce0: 74 69 74 6c 65 20 6f 76 65 72 77 72 69 74 65 20  title overwrite 
2cf0: 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2f  the previous..*/
2d00: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2d10: 5f 6d 65 6d 64 65 62 75 67 5f 73 65 74 74 69 74  _memdebug_settit
2d20: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
2d30: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2d40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2d50: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2d60: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2d70: 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
2d80: 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20 20 69 66  ar *zTitle;.  if
2d90: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2da0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2db0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2dc0: 76 2c 20 22 54 49 54 4c 45 22 29 3b 0a 20 20 20  v, "TITLE");.   
2dd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2de0: 52 3b 0a 20 20 7d 0a 20 20 7a 54 69 74 6c 65 20  R;.  }.  zTitle 
2df0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2e00: 6f 62 6a 76 5b 31 5d 29 3b 0a 23 69 66 64 65 66  objv[1]);.#ifdef
2e10: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
2e20: 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
2e30: 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  int sqlite3Memde
2e40: 62 75 67 53 65 74 74 69 74 6c 65 28 63 6f 6e 73  bugSettitle(cons
2e50: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 73 71  t char*);.    sq
2e60: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74  lite3MemdebugSet
2e70: 74 69 74 6c 65 28 7a 54 69 74 6c 65 29 3b 0a 20  title(zTitle);. 
2e80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2e90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 64  rn TCL_OK;.}..#d
2ea0: 65 66 69 6e 65 20 4d 41 4c 4c 4f 43 5f 4c 4f 47  efine MALLOC_LOG
2eb0: 5f 46 52 41 4d 45 53 20 31 30 20 0a 73 74 61 74  _FRAMES 10 .stat
2ec0: 69 63 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65  ic Tcl_HashTable
2ed0: 20 61 4d 61 6c 6c 6f 63 4c 6f 67 3b 0a 73 74 61   aMallocLog;.sta
2ee0: 74 69 63 20 69 6e 74 20 6d 61 6c 6c 6f 63 4c 6f  tic int mallocLo
2ef0: 67 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 0a 74  gEnabled = 0;..t
2f00: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 61  ypedef struct Ma
2f10: 6c 6c 6f 63 4c 6f 67 20 4d 61 6c 6c 6f 63 4c 6f  llocLog MallocLo
2f20: 67 3b 0a 73 74 72 75 63 74 20 4d 61 6c 6c 6f 63  g;.struct Malloc
2f30: 4c 6f 67 20 7b 0a 20 20 69 6e 74 20 6e 43 61 6c  Log {.  int nCal
2f40: 6c 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  l;.  int nByte;.
2f50: 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  };..static void 
2f60: 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 63 61  test_memdebug_ca
2f70: 6c 6c 62 61 63 6b 28 69 6e 74 20 6e 42 79 74 65  llback(int nByte
2f80: 2c 20 69 6e 74 20 6e 46 72 61 6d 65 2c 20 76 6f  , int nFrame, vo
2f90: 69 64 20 2a 2a 61 46 72 61 6d 65 29 7b 0a 20 20  id **aFrame){.  
2fa0: 69 66 28 20 6d 61 6c 6c 6f 63 4c 6f 67 45 6e 61  if( mallocLogEna
2fb0: 62 6c 65 64 20 29 7b 0a 20 20 20 20 4d 61 6c 6c  bled ){.    Mall
2fc0: 6f 63 4c 6f 67 20 2a 70 4c 6f 67 3b 0a 20 20 20  ocLog *pLog;.   
2fd0: 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a   Tcl_HashEntry *
2fe0: 70 45 6e 74 72 79 3b 0a 20 20 20 20 69 6e 74 20  pEntry;.    int 
2ff0: 69 73 4e 65 77 3b 0a 0a 20 20 20 20 69 6e 74 20  isNew;..    int 
3000: 61 4b 65 79 5b 4d 41 4c 4c 4f 43 5f 4c 4f 47 5f  aKey[MALLOC_LOG_
3010: 46 52 41 4d 45 53 5d 3b 0a 20 20 20 20 69 6e 74  FRAMES];.    int
3020: 20 6e 4b 65 79 20 3d 20 73 69 7a 65 6f 66 28 69   nKey = sizeof(i
3030: 6e 74 29 2a 4d 41 4c 4c 4f 43 5f 4c 4f 47 5f 46  nt)*MALLOC_LOG_F
3040: 52 41 4d 45 53 3b 0a 0a 20 20 20 20 6d 65 6d 73  RAMES;..    mems
3050: 65 74 28 61 4b 65 79 2c 20 30 2c 20 6e 4b 65 79  et(aKey, 0, nKey
3060: 29 3b 0a 20 20 20 20 69 66 28 20 28 73 69 7a 65  );.    if( (size
3070: 6f 66 28 76 6f 69 64 2a 29 2a 6e 46 72 61 6d 65  of(void*)*nFrame
3080: 29 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  )<nKey ){.      
3090: 6e 4b 65 79 20 3d 20 6e 46 72 61 6d 65 2a 73 69  nKey = nFrame*si
30a0: 7a 65 6f 66 28 76 6f 69 64 2a 29 3b 0a 20 20 20  zeof(void*);.   
30b0: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 4b   }.    memcpy(aK
30c0: 65 79 2c 20 61 46 72 61 6d 65 2c 20 6e 4b 65 79  ey, aFrame, nKey
30d0: 29 3b 0a 0a 20 20 20 20 70 45 6e 74 72 79 20 3d  );..    pEntry =
30e0: 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68 45   Tcl_CreateHashE
30f0: 6e 74 72 79 28 26 61 4d 61 6c 6c 6f 63 4c 6f 67  ntry(&aMallocLog
3100: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
3110: 61 4b 65 79 2c 20 26 69 73 4e 65 77 29 3b 0a 20  aKey, &isNew);. 
3120: 20 20 20 69 66 28 20 69 73 4e 65 77 20 29 7b 0a     if( isNew ){.
3130: 20 20 20 20 20 20 70 4c 6f 67 20 3d 20 28 4d 61        pLog = (Ma
3140: 6c 6c 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 41 6c  llocLog *)Tcl_Al
3150: 6c 6f 63 28 73 69 7a 65 6f 66 28 4d 61 6c 6c 6f  loc(sizeof(Mallo
3160: 63 4c 6f 67 29 29 3b 0a 20 20 20 20 20 20 6d 65  cLog));.      me
3170: 6d 73 65 74 28 70 4c 6f 67 2c 20 30 2c 20 73 69  mset(pLog, 0, si
3180: 7a 65 6f 66 28 4d 61 6c 6c 6f 63 4c 6f 67 29 29  zeof(MallocLog))
3190: 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 48  ;.      Tcl_SetH
31a0: 61 73 68 56 61 6c 75 65 28 70 45 6e 74 72 79 2c  ashValue(pEntry,
31b0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 70 4c 6f   (ClientData)pLo
31c0: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
31d0: 20 20 20 20 20 70 4c 6f 67 20 3d 20 28 4d 61 6c       pLog = (Mal
31e0: 6c 6f 63 4c 6f 67 20 2a 29 54 63 6c 5f 47 65 74  locLog *)Tcl_Get
31f0: 48 61 73 68 56 61 6c 75 65 28 70 45 6e 74 72 79  HashValue(pEntry
3200: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4c  );.    }..    pL
3210: 6f 67 2d 3e 6e 43 61 6c 6c 2b 2b 3b 0a 20 20 20  og->nCall++;.   
3220: 20 70 4c 6f 67 2d 3e 6e 42 79 74 65 20 2b 3d 20   pLog->nByte += 
3230: 6e 42 79 74 65 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  nByte;.  }.}..st
3240: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 65  atic int test_me
3250: 6d 64 65 62 75 67 5f 6c 6f 67 28 0a 20 20 76 6f  mdebug_log(.  vo
3260: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
3270: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3280: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
3290: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
32a0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
32b0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69  static int isIni
32c0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53 75  t = 0;.  int iSu
32d0: 62 3b 0a 0a 20 20 65 6e 75 6d 20 4d 42 5f 65 6e  b;..  enum MB_en
32e0: 75 6d 20 7b 20 4d 42 5f 4c 4f 47 5f 53 54 41 52  um { MB_LOG_STAR
32f0: 54 2c 20 4d 42 5f 4c 4f 47 5f 53 54 4f 50 2c 20  T, MB_LOG_STOP, 
3300: 4d 42 5f 4c 4f 47 5f 44 55 4d 50 2c 20 4d 42 5f  MB_LOG_DUMP, MB_
3310: 4c 4f 47 5f 43 4c 45 41 52 20 7d 3b 0a 20 20 73  LOG_CLEAR };.  s
3320: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3330: 20 2a 4d 42 5f 73 74 72 73 5b 5d 20 3d 20 7b 20   *MB_strs[] = { 
3340: 22 73 74 61 72 74 22 2c 20 22 73 74 6f 70 22 2c  "start", "stop",
3350: 20 22 64 75 6d 70 22 2c 20 22 63 6c 65 61 72 22   "dump", "clear"
3360: 20 7d 3b 0a 0a 20 20 69 66 28 20 21 69 73 49 6e   };..  if( !isIn
3370: 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  it ){.#ifdef SQL
3380: 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20  ITE_MEMDEBUG.   
3390: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
33a0: 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63 6b  ite3MemdebugBack
33b0: 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 0a 20  traceCallback(. 
33c0: 20 20 20 20 20 20 20 76 6f 69 64 20 28 2a 78 42         void (*xB
33d0: 61 63 6b 74 72 61 63 65 29 28 69 6e 74 2c 20 69  acktrace)(int, i
33e0: 6e 74 2c 20 76 6f 69 64 20 2a 2a 29 29 3b 0a 20  nt, void **));. 
33f0: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62     sqlite3Memdeb
3400: 75 67 42 61 63 6b 74 72 61 63 65 43 61 6c 6c 62  ugBacktraceCallb
3410: 61 63 6b 28 74 65 73 74 5f 6d 65 6d 64 65 62 75  ack(test_memdebu
3420: 67 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e  g_callback);.#en
3430: 64 69 66 0a 20 20 20 20 54 63 6c 5f 49 6e 69 74  dif.    Tcl_Init
3440: 48 61 73 68 54 61 62 6c 65 28 26 61 4d 61 6c 6c  HashTable(&aMall
3450: 6f 63 4c 6f 67 2c 20 4d 41 4c 4c 4f 43 5f 4c 4f  ocLog, MALLOC_LO
3460: 47 5f 46 52 41 4d 45 53 29 3b 0a 20 20 20 20 69  G_FRAMES);.    i
3470: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 0a  sInit = 1;.  }..
3480: 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
3490: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
34a0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
34b0: 6f 62 6a 76 2c 20 22 53 55 42 2d 43 4f 4d 4d 41  objv, "SUB-COMMA
34c0: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d 0a 20 20  ND ...");.  }.  
34d0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
34e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
34f0: 6f 62 6a 76 5b 31 5d 2c 20 4d 42 5f 73 74 72 73  objv[1], MB_strs
3500: 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64 22 2c  , "sub-command",
3510: 20 30 2c 20 26 69 53 75 62 29 20 29 7b 0a 20 20   0, &iSub) ){.  
3520: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
3530: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  OR;.  }..  switc
3540: 68 28 20 28 65 6e 75 6d 20 4d 42 5f 65 6e 75 6d  h( (enum MB_enum
3550: 29 69 53 75 62 20 29 7b 0a 20 20 20 20 63 61 73  )iSub ){.    cas
3560: 65 20 4d 42 5f 4c 4f 47 5f 53 54 41 52 54 3a 0a  e MB_LOG_START:.
3570: 20 20 20 20 20 20 6d 61 6c 6c 6f 63 4c 6f 67 45        mallocLogE
3580: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  nabled = 1;.    
3590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
35a0: 65 20 4d 42 5f 4c 4f 47 5f 53 54 4f 50 3a 0a 20  e MB_LOG_STOP:. 
35b0: 20 20 20 20 20 6d 61 6c 6c 6f 63 4c 6f 67 45 6e       mallocLogEn
35c0: 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  abled = 0;.     
35d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
35e0: 20 4d 42 5f 4c 4f 47 5f 44 55 4d 50 3a 20 7b 0a   MB_LOG_DUMP: {.
35f0: 20 20 20 20 20 20 54 63 6c 5f 48 61 73 68 53 65        Tcl_HashSe
3600: 61 72 63 68 20 73 65 61 72 63 68 3b 0a 20 20 20  arch search;.   
3610: 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79     Tcl_HashEntry
3620: 20 2a 70 45 6e 74 72 79 3b 0a 20 20 20 20 20 20   *pEntry;.      
3630: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20  Tcl_Obj *pRet = 
3640: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 0a 20  Tcl_NewObj();.. 
3650: 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65       assert(size
3660: 6f 66 28 69 6e 74 29 3d 3d 73 69 7a 65 6f 66 28  of(int)==sizeof(
3670: 76 6f 69 64 2a 29 29 3b 0a 0a 20 20 20 20 20 20  void*));..      
3680: 66 6f 72 28 0a 20 20 20 20 20 20 20 20 70 45 6e  for(.        pEn
3690: 74 72 79 3d 54 63 6c 5f 46 69 72 73 74 48 61 73  try=Tcl_FirstHas
36a0: 68 45 6e 74 72 79 28 26 61 4d 61 6c 6c 6f 63 4c  hEntry(&aMallocL
36b0: 6f 67 2c 20 26 73 65 61 72 63 68 29 3b 0a 20 20  og, &search);.  
36c0: 20 20 20 20 20 20 70 45 6e 74 72 79 3b 0a 20 20        pEntry;.  
36d0: 20 20 20 20 20 20 70 45 6e 74 72 79 3d 54 63 6c        pEntry=Tcl
36e0: 5f 4e 65 78 74 48 61 73 68 45 6e 74 72 79 28 26  _NextHashEntry(&
36f0: 73 65 61 72 63 68 29 0a 20 20 20 20 20 20 29 7b  search).      ){
3700: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  .        Tcl_Obj
3710: 20 2a 61 70 45 6c 65 6d 5b 4d 41 4c 4c 4f 43 5f   *apElem[MALLOC_
3720: 4c 4f 47 5f 46 52 41 4d 45 53 2b 32 5d 3b 0a 20  LOG_FRAMES+2];. 
3730: 20 20 20 20 20 20 20 4d 61 6c 6c 6f 63 4c 6f 67         MallocLog
3740: 20 2a 70 4c 6f 67 20 3d 20 28 4d 61 6c 6c 6f 63   *pLog = (Malloc
3750: 4c 6f 67 20 2a 29 54 63 6c 5f 47 65 74 48 61 73  Log *)Tcl_GetHas
3760: 68 56 61 6c 75 65 28 70 45 6e 74 72 79 29 3b 0a  hValue(pEntry);.
3770: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 4b 65          int *aKe
3780: 79 20 3d 20 28 69 6e 74 20 2a 29 54 63 6c 5f 47  y = (int *)Tcl_G
3790: 65 74 48 61 73 68 4b 65 79 28 26 61 4d 61 6c 6c  etHashKey(&aMall
37a0: 6f 63 4c 6f 67 2c 20 70 45 6e 74 72 79 29 3b 0a  ocLog, pEntry);.
37b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
37c0: 20 20 0a 20 20 20 20 20 20 20 20 61 70 45 6c 65    .        apEle
37d0: 6d 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  m[0] = Tcl_NewIn
37e0: 74 4f 62 6a 28 70 4c 6f 67 2d 3e 6e 43 61 6c 6c  tObj(pLog->nCall
37f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 70 45 6c 65  );.        apEle
3800: 6d 5b 31 5d 20 3d 20 54 63 6c 5f 4e 65 77 49 6e  m[1] = Tcl_NewIn
3810: 74 4f 62 6a 28 70 4c 6f 67 2d 3e 6e 42 79 74 65  tObj(pLog->nByte
3820: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
3830: 69 3d 30 3b 20 69 69 3c 4d 41 4c 4c 4f 43 5f 4c  i=0; ii<MALLOC_L
3840: 4f 47 5f 46 52 41 4d 45 53 3b 20 69 69 2b 2b 29  OG_FRAMES; ii++)
3850: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 45 6c  {.          apEl
3860: 65 6d 5b 69 69 2b 32 5d 20 3d 20 54 63 6c 5f 4e  em[ii+2] = Tcl_N
3870: 65 77 49 6e 74 4f 62 6a 28 61 4b 65 79 5b 69 69  ewIntObj(aKey[ii
3880: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ]);.        }.. 
3890: 20 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f         Tcl_ListO
38a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
38b0: 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 0a 20 20  interp, pRet,.  
38c0: 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65            Tcl_Ne
38d0: 77 4c 69 73 74 4f 62 6a 28 4d 41 4c 4c 4f 43 5f  wListObj(MALLOC_
38e0: 4c 4f 47 5f 46 52 41 4d 45 53 2b 32 2c 20 61 70  LOG_FRAMES+2, ap
38f0: 45 6c 65 6d 29 0a 20 20 20 20 20 20 20 20 29 3b  Elem).        );
3900: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
3910: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
3920: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
3930: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3940: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 42 5f 4c   }.    case MB_L
3950: 4f 47 5f 43 4c 45 41 52 3a 20 7b 0a 20 20 20 20  OG_CLEAR: {.    
3960: 20 20 54 63 6c 5f 48 61 73 68 53 65 61 72 63 68    Tcl_HashSearch
3970: 20 73 65 61 72 63 68 3b 0a 20 20 20 20 20 20 54   search;.      T
3980: 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 70 45  cl_HashEntry *pE
3990: 6e 74 72 79 3b 0a 20 20 20 20 20 20 66 6f 72 28  ntry;.      for(
39a0: 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 3d  .        pEntry=
39b0: 54 63 6c 5f 46 69 72 73 74 48 61 73 68 45 6e 74  Tcl_FirstHashEnt
39c0: 72 79 28 26 61 4d 61 6c 6c 6f 63 4c 6f 67 2c 20  ry(&aMallocLog, 
39d0: 26 73 65 61 72 63 68 29 3b 0a 20 20 20 20 20 20  &search);.      
39e0: 20 20 70 45 6e 74 72 79 3b 0a 20 20 20 20 20 20    pEntry;.      
39f0: 20 20 70 45 6e 74 72 79 3d 54 63 6c 5f 4e 65 78    pEntry=Tcl_Nex
3a00: 74 48 61 73 68 45 6e 74 72 79 28 26 73 65 61 72  tHashEntry(&sear
3a10: 63 68 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ch).      ){.   
3a20: 20 20 20 20 20 4d 61 6c 6c 6f 63 4c 6f 67 20 2a       MallocLog *
3a30: 70 4c 6f 67 20 3d 20 28 4d 61 6c 6c 6f 63 4c 6f  pLog = (MallocLo
3a40: 67 20 2a 29 54 63 6c 5f 47 65 74 48 61 73 68 56  g *)Tcl_GetHashV
3a50: 61 6c 75 65 28 70 45 6e 74 72 79 29 3b 0a 20 20  alue(pEntry);.  
3a60: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28        Tcl_Free((
3a70: 63 68 61 72 20 2a 29 70 4c 6f 67 29 3b 0a 20 20  char *)pLog);.  
3a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f      }.      Tcl_
3a90: 44 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 28  DeleteHashTable(
3aa0: 26 61 4d 61 6c 6c 6f 63 4c 6f 67 29 3b 0a 20 20  &aMallocLog);.  
3ab0: 20 20 20 20 54 63 6c 5f 49 6e 69 74 48 61 73 68      Tcl_InitHash
3ac0: 54 61 62 6c 65 28 26 61 4d 61 6c 6c 6f 63 4c 6f  Table(&aMallocLo
3ad0: 67 2c 20 4d 41 4c 4c 4f 43 5f 4c 4f 47 5f 46 52  g, MALLOC_LOG_FR
3ae0: 41 4d 45 53 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMES);.    }.  }
3af0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
3b00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
3b10: 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
3b20: 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
3b30: 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
3b40: 71 6c 69 74 65 74 65 73 74 5f 6d 61 6c 6c 6f 63  qlitetest_malloc
3b50: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
3b60: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61   *interp){.  sta
3b70: 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
3b80: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
3b90: 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72      Tcl_ObjCmdPr
3ba0: 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61  oc *xProc;.  } a
3bb0: 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
3bc0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 61 6c    { "sqlite3_mal
3bd0: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
3be0: 20 20 74 65 73 74 5f 6d 61 6c 6c 6f 63 20 20 20    test_malloc   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
3c10: 65 33 5f 72 65 61 6c 6c 6f 63 22 2c 20 20 20 20  e3_realloc",    
3c20: 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 61          test_rea
3c30: 6c 6c 6f 63 20 20 20 20 20 20 20 20 20 20 20 20  lloc            
3c40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
3c50: 22 73 71 6c 69 74 65 33 5f 66 72 65 65 22 2c 20  "sqlite3_free", 
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
3c70: 73 74 5f 66 72 65 65 20 20 20 20 20 20 20 20 20  st_free         
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
3c90: 20 20 20 20 7b 20 22 6d 65 6d 73 65 74 22 2c 20      { "memset", 
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 74 65 73 74 5f 6d 65 6d 73 65 74 20      test_memset 
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 65 6d    },.     { "mem
3ce0: 67 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  get",           
3cf0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6d            test_m
3d00: 65 6d 67 65 74 20 20 20 20 20 20 20 20 20 20 20  emget           
3d10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
3d20: 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  { "sqlite3_memor
3d30: 79 5f 75 73 65 64 22 2c 20 20 20 20 20 20 20 20  y_used",        
3d40: 74 65 73 74 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  test_memory_used
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
3d60: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
3d70: 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
3d80: 72 22 2c 20 20 20 74 65 73 74 5f 6d 65 6d 6f 72  r",   test_memor
3d90: 79 5f 68 69 67 68 77 61 74 65 72 20 20 20 20 20  y_highwater     
3da0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
3db0: 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f  qlite3_memdebug_
3dc0: 62 61 63 6b 74 72 61 63 65 22 2c 20 74 65 73 74  backtrace", test
3dd0: 5f 6d 65 6d 64 65 62 75 67 5f 62 61 63 6b 74 72  _memdebug_backtr
3de0: 61 63 65 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  ace       },.   
3df0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d    { "sqlite3_mem
3e00: 64 65 62 75 67 5f 64 75 6d 70 22 2c 20 20 20 20  debug_dump",    
3e10: 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f    test_memdebug_
3e20: 64 75 6d 70 20 20 20 20 20 20 20 20 20 20 20 20  dump            
3e30: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
3e40: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c  e3_memdebug_fail
3e50: 22 2c 20 20 20 20 20 20 74 65 73 74 5f 6d 65 6d  ",      test_mem
3e60: 64 65 62 75 67 5f 66 61 69 6c 20 20 20 20 20 20  debug_fail      
3e70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
3e80: 22 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75  "sqlite3_memdebu
3e90: 67 5f 70 65 6e 64 69 6e 67 22 2c 20 20 20 74 65  g_pending",   te
3ea0: 73 74 5f 6d 65 6d 64 65 62 75 67 5f 70 65 6e 64  st_memdebug_pend
3eb0: 69 6e 67 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ing         },. 
3ec0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
3ed0: 65 6d 64 65 62 75 67 5f 73 65 74 74 69 74 6c 65  emdebug_settitle
3ee0: 22 2c 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75  ",  test_memdebu
3ef0: 67 5f 73 65 74 74 69 74 6c 65 20 20 20 20 20 20  g_settitle      
3f00: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
3f10: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6d 61  ite3_memdebug_ma
3f20: 6c 6c 6f 63 5f 63 6f 75 6e 74 22 2c 20 74 65 73  lloc_count", tes
3f30: 74 5f 6d 65 6d 64 65 62 75 67 5f 6d 61 6c 6c 6f  t_memdebug_mallo
3f40: 63 5f 63 6f 75 6e 74 20 7d 2c 0a 20 20 20 20 20  c_count },.     
3f50: 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65  { "sqlite3_memde
3f60: 62 75 67 5f 6c 6f 67 22 2c 20 20 20 20 20 20 20  bug_log",       
3f70: 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 6c 6f  test_memdebug_lo
3f80: 67 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  g },.  };.  int 
3f90: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
3fa0: 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f  sizeof(aObjCmd)/
3fb0: 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30  sizeof(aObjCmd[0
3fc0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  ]); i++){.    Tc
3fd0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
3fe0: 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43  nd(interp, aObjC
3ff0: 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4f 62  md[i].zName, aOb
4000: 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30  jCmd[i].xProc, 0
4010: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
4020: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a           rn TCL_OK;.}.