/ Hex Artifact Content
Login

Artifact 0bc9d27c09efe0be63d0de5fb6e38a4253cd5551:


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 31 20 32 30 30 38 2f  c.c,v 1.11 2008/
0200: 30 31 2f 33 31 20 31 34 3a 34 33 3a 32 34 20 64  01/31 14:43:24 d
0210: 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  rh Exp $.*/.#inc
0220: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0230: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c  h".#include "tcl
0240: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
0250: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
0260: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
0270: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
0280: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  ./*.** Transform
0290: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 65 78   pointers to tex
02a0: 74 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  t and back again
02b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
02c0: 70 6f 69 6e 74 65 72 54 6f 54 65 78 74 28 76 6f  pointerToText(vo
02d0: 69 64 20 2a 70 2c 20 63 68 61 72 20 2a 7a 29 7b  id *p, char *z){
02e0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
02f0: 63 68 61 72 20 7a 48 65 78 5b 5d 20 3d 20 22 30  char zHex[] = "0
0300: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
0310: 3b 0a 20 20 69 6e 74 20 69 2c 20 6b 3b 0a 20 20  ;.  int i, k;.  
0320: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 3b 0a  unsigned int u;.
0330: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
0340: 20 6e 3b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66   n;.  if( sizeof
0350: 28 6e 29 3d 3d 73 69 7a 65 6f 66 28 70 29 20 29  (n)==sizeof(p) )
0360: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 6e 2c  {.    memcpy(&n,
0370: 20 26 70 2c 20 73 69 7a 65 6f 66 28 70 29 29 3b   &p, sizeof(p));
0380: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a  .  }else if( siz
0390: 65 6f 66 28 75 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(u)==sizeof(p
03a0: 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) ){.    memcpy(
03b0: 26 75 2c 20 26 70 2c 20 73 69 7a 65 6f 66 28 75  &u, &p, sizeof(u
03c0: 29 29 3b 0a 20 20 20 20 6e 20 3d 20 75 3b 0a 20  ));.    n = u;. 
03d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
03e0: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 66  rt( 0 );.  }.  f
03f0: 6f 72 28 69 3d 30 2c 20 6b 3d 73 69 7a 65 6f 66  or(i=0, k=sizeof
0400: 28 70 29 2a 32 2d 31 3b 20 69 3c 73 69 7a 65 6f  (p)*2-1; i<sizeo
0410: 66 28 70 29 2a 32 3b 20 69 2b 2b 2c 20 6b 2d 2d  f(p)*2; i++, k--
0420: 29 7b 0a 20 20 20 20 7a 5b 6b 5d 20 3d 20 7a 48  ){.    z[k] = zH
0430: 65 78 5b 6e 26 30 78 66 5d 3b 0a 20 20 20 20 6e  ex[n&0xf];.    n
0440: 20 3e 3e 3d 20 34 3b 0a 20 20 7d 0a 20 20 7a 5b   >>= 4;.  }.  z[
0450: 73 69 7a 65 6f 66 28 70 29 2a 32 5d 20 3d 20 30  sizeof(p)*2] = 0
0460: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 68  ;.}.static int h
0470: 65 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a  exToInt(int h){.
0480: 20 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20    if( h>='0' && 
0490: 68 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65  h<='9' ){.    re
04a0: 74 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20  turn h - '0';.  
04b0: 7d 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27  }else if( h>='a'
04c0: 20 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20   && h<='f' ){.  
04d0: 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27    return h - 'a'
04e0: 20 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   + 10;.  }else{.
04f0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
0500: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20   }.}.static int 
0510: 74 65 78 74 54 6f 50 6f 69 6e 74 65 72 28 63 6f  textToPointer(co
0520: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 76 6f 69  nst char *z, voi
0530: 64 20 2a 2a 70 70 29 7b 0a 20 20 73 71 6c 69 74  d **pp){.  sqlit
0540: 65 33 5f 75 69 6e 74 36 34 20 6e 20 3d 20 30 3b  e3_uint64 n = 0;
0550: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
0560: 67 6e 65 64 20 69 6e 74 20 75 3b 0a 20 20 66 6f  gned int u;.  fo
0570: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
0580: 76 6f 69 64 2a 29 2a 32 20 26 26 20 7a 5b 30 5d  void*)*2 && z[0]
0590: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
05a0: 76 3b 0a 20 20 20 20 76 20 3d 20 68 65 78 54 6f  v;.    v = hexTo
05b0: 49 6e 74 28 2a 7a 2b 2b 29 3b 0a 20 20 20 20 69  Int(*z++);.    i
05c0: 66 28 20 76 3c 30 20 29 20 72 65 74 75 72 6e 20  f( v<0 ) return 
05d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 6e  TCL_ERROR;.    n
05e0: 20 3d 20 6e 2a 31 36 20 2b 20 76 3b 0a 20 20 7d   = n*16 + v;.  }
05f0: 0a 20 20 69 66 28 20 2a 7a 21 3d 30 20 29 20 72  .  if( *z!=0 ) r
0600: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0610: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 6e 29  .  if( sizeof(n)
0620: 3d 3d 73 69 7a 65 6f 66 28 2a 70 70 29 20 29 7b  ==sizeof(*pp) ){
0630: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 70 2c 20  .    memcpy(pp, 
0640: 26 6e 2c 20 73 69 7a 65 6f 66 28 6e 29 29 3b 0a  &n, sizeof(n));.
0650: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
0660: 6f 66 28 75 29 3d 3d 73 69 7a 65 6f 66 28 2a 70  of(u)==sizeof(*p
0670: 70 29 20 29 7b 0a 20 20 20 20 75 20 3d 20 28 75  p) ){.    u = (u
0680: 6e 73 69 67 6e 65 64 20 69 6e 74 29 6e 3b 0a 20  nsigned int)n;. 
0690: 20 20 20 6d 65 6d 63 70 79 28 70 70 2c 20 26 75     memcpy(pp, &u
06a0: 2c 20 73 69 7a 65 6f 66 28 75 29 29 3b 0a 20 20  , sizeof(u));.  
06b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
06c0: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 72 65  t( 0 );.  }.  re
06d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
06e0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
06f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 20 20  sqlite3_malloc  
0700: 4e 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 52 61 77  NBYTES.**.** Raw
0710: 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 20   test interface 
0720: 66 6f 72 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  for sqlite3_mall
0730: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
0740: 69 6e 74 20 74 65 73 74 5f 6d 61 6c 6c 6f 63 28  int test_malloc(
0750: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
0760: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
0770: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
0780: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
0790: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
07a0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
07b0: 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20 63 68 61    void *p;.  cha
07c0: 72 20 7a 4f 75 74 5b 31 30 30 5d 3b 0a 20 20 69  r zOut[100];.  i
07d0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
07e0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
07f0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
0800: 6a 76 2c 20 22 4e 42 59 54 45 53 22 29 3b 0a 20  jv, "NBYTES");. 
0810: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0820: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
0830: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
0840: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
0850: 2c 20 26 6e 42 79 74 65 29 20 29 20 72 65 74 75  , &nByte) ) retu
0860: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0870: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
0880: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 6e 42 79  oc((unsigned)nBy
0890: 74 65 29 3b 0a 20 20 70 6f 69 6e 74 65 72 54 6f  te);.  pointerTo
08a0: 54 65 78 74 28 70 2c 20 7a 4f 75 74 29 3b 0a 20  Text(p, zOut);. 
08b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
08c0: 74 28 69 6e 74 65 72 70 2c 20 7a 4f 75 74 2c 20  t(interp, zOut, 
08d0: 4e 55 4c 4c 29 3b 0a 20 20 72 65 74 75 72 6e 20  NULL);.  return 
08e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
08f0: 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74   Usage:    sqlit
0900: 65 33 5f 72 65 61 6c 6c 6f 63 20 20 50 52 49 4f  e3_realloc  PRIO
0910: 52 20 20 4e 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  R  NBYTES.**.** 
0920: 52 61 77 20 74 65 73 74 20 69 6e 74 65 72 66 61  Raw test interfa
0930: 63 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72  ce for sqlite3_r
0940: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  ealloc()..*/.sta
0950: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 61  tic int test_rea
0960: 6c 6c 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  lloc(.  void * c
0970: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
0980: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0990: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
09a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
09b0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  jv[].){.  int nB
09c0: 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 70 50 72  yte;.  void *pPr
09d0: 69 6f 72 2c 20 2a 70 3b 0a 20 20 63 68 61 72 20  ior, *p;.  char 
09e0: 7a 4f 75 74 5b 31 30 30 5d 3b 0a 20 20 69 66 28  zOut[100];.  if(
09f0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
0a00: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
0a10: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
0a20: 2c 20 22 50 52 49 4f 52 20 4e 42 59 54 45 53 22  , "PRIOR NBYTES"
0a30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0a40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
0a50: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
0a60: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
0a70: 76 5b 32 5d 2c 20 26 6e 42 79 74 65 29 20 29 20  v[2], &nByte) ) 
0a80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0a90: 3b 0a 20 20 69 66 28 20 74 65 78 74 54 6f 50 6f  ;.  if( textToPo
0aa0: 69 6e 74 65 72 28 54 63 6c 5f 47 65 74 53 74 72  inter(Tcl_GetStr
0ab0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
0ac0: 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 54 63  Prior) ){.    Tc
0ad0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0ae0: 6e 74 65 72 70 2c 20 22 62 61 64 20 70 6f 69 6e  nterp, "bad poin
0af0: 74 65 72 3a 20 22 2c 20 54 63 6c 5f 47 65 74 53  ter: ", Tcl_GetS
0b00: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
0b10: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
0b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0b30: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
0b40: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 50 72 69 6f  e3_realloc(pPrio
0b50: 72 2c 20 28 75 6e 73 69 67 6e 65 64 29 6e 42 79  r, (unsigned)nBy
0b60: 74 65 29 3b 0a 20 20 70 6f 69 6e 74 65 72 54 6f  te);.  pointerTo
0b70: 54 65 78 74 28 70 2c 20 7a 4f 75 74 29 3b 0a 20  Text(p, zOut);. 
0b80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0b90: 74 28 69 6e 74 65 72 70 2c 20 7a 4f 75 74 2c 20  t(interp, zOut, 
0ba0: 4e 55 4c 4c 29 3b 0a 20 20 72 65 74 75 72 6e 20  NULL);.  return 
0bb0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
0bc0: 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69  * Usage:    sqli
0bd0: 74 65 33 5f 66 72 65 65 20 20 50 52 49 4f 52 0a  te3_free  PRIOR.
0be0: 2a 2a 0a 2a 2a 20 52 61 77 20 74 65 73 74 20 69  **.** Raw test i
0bf0: 6e 74 65 72 66 61 63 65 20 66 6f 72 20 73 71 6c  nterface for sql
0c00: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
0c10: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
0c20: 66 72 65 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  free(.  void * c
0c30: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
0c40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0c50: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
0c60: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
0c70: 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  jv[].){.  void *
0c80: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 6f 62  pPrior;.  if( ob
0c90: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
0ca0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
0cb0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
0cc0: 50 52 49 4f 52 22 29 3b 0a 20 20 20 20 72 65 74  PRIOR");.    ret
0cd0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0ce0: 20 7d 0a 20 20 69 66 28 20 74 65 78 74 54 6f 50   }.  if( textToP
0cf0: 6f 69 6e 74 65 72 28 54 63 6c 5f 47 65 74 53 74  ointer(Tcl_GetSt
0d00: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
0d10: 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 54  pPrior) ){.    T
0d20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0d30: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 70 6f 69  interp, "bad poi
0d40: 6e 74 65 72 3a 20 22 2c 20 54 63 6c 5f 47 65 74  nter: ", Tcl_Get
0d50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0d60: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
0d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0d80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
0d90: 66 72 65 65 28 70 50 72 69 6f 72 29 3b 0a 20 20  free(pPrior);.  
0da0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
0db0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
0dc0: 75 74 69 6e 65 73 20 61 72 65 20 69 6e 20 74 65  utines are in te
0dd0: 73 74 5f 68 65 78 69 6f 2e 63 0a 2a 2f 0a 69 6e  st_hexio.c.*/.in
0de0: 74 20 73 71 6c 69 74 65 33 54 65 73 74 48 65 78  t sqlite3TestHex
0df0: 54 6f 42 69 6e 28 63 6f 6e 73 74 20 63 68 61 72  ToBin(const char
0e00: 20 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 29   *, int, char *)
0e10: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 73  ;.int sqlite3Tes
0e20: 74 42 69 6e 54 6f 48 65 78 28 63 68 61 72 2a 2c  tBinToHex(char*,
0e30: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  int);../*.** Usa
0e40: 67 65 3a 20 20 20 20 6d 65 6d 73 65 74 20 20 41  ge:    memset  A
0e50: 44 44 52 45 53 53 20 20 53 49 5a 45 20 20 48 45  DDRESS  SIZE  HE
0e60: 58 0a 2a 2a 0a 2a 2a 20 53 65 74 20 61 20 63 68  X.**.** Set a ch
0e70: 75 6e 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 28 6f  unk of memory (o
0e80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
0e90: 6c 6f 63 2c 20 70 72 6f 62 61 62 6c 79 29 20 74  loc, probably) t
0ea0: 6f 20 61 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  o a.** specified
0eb0: 20 68 65 78 20 70 61 74 74 65 72 6e 2e 0a 2a 2f   hex pattern..*/
0ec0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
0ed0: 5f 6d 65 6d 73 65 74 28 0a 20 20 76 6f 69 64 20  _memset(.  void 
0ee0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
0ef0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0f00: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
0f10: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
0f20: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69   objv[].){.  voi
0f30: 64 20 2a 70 3b 0a 20 20 69 6e 74 20 73 69 7a 65  d *p;.  int size
0f40: 2c 20 6e 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  , n, i;.  char *
0f50: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  zHex;.  char *zO
0f60: 75 74 3b 0a 20 20 63 68 61 72 20 7a 42 69 6e 5b  ut;.  char zBin[
0f70: 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
0f80: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
0f90: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
0fa0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 41  erp, 1, objv, "A
0fb0: 44 44 52 45 53 53 20 53 49 5a 45 20 48 45 58 22  DDRESS SIZE HEX"
0fc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
0fd0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
0fe0: 66 28 20 74 65 78 74 54 6f 50 6f 69 6e 74 65 72  f( textToPointer
0ff0: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
1000: 62 6a 76 5b 31 5d 29 2c 20 26 70 29 20 29 7b 0a  bjv[1]), &p) ){.
1010: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1020: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
1030: 64 20 70 6f 69 6e 74 65 72 3a 20 22 2c 20 54 63  d pointer: ", Tc
1040: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1050: 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
1060: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1070: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1080: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1090: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
10a0: 32 5d 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 20  2], &size) ){.  
10b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  OR;.  }.  if( si
10d0: 7a 65 3c 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  ze<=0 ){.    Tcl
10e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10f0: 74 65 72 70 2c 20 22 73 69 7a 65 20 6d 75 73 74  terp, "size must
1100: 20 62 65 20 70 6f 73 69 74 69 76 65 22 2c 20 28   be positive", (
1110: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
1120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1130: 20 20 7d 0a 20 20 7a 48 65 78 20 3d 20 54 63 6c    }.  zHex = Tcl
1140: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1150: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 3b 0a  j(objv[3], &n);.
1160: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
1170: 42 69 6e 29 2a 32 20 29 20 6e 20 3d 20 73 69 7a  Bin)*2 ) n = siz
1180: 65 6f 66 28 7a 42 69 6e 29 2a 32 3b 0a 20 20 6e  eof(zBin)*2;.  n
1190: 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 48 65   = sqlite3TestHe
11a0: 78 54 6f 42 69 6e 28 7a 48 65 78 2c 20 6e 2c 20  xToBin(zHex, n, 
11b0: 7a 42 69 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  zBin);.  if( n==
11c0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
11d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11e0: 2c 20 22 6e 6f 20 64 61 74 61 22 2c 20 28 63 68  , "no data", (ch
11f0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
1200: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1210: 7d 0a 20 20 7a 4f 75 74 20 3d 20 70 3b 0a 20 20  }.  zOut = p;.  
1220: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1230: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f 75 74 5b   i++){.    zOut[
1240: 69 5d 20 3d 20 7a 42 69 6e 5b 69 25 6e 5d 3b 0a  i] = zBin[i%n];.
1250: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1260: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1270: 61 67 65 3a 20 20 20 20 6d 65 6d 67 65 74 20 20  age:    memget  
1280: 41 44 44 52 45 53 53 20 20 53 49 5a 45 0a 2a 2a  ADDRESS  SIZE.**
1290: 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72  .** Return memor
12a0: 79 20 61 73 20 68 65 78 61 64 65 63 69 6d 61 6c  y as hexadecimal
12b0: 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   text..*/.static
12c0: 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d 67 65 74   int test_memget
12d0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12e0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1300: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1310: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1320: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  .){.  void *p;. 
1330: 20 69 6e 74 20 73 69 7a 65 2c 20 6e 3b 0a 20 20   int size, n;.  
1340: 63 68 61 72 20 2a 7a 42 69 6e 3b 0a 20 20 63 68  char *zBin;.  ch
1350: 61 72 20 7a 48 65 78 5b 31 30 30 5d 3b 0a 0a 20  ar zHex[100];.. 
1360: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1370: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1380: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1390: 6f 62 6a 76 2c 20 22 41 44 44 52 45 53 53 20 53  objv, "ADDRESS S
13a0: 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IZE");.    retur
13b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13c0: 0a 20 20 69 66 28 20 74 65 78 74 54 6f 50 6f 69  .  if( textToPoi
13d0: 6e 74 65 72 28 54 63 6c 5f 47 65 74 53 74 72 69  nter(Tcl_GetStri
13e0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 29  ng(objv[1]), &p)
13f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1400: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1410: 20 22 62 61 64 20 70 6f 69 6e 74 65 72 3a 20 22   "bad pointer: "
1420: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1430: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
1440: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
1450: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1460: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1470: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1480: 62 6a 76 5b 32 5d 2c 20 26 73 69 7a 65 29 20 29  bjv[2], &size) )
1490: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
14a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
14b0: 28 20 73 69 7a 65 3c 3d 30 20 29 7b 0a 20 20 20  ( size<=0 ){.   
14c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
14d0: 74 28 69 6e 74 65 72 70 2c 20 22 73 69 7a 65 20  t(interp, "size 
14e0: 6d 75 73 74 20 62 65 20 70 6f 73 69 74 69 76 65  must be positive
14f0: 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
1500: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1510: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 42 69 6e 20 3d  OR;.  }.  zBin =
1520: 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 73 69 7a   p;.  while( siz
1530: 65 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  e>0 ){.    if( s
1540: 69 7a 65 3e 28 73 69 7a 65 6f 66 28 7a 48 65 78  ize>(sizeof(zHex
1550: 29 2d 31 29 2f 32 20 29 7b 0a 20 20 20 20 20 20  )-1)/2 ){.      
1560: 6e 20 3d 20 28 73 69 7a 65 6f 66 28 7a 48 65 78  n = (sizeof(zHex
1570: 29 2d 31 29 2f 32 3b 0a 20 20 20 20 7d 65 6c 73  )-1)/2;.    }els
1580: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a  e{.      n = siz
1590: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  e;.    }.    mem
15a0: 63 70 79 28 7a 48 65 78 2c 20 7a 42 69 6e 2c 20  cpy(zHex, zBin, 
15b0: 6e 29 3b 0a 20 20 20 20 7a 42 69 6e 20 2b 3d 20  n);.    zBin += 
15c0: 6e 3b 0a 20 20 20 20 73 69 7a 65 20 2d 3d 20 6e  n;.    size -= n
15d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 65 73  ;.    sqlite3Tes
15e0: 74 42 69 6e 54 6f 48 65 78 28 7a 48 65 78 2c 20  tBinToHex(zHex, 
15f0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  n);.    Tcl_Appe
1600: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1610: 20 7a 48 65 78 2c 20 28 63 68 61 72 2a 29 30 29   zHex, (char*)0)
1620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1630: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1640: 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74 65  Usage:    sqlite
1650: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0a 2a 2a  3_memory_used.**
1660: 0a 2a 2a 20 52 61 77 20 74 65 73 74 20 69 6e 74  .** Raw test int
1670: 65 72 66 61 63 65 20 66 6f 72 20 73 71 6c 69 74  erface for sqlit
1680: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
1690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16a0: 74 65 73 74 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  test_memory_used
16b0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16c0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16e0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16f0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1700: 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  .){.  Tcl_SetObj
1710: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1720: 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
1730: 28 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f  (sqlite3_memory_
1740: 75 73 65 64 28 29 29 29 3b 0a 20 20 72 65 74 75  used()));.  retu
1750: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1760: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 73 71  .** Usage:    sq
1770: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
1780: 68 77 61 74 65 72 20 3f 52 45 53 45 54 46 4c 41  hwater ?RESETFLA
1790: 47 3f 0a 2a 2a 0a 2a 2a 20 52 61 77 20 74 65 73  G?.**.** Raw tes
17a0: 74 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  t interface for 
17b0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
17c0: 69 67 68 77 61 74 65 72 28 29 2e 0a 2a 2f 0a 73  ighwater()..*/.s
17d0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
17e0: 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28  emory_highwater(
17f0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1800: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1810: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1820: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1830: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1840: 29 7b 0a 20 20 69 6e 74 20 72 65 73 65 74 46 6c  ){.  int resetFl
1850: 61 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62  ag = 0;.  if( ob
1860: 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=1 && objc!=2
1870: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1880: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1890: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 52 45 53 45   1, objv, "?RESE
18a0: 54 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  T?");.    return
18b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18c0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
18d0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
18e0: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
18f0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
1900: 26 72 65 73 65 74 46 6c 61 67 29 20 29 20 72 65  &resetFlag) ) re
1910: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1920: 20 20 7d 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62    } .  Tcl_SetOb
1930: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1940: 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 57 69 64  .     Tcl_NewWid
1950: 65 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  eIntObj(sqlite3_
1960: 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
1970: 28 72 65 73 65 74 46 6c 61 67 29 29 29 3b 0a 20  (resetFlag)));. 
1980: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1990: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
19b0: 62 75 67 5f 62 61 63 6b 74 72 61 63 65 20 44 45  bug_backtrace DE
19c0: 50 54 48 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  PTH.**.** Set th
19d0: 65 20 64 65 70 74 68 20 6f 66 20 62 61 63 6b 74  e depth of backt
19e0: 72 61 63 69 6e 67 2e 20 20 49 66 20 53 51 4c 49  racing.  If SQLI
19f0: 54 45 5f 4d 45 4d 44 45 42 55 47 20 69 73 20 6e  TE_MEMDEBUG is n
1a00: 6f 74 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  ot defined.** th
1a10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1a20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1a30: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d  tatic int test_m
1a40: 65 6d 64 65 62 75 67 5f 62 61 63 6b 74 72 61 63  emdebug_backtrac
1a50: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1a60: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a80: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a90: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1aa0: 5d 0a 29 7b 0a 20 20 69 6e 74 20 64 65 70 74 68  ].){.  int depth
1ab0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1ac0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1ad0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1ae0: 31 2c 20 6f 62 6a 76 2c 20 22 44 45 50 54 22 29  1, objv, "DEPT")
1af0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1b10: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1b20: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1b30: 5b 31 5d 2c 20 26 64 65 70 74 68 29 20 29 20 72  [1], &depth) ) r
1b40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
1b60: 45 4d 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  EMDEBUG.  {.    
1b70: 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
1b80: 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 62 61 63  te3_memdebug_bac
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 5f 6d 65 6d 64 65 62 75   sqlite3_memdebu
1bb0: 67 5f 62 61 63 6b 74 72 61 63 65 28 64 65 70 74  g_backtrace(dept
1bc0: 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  h);.  }.#endif. 
1bd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1bf0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65     sqlite3_memde
1c00: 62 75 67 5f 64 75 6d 70 20 20 46 49 4c 45 4e 41  bug_dump  FILENA
1c10: 4d 45 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61  ME.**.** Write a
1c20: 20 73 75 6d 6d 61 72 79 20 6f 66 20 75 6e 66 72   summary of unfr
1c30: 65 65 64 20 6d 65 6d 6f 72 79 20 74 6f 20 46 49  eed memory to FI
1c40: 4c 45 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69  LENAME..*/.stati
1c50: 63 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d 64 65  c int test_memde
1c60: 62 75 67 5f 64 75 6d 70 28 0a 20 20 76 6f 69 64  bug_dump(.  void
1c70: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c90: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ca0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1cb0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66  T objv[].){.  if
1cc0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1cd0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1ce0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1cf0: 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a  v, "FILENAME");.
1d00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d10: 52 52 4f 52 3b 0a 20 20 7d 0a 23 69 66 20 64 65  RROR;.  }.#if de
1d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 45 4d  fined(SQLITE_MEM
1d30: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1d40: 64 28 53 51 4c 49 54 45 5f 4d 45 4d 4f 52 59 5f  d(SQLITE_MEMORY_
1d50: 53 49 5a 45 29 0a 20 20 7b 0a 20 20 20 20 65 78  SIZE).  {.    ex
1d60: 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65  tern void sqlite
1d70: 33 5f 6d 65 6d 64 65 62 75 67 5f 64 75 6d 70 28  3_memdebug_dump(
1d80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
1d90: 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62    sqlite3_memdeb
1da0: 75 67 5f 64 75 6d 70 28 54 63 6c 5f 47 65 74 53  ug_dump(Tcl_GetS
1db0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b  tring(objv[1]));
1dc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
1dd0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1de0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1df0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75   sqlite3_memdebu
1e00: 67 5f 66 61 69 6c 20 20 43 4f 55 4e 54 45 52 20  g_fail  COUNTER 
1e10: 20 3f 4f 50 54 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a   ?OPTIONS?.**.**
1e20: 20 77 68 65 72 65 20 6f 70 74 69 6f 6e 73 20 61   where options a
1e30: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2d 72  re:.**.**     -r
1e40: 65 70 65 61 74 20 20 20 20 3c 63 6f 75 6e 74 3e  epeat    <count>
1e50: 0a 2a 2a 20 20 20 20 20 2d 62 65 6e 69 67 6e 63  .**     -benignc
1e60: 6e 74 20 3c 76 61 72 6e 61 6d 65 3e 0a 2a 2a 0a  nt <varname>.**.
1e70: 2a 2a 20 41 72 72 61 6e 67 65 20 66 6f 72 20 61  ** Arrange for a
1e80: 20 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f   simulated mallo
1e90: 63 28 29 20 66 61 69 6c 75 72 65 20 61 66 74 65  c() failure afte
1ea0: 72 20 43 4f 55 4e 54 45 52 20 73 75 63 63 65 73  r COUNTER succes
1eb0: 73 65 73 2e 0a 2a 2a 20 49 66 20 61 20 72 65 70  ses..** If a rep
1ec0: 65 61 74 20 63 6f 75 6e 74 20 69 73 20 73 70 65  eat count is spe
1ed0: 63 69 66 69 65 64 2c 20 74 68 65 20 66 61 75 6c  cified, the faul
1ee0: 74 20 69 73 20 72 65 70 65 61 74 65 64 20 74 68  t is repeated th
1ef0: 61 74 20 6d 61 6e 79 0a 2a 2a 20 74 69 6d 65 73  at many.** times
1f00: 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 63 61 6c  ..**.** Each cal
1f10: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1f20: 65 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  e overrides the 
1f30: 70 72 69 6f 72 20 63 6f 75 6e 74 65 72 20 76 61  prior counter va
1f40: 6c 75 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  lue..** This rou
1f50: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1f60: 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
1f70: 61 74 65 64 20 66 61 69 6c 75 72 65 73 20 74 68  ated failures th
1f80: 61 74 20 68 61 76 65 0a 2a 2a 20 68 61 70 70 65  at have.** happe
1f90: 6e 65 64 20 73 69 6e 63 65 20 74 68 65 20 70 72  ned since the pr
1fa0: 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74  evious call to t
1fb0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
1fc0: 2a 2a 20 54 6f 20 64 69 73 61 62 6c 65 20 73 69  ** To disable si
1fd0: 6d 75 6c 61 74 65 64 20 66 61 69 6c 75 72 65 73  mulated failures
1fe0: 2c 20 75 73 65 20 61 20 43 4f 55 4e 54 45 52 20  , use a COUNTER 
1ff0: 6f 66 20 2d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  of -1..*/.static
2000: 20 69 6e 74 20 74 65 73 74 5f 6d 65 6d 64 65 62   int test_memdeb
2010: 75 67 5f 66 61 69 6c 28 0a 20 20 76 6f 69 64 20  ug_fail(.  void 
2020: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2030: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2040: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2050: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2060: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
2070: 20 69 69 3b 0a 20 20 69 6e 74 20 69 46 61 69 6c   ii;.  int iFail
2080: 3b 0a 20 20 69 6e 74 20 6e 52 65 70 65 61 74 20  ;.  int nRepeat 
2090: 3d 20 31 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 1;.  Tcl_Obj *
20a0: 70 42 65 6e 69 67 6e 43 6e 74 20 3d 20 30 3b 0a  pBenignCnt = 0;.
20b0: 20 20 69 6e 74 20 6e 42 65 6e 69 67 6e 3b 0a 20    int nBenign;. 
20c0: 20 69 6e 74 20 6e 46 61 69 6c 20 3d 20 30 3b 0a   int nFail = 0;.
20d0: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
20e0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
20f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2100: 20 6f 62 6a 76 2c 20 22 43 4f 55 4e 54 45 52 20   objv, "COUNTER 
2110: 3f 4f 50 54 49 4f 4e 53 3f 22 29 3b 0a 20 20 20  ?OPTIONS?");.   
2120: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2130: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
2140: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2150: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
2160: 26 69 46 61 69 6c 29 20 29 20 72 65 74 75 72 6e  &iFail) ) return
2170: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 66   TCL_ERROR;..  f
2180: 6f 72 28 69 69 3d 32 3b 20 69 69 3c 6f 62 6a 63  or(ii=2; ii<objc
2190: 3b 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e  ; ii+=2){.    in
21a0: 74 20 6e 4f 70 74 69 6f 6e 3b 0a 20 20 20 20 63  t nOption;.    c
21b0: 68 61 72 20 2a 7a 4f 70 74 69 6f 6e 20 3d 20 54  har *zOption = T
21c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
21d0: 4f 62 6a 28 6f 62 6a 76 5b 69 69 5d 2c 20 26 6e  Obj(objv[ii], &n
21e0: 4f 70 74 69 6f 6e 29 3b 0a 20 20 20 20 63 68 61  Option);.    cha
21f0: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20  r *zErr = 0;..  
2200: 20 20 69 66 28 20 6e 4f 70 74 69 6f 6e 3e 31 20    if( nOption>1 
2210: 26 26 20 73 74 72 6e 63 6d 70 28 7a 4f 70 74 69  && strncmp(zOpti
2220: 6f 6e 2c 20 22 2d 72 65 70 65 61 74 22 2c 20 6e  on, "-repeat", n
2230: 4f 70 74 69 6f 6e 29 3d 3d 30 20 29 7b 0a 20 20  Option)==0 ){.  
2240: 20 20 20 20 69 66 28 20 69 69 3d 3d 28 6f 62 6a      if( ii==(obj
2250: 63 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c-1) ){.        
2260: 7a 45 72 72 20 3d 20 22 6f 70 74 69 6f 6e 20 72  zErr = "option r
2270: 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
2280: 65 6e 74 3a 20 22 3b 0a 20 20 20 20 20 20 7d 65  ent: ";.      }e
2290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
22a0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
22b0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
22c0: 69 69 2b 31 5d 2c 20 26 6e 52 65 70 65 61 74 29  ii+1], &nRepeat)
22d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
22e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2300: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2310: 6e 4f 70 74 69 6f 6e 3e 31 20 26 26 20 73 74 72  nOption>1 && str
2320: 6e 63 6d 70 28 7a 4f 70 74 69 6f 6e 2c 20 22 2d  ncmp(zOption, "-
2330: 62 65 6e 69 67 6e 63 6e 74 22 2c 20 6e 4f 70 74  benigncnt", nOpt
2340: 69 6f 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ion)==0 ){.     
2350: 20 69 66 28 20 69 69 3d 3d 28 6f 62 6a 63 2d 31   if( ii==(objc-1
2360: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72  ) ){.        zEr
2370: 72 20 3d 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  r = "option requ
2380: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
2390: 3a 20 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : ";.      }else
23a0: 7b 0a 20 20 20 20 20 20 20 20 70 42 65 6e 69 67  {.        pBenig
23b0: 6e 43 6e 74 20 3d 20 6f 62 6a 76 5b 69 69 2b 31  nCnt = objv[ii+1
23c0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
23d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 45 72 72  else{.      zErr
23e0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69   = "unknown opti
23f0: 6f 6e 3a 20 22 3b 0a 20 20 20 20 7d 0a 0a 20 20  on: ";.    }..  
2400: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
2410: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2420: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
2430: 72 2c 20 7a 4f 70 74 69 6f 6e 2c 20 30 29 3b 0a  r, zOption, 0);.
2440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2450: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2460: 7d 0a 20 20 0a 20 20 6e 42 65 6e 69 67 6e 20 3d  }.  .  nBenign =
2470: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2480: 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2490: 54 43 54 52 4c 5f 46 41 55 4c 54 5f 42 45 4e 49  TCTRL_FAULT_BENI
24a0: 47 4e 5f 46 41 49 4c 55 52 45 53 2c 0a 20 20 20  GN_FAILURES,.   
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
24d0: 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54  LITE_FAULTINJECT
24e0: 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 6e 46  OR_MALLOC);.  nF
24f0: 61 69 6c 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  ail = sqlite3_te
2500: 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2510: 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54  E_TESTCTRL_FAULT
2520: 5f 46 41 49 4c 55 52 45 53 2c 0a 20 20 20 20 20  _FAILURES,.     
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2550: 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d  _FAULTINJECTOR_M
2560: 41 4c 4c 4f 43 29 3b 0a 20 20 73 71 6c 69 74 65  ALLOC);.  sqlite
2570: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2580: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
2590: 41 55 4c 54 5f 43 4f 4e 46 49 47 2c 0a 20 20 20  AULT_CONFIG,.   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 53 51 4c 49 54 45 5f 46 41 55 4c 54      SQLITE_FAULT
25c0: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c  INJECTOR_MALLOC,
25d0: 20 69 46 61 69 6c 2c 20 6e 52 65 70 65 61 74 29   iFail, nRepeat)
25e0: 3b 0a 20 20 69 66 28 20 70 42 65 6e 69 67 6e 43  ;.  if( pBenignC
25f0: 6e 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  nt ){.    Tcl_Ob
2600: 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
2610: 20 70 42 65 6e 69 67 6e 43 6e 74 2c 20 30 2c 20   pBenignCnt, 0, 
2620: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42  Tcl_NewIntObj(nB
2630: 65 6e 69 67 6e 29 2c 20 30 29 3b 0a 20 20 7d 0a  enign), 0);.  }.
2640: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2650: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2660: 65 77 49 6e 74 4f 62 6a 28 6e 46 61 69 6c 29 29  ewIntObj(nFail))
2670: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2680: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2690: 65 3a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65  e:    sqlite3_me
26a0: 6d 64 65 62 75 67 5f 70 65 6e 64 69 6e 67 0a 2a  mdebug_pending.*
26b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26c0: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63  number of malloc
26d0: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 77 69  () calls that wi
26e0: 6c 6c 20 73 75 63 63 65 65 64 20 62 65 66 6f 72  ll succeed befor
26f0: 65 20 61 20 0a 2a 2a 20 73 69 6d 75 6c 61 74 65  e a .** simulate
2700: 64 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  d failure occurs
2710: 2e 20 41 20 6e 65 67 61 74 69 76 65 20 72 65 74  . A negative ret
2720: 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
2730: 74 65 73 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 6d  tes that.** no m
2740: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
2750: 69 73 20 73 63 68 65 64 75 6c 65 64 2e 0a 2a 2f  is scheduled..*/
2760: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2770: 5f 6d 65 6d 64 65 62 75 67 5f 70 65 6e 64 69 6e  _memdebug_pendin
2780: 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  g(.  void * clie
2790: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
27a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
27b0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
27c0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27d0: 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ].){.  if( objc!
27e0: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
27f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2800: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
2810: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2820: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  ERROR;.  }..#ifd
2830: 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
2840: 55 47 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e  UG.  {.    int n
2850: 50 65 6e 64 69 6e 67 20 3d 20 73 71 6c 69 74 65  Pending = sqlite
2860: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2870: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
2880: 41 55 4c 54 5f 50 45 4e 44 49 4e 47 2c 0a 20 20  AULT_PENDING,.  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 41 55        SQLITE_FAU
28c0: 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f  LTINJECTOR_MALLO
28d0: 43 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  C);.    Tcl_SetO
28e0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
28f0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
2900: 50 65 6e 64 69 6e 67 29 29 3b 0a 20 20 7d 0a 23  Pending));.  }.#
2910: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
2920: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
2930: 20 55 73 61 67 65 3a 20 20 20 20 73 71 6c 69 74   Usage:    sqlit
2940: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 73 65 74 74  e3_memdebug_sett
2950: 69 74 6c 65 20 54 49 54 4c 45 0a 2a 2a 0a 2a 2a  itle TITLE.**.**
2960: 20 53 65 74 20 61 20 74 69 74 6c 65 20 73 74 72   Set a title str
2970: 69 6e 67 20 73 74 6f 72 65 64 20 77 69 74 68 20  ing stored with 
2980: 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  each allocation.
2990: 20 20 54 68 65 20 54 49 54 4c 45 20 69 73 0a 2a    The TITLE is.*
29a0: 2a 20 74 79 70 69 63 61 6c 6c 79 20 74 68 65 20  * typically the 
29b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 73 74  name of the test
29c0: 20 74 68 61 74 20 77 61 73 20 72 75 6e 6e 69 6e   that was runnin
29d0: 67 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 61 6c  g when the.** al
29e0: 6c 6f 63 61 74 69 6f 6e 20 6f 63 63 75 72 72 65  location occurre
29f0: 64 2e 20 20 54 68 65 20 54 49 54 4c 45 20 69 73  d.  The TITLE is
2a00: 20 73 74 6f 72 65 64 20 77 69 74 68 20 74 68 65   stored with the
2a10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 61   allocation.** a
2a20: 6e 64 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  nd can be used t
2a30: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 69  o figure out whi
2a40: 63 68 20 74 65 73 74 73 20 61 72 65 20 6c 65 61  ch tests are lea
2a50: 6b 69 6e 67 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  king memory..**.
2a60: 2a 2a 20 45 61 63 68 20 74 69 74 6c 65 20 6f 76  ** Each title ov
2a70: 65 72 77 72 69 74 65 20 74 68 65 20 70 72 65 76  erwrite the prev
2a80: 69 6f 75 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ious..*/.static 
2a90: 69 6e 74 20 74 65 73 74 5f 6d 65 6d 64 65 62 75  int test_memdebu
2aa0: 67 5f 73 65 74 74 69 74 6c 65 28 0a 20 20 76 6f  g_settitle(.  vo
2ab0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2ac0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2ad0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2ae0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2af0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74  const char *zTit
2b10: 6c 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  le;.  if( objc!=
2b20: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2b30: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2b40: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54 49 54 4c  , 1, objv, "TITL
2b50: 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
2b60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2b70: 20 7a 54 69 74 6c 65 20 3d 20 54 63 6c 5f 47 65   zTitle = Tcl_Ge
2b80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2b90: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2ba0: 4d 45 4d 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  MEMDEBUG.  {.   
2bb0: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2bc0: 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 73 65 74  te3_memdebug_set
2bd0: 74 69 74 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  title(const char
2be0: 2a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  *);.    sqlite3_
2bf0: 6d 65 6d 64 65 62 75 67 5f 73 65 74 74 69 74 6c  memdebug_settitl
2c00: 65 28 7a 54 69 74 6c 65 29 3b 0a 20 20 7d 0a 23  e(zTitle);.  }.#
2c10: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
2c20: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
2c30: 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e   Register comman
2c40: 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ds with the TCL 
2c50: 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
2c60: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 5f 6d  int Sqlitetest_m
2c70: 61 6c 6c 6f 63 5f 49 6e 69 74 28 54 63 6c 5f 49  alloc_Init(Tcl_I
2c80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
2c90: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
2ca0: 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
2cb0: 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a  me;.     Tcl_Obj
2cc0: 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
2cd0: 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20    } aObjCmd[] = 
2ce0: 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  {.     { "sqlite
2cf0: 33 5f 6d 61 6c 6c 6f 63 22 2c 20 20 20 20 20 20  3_malloc",      
2d00: 20 20 20 20 20 20 20 74 65 73 74 5f 6d 61 6c 6c         test_mall
2d10: 6f 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  oc              
2d20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2d30: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 22  sqlite3_realloc"
2d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
2d50: 74 5f 72 65 61 6c 6c 6f 63 20 20 20 20 20 20 20  t_realloc       
2d60: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2d70: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 72     { "sqlite3_fr
2d80: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
2d90: 20 20 20 74 65 73 74 5f 66 72 65 65 20 20 20 20     test_free    
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 65 6d 73   },.     { "mems
2dc0: 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  et",            
2dd0: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6d 65           test_me
2de0: 6d 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  mset            
2df0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2e00: 20 22 6d 65 6d 67 65 74 22 2c 20 20 20 20 20 20   "memget",      
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2e20: 65 73 74 5f 6d 65 6d 67 65 74 20 20 20 20 20 20  est_memget      
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2e40: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e50: 6d 65 6d 6f 72 79 5f 75 73 65 64 22 2c 20 20 20  memory_used",   
2e60: 20 20 20 20 20 74 65 73 74 5f 6d 65 6d 6f 72 79       test_memory
2e70: 5f 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20  _used           
2e80: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2e90: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67  lite3_memory_hig
2ea0: 68 77 61 74 65 72 22 2c 20 20 20 74 65 73 74 5f  hwater",   test_
2eb0: 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
2ec0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2ed0: 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65 6d 64   { "sqlite3_memd
2ee0: 65 62 75 67 5f 62 61 63 6b 74 72 61 63 65 22 2c  ebug_backtrace",
2ef0: 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67 5f 62   test_memdebug_b
2f00: 61 63 6b 74 72 61 63 65 20 20 20 20 20 20 20 7d  acktrace       }
2f10: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f20: 33 5f 6d 65 6d 64 65 62 75 67 5f 64 75 6d 70 22  3_memdebug_dump"
2f30: 2c 20 20 20 20 20 20 74 65 73 74 5f 6d 65 6d 64  ,      test_memd
2f40: 65 62 75 67 5f 64 75 6d 70 20 20 20 20 20 20 20  ebug_dump       
2f50: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2f60: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
2f70: 5f 66 61 69 6c 22 2c 20 20 20 20 20 20 74 65 73  _fail",      tes
2f80: 74 5f 6d 65 6d 64 65 62 75 67 5f 66 61 69 6c 20  t_memdebug_fail 
2f90: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2fa0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 65     { "sqlite3_me
2fb0: 6d 64 65 62 75 67 5f 70 65 6e 64 69 6e 67 22 2c  mdebug_pending",
2fc0: 20 20 20 74 65 73 74 5f 6d 65 6d 64 65 62 75 67     test_memdebug
2fd0: 5f 70 65 6e 64 69 6e 67 20 20 20 20 20 20 20 20  _pending        
2fe0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ff0: 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 73 65 74  te3_memdebug_set
3000: 74 69 74 6c 65 22 2c 20 20 74 65 73 74 5f 6d 65  title",  test_me
3010: 6d 64 65 62 75 67 5f 73 65 74 74 69 74 6c 65 20  mdebug_settitle 
3020: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
3030: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
3040: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a  0; i<sizeof(aObj
3050: 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a  Cmd)/sizeof(aObj
3060: 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
3070: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
3080: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
3090: 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  aObjCmd[i].zName
30a0: 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72  , aObjCmd[i].xPr
30b0: 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  oc, 0, 0);.  }. 
30c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
30d0: 7d 0a                                            }.