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

Artifact 30db0ba4952e90f6a2df898ae76194f038baa35d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you 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 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 62  or testing the b
0190: 74 72 65 65 2e 63 20 6d 6f 64 75 6c 65 20 69 6e  tree.c module in
01a0: 20 53 51 4c 69 74 65 2e 20 20 54 68 69 73 20 63   SQLite.  This c
01b0: 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e  ode.** is not in
01c0: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 53 51  cluded in the SQ
01d0: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20 49  Lite library.  I
01e0: 74 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 75  t is used for au
01f0: 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73 74 69  tomated.** testi
0200: 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  ng of the SQLite
0210: 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20   library..**.** 
0220: 24 49 64 3a 20 74 65 73 74 33 2e 63 2c 76 20 31  $Id: test3.c,v 1
0230: 2e 31 30 39 20 32 30 30 39 2f 30 37 2f 30 39 20  .109 2009/07/09 
0240: 30 32 3a 34 38 3a 32 34 20 73 68 61 6e 65 20 45  02:48:24 shane E
0250: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0260: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0270: 69 6e 63 6c 75 64 65 20 22 62 74 72 65 65 49 6e  include "btreeIn
0280: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74  t.h".#include "t
0290: 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  cl.h".#include <
02a0: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
02b0: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
02c0: 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 61  *.** Interpret a
02d0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 6e  n SQLite error n
02e0: 75 6d 62 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  umber.*/.static 
02f0: 63 68 61 72 20 2a 65 72 72 6f 72 4e 61 6d 65 28  char *errorName(
0300: 69 6e 74 20 72 63 29 7b 0a 20 20 63 68 61 72 20  int rc){.  char 
0310: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68  *zName;.  switch
0320: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65  ( rc ){.    case
0330: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
0340: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0350: 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20  ITE_OK";        
0360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0370: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
0380: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0390: 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20  LITE_ERROR";    
03a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
03b0: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
03c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
03d0: 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20  QLITE_PERM";    
03e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
03f0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
0400: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
0410: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
0420: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0430: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
0440: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
0450: 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20  "SQLITE_BUSY";  
0460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0470: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
0480: 45 4d 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  EM:      zName =
0490: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
04a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
04b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
04c0: 41 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d 65 20  ADONLY:   zName 
04d0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
04e0: 4c 59 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  LY";    break;. 
04f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
0500: 4e 54 45 52 52 55 50 54 3a 20 20 7a 4e 61 6d 65  NTERRUPT:  zName
0510: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
0520: 52 55 50 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  RUPT";   break;.
0530: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0540: 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 4e 61 6d  IOERR:      zNam
0550: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
0560: 52 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  R";       break;
0570: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0580: 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a 4e 61  _CORRUPT:    zNa
0590: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
05a0: 52 55 50 54 22 3b 20 20 20 20 20 62 72 65 61 6b  RUPT";     break
05b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
05c0: 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a 4e  E_FULL:       zN
05d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55  ame = "SQLITE_FU
05e0: 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  LL";        brea
05f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0600: 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 7a  TE_CANTOPEN:   z
0610: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
0620: 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62 72 65  ANTOPEN";    bre
0630: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0640: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
0650: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0660: 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 62 72  PROTOCOL";    br
0670: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0680: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
0690: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
06a0: 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 62  _EMPTY";       b
06b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
06c0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
06d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
06e0: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
06f0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
0700: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  lt:             
0710: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0720: 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20  TE_Unknown";    
0730: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
0740: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
0750: 2a 0a 2a 2a 20 41 20 62 6f 67 75 73 20 73 71 6c  *.** A bogus sql
0760: 69 74 65 33 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ite3 connection 
0770: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 75 73  structure for us
0780: 65 20 69 6e 20 74 68 65 20 62 74 72 65 65 0a 2a  e in the btree.*
0790: 2a 20 74 65 73 74 73 2e 0a 2a 2f 0a 73 74 61 74  * tests..*/.stat
07a0: 69 63 20 73 71 6c 69 74 65 33 20 73 44 62 3b 0a  ic sqlite3 sDb;.
07b0: 73 74 61 74 69 63 20 69 6e 74 20 6e 52 65 66 53  static int nRefS
07c0: 71 6c 69 74 65 33 20 3d 20 30 3b 0a 0a 2f 2a 0a  qlite3 = 0;../*.
07d0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65  ** Usage:   btre
07e0: 65 5f 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45 20  e_open FILENAME 
07f0: 4e 43 41 43 48 45 20 46 4c 41 47 53 0a 2a 2a 0a  NCACHE FLAGS.**.
0800: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
0810: 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63  tabase.*/.static
0820: 20 69 6e 74 20 62 74 72 65 65 5f 6f 70 65 6e 28   int btree_open(
0830: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
0840: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
0850: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
0860: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0870: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
0880: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
0890: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
08a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
08b0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
08c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
08d0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
08e0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
08f0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
0900: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e *pBt;.  int rc
0910: 2c 20 6e 43 61 63 68 65 2c 20 66 6c 61 67 73 3b  , nCache, flags;
0920: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
0930: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
0940: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
0950: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0960: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
0970: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
0980: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
0990: 20 46 49 4c 45 4e 41 4d 45 20 4e 43 41 43 48 45   FILENAME NCACHE
09a0: 20 46 4c 41 47 53 5c 22 22 2c 20 30 29 3b 0a 20   FLAGS\"", 0);. 
09b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
09c0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
09d0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
09e0: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6e 43 61 63  , argv[2], &nCac
09f0: 68 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  he) ) return TCL
0a00: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
0a10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
0a20: 20 61 72 67 76 5b 33 5d 2c 20 26 66 6c 61 67 73   argv[3], &flags
0a30: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
0a40: 52 52 4f 52 3b 0a 20 20 6e 52 65 66 53 71 6c 69  RROR;.  nRefSqli
0a50: 74 65 33 2b 2b 3b 0a 20 20 69 66 28 20 6e 52 65  te3++;.  if( nRe
0a60: 66 53 71 6c 69 74 65 33 3d 3d 31 20 29 7b 0a 20  fSqlite3==1 ){. 
0a70: 20 20 20 73 44 62 2e 70 56 66 73 20 3d 20 73 71     sDb.pVfs = sq
0a80: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
0a90: 29 3b 0a 20 20 20 20 73 44 62 2e 6d 75 74 65 78  );.    sDb.mutex
0aa0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
0ab0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
0ac0: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
0ad0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
0ae0: 65 6e 74 65 72 28 73 44 62 2e 6d 75 74 65 78 29  enter(sDb.mutex)
0af0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
0b00: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 61 72  ite3BtreeOpen(ar
0b10: 67 76 5b 31 5d 2c 20 26 73 44 62 2c 20 26 70 42  gv[1], &sDb, &pB
0b20: 74 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 53  t, flags,.     S
0b30: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
0b40: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
0b50: 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49  EN_CREATE | SQLI
0b60: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
0b70: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
0b80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
0b90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
0ba0: 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28  terp, errorName(
0bb0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
0bc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0bd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
0be0: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 42  eSetCacheSize(pB
0bf0: 74 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 73 71  t, nCache);.  sq
0c00: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
0c10: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
0c20: 66 2c 22 25 70 22 2c 20 70 42 74 29 3b 0a 20 20  f,"%p", pBt);.  
0c30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0c40: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
0c50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
0c60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
0c70: 67 65 3a 20 20 20 62 74 72 65 65 5f 63 6c 6f 73  ge:   btree_clos
0c80: 65 20 49 44 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  e ID.**.** Close
0c90: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
0ca0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
0cb0: 6e 74 20 62 74 72 65 65 5f 63 6c 6f 73 65 28 0a  nt btree_close(.
0cc0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
0cd0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
0ce0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
0cf0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
0d00: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
0d10: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
0d20: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
0d30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0d40: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
0d50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
0d60: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
0d70: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
0d80: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65  nt */.){.  Btree
0d90: 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b   *pBt;.  int rc;
0da0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
0db0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
0dc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
0dd0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
0de0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
0df0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49  v[0],.       " I
0e00: 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  D\"", 0);.    re
0e10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0e20: 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69    }.  pBt = sqli
0e30: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0e40: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63 20  (argv[1]);.  rc 
0e50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
0e60: 6f 73 65 28 70 42 74 29 3b 0a 20 20 69 66 28 20  ose(pBt);.  if( 
0e70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
0e80: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
0e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
0ea0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
0eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0ec0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e 52 65  ERROR;.  }.  nRe
0ed0: 66 53 71 6c 69 74 65 33 2d 2d 3b 0a 20 20 69 66  fSqlite3--;.  if
0ee0: 28 20 6e 52 65 66 53 71 6c 69 74 65 33 3d 3d 30  ( nRefSqlite3==0
0ef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
0f00: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 44 62 2e  mutex_leave(sDb.
0f10: 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  mutex);.    sqli
0f20: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73  te3_mutex_free(s
0f30: 44 62 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73  Db.mutex);.    s
0f40: 44 62 2e 6d 75 74 65 78 20 3d 20 30 3b 0a 20 20  Db.mutex = 0;.  
0f50: 20 20 73 44 62 2e 70 56 66 73 20 3d 20 30 3b 0a    sDb.pVfs = 0;.
0f60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
0f70: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
0f80: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 62 65  sage:   btree_be
0f90: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin_transaction 
0fa0: 49 44 0a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 61  ID.**.** Start a
0fb0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
0fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
0fd0: 74 72 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73  tree_begin_trans
0fe0: 61 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  action(.  void *
0ff0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
1000: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1010: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1020: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1030: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1040: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
1050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1060: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1070: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
1080: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
1090: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
10a0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
10b0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
10c0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
10d0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
10e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10f0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1100: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1110: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1120: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
1130: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1140: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
1150: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54  t = sqlite3TestT
1160: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
1170: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1180: 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 72  eEnter(pBt);.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11a0: 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
11b0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1);.  sqlite3Btr
11c0: 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20  eeLeave(pBt);.  
11d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11e0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
11f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1200: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
1210: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1230: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1240: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1250: 20 20 62 74 72 65 65 5f 70 61 67 65 72 5f 73 74    btree_pager_st
1260: 61 74 73 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74  ats ID.**.** Ret
1270: 75 72 6e 73 20 70 61 67 65 72 20 73 74 61 74 69  urns pager stati
1280: 73 74 69 63 73 0a 2a 2f 0a 73 74 61 74 69 63 20  stics.*/.static 
1290: 69 6e 74 20 62 74 72 65 65 5f 70 61 67 65 72 5f  int btree_pager_
12a0: 73 74 61 74 73 28 0a 20 20 76 6f 69 64 20 2a 4e  stats(.  void *N
12b0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
12c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
12d0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
12e0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
12f0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1300: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1320: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1330: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
1340: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1350: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
1360: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
1370: 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
1380: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 2a 61 3b  int i;.  int *a;
1390: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
13a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
13b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
13c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
13d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
13e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
13f0: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
1400: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1410: 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c  .  }.  pBt = sql
1420: 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
1430: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 0a 20 20  r(argv[1]);. .  
1440: 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 69 6e 20 74  /* Normally in t
1450: 68 69 73 20 66 69 6c 65 2c 20 77 69 74 68 20 61  his file, with a
1460: 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 6f   b-tree handle o
1470: 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
1480: 0a 20 20 2a 2a 20 5b 62 74 72 65 65 5f 6f 70 65  .  ** [btree_ope
1490: 6e 5d 20 63 6f 6d 6d 61 6e 64 20 69 74 20 69 73  n] command it is
14a0: 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 73 71   safe to call sq
14b0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14c0: 29 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2a  ) directly..  **
14d0: 20 42 75 74 20 74 68 69 73 20 66 75 6e 63 74 69   But this functi
14e0: 6f 6e 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  on is sometimes 
14f0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 62 74  called with a bt
1500: 72 65 65 20 68 61 6e 64 6c 65 20 6f 62 74 61 69  ree handle obtai
1510: 6e 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 61 6e  ned.  ** from an
1520: 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 63 6f 6e   open SQLite con
1530: 6e 65 63 74 69 6f 6e 20 28 75 73 69 6e 67 20 5b  nection (using [
1540: 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 5d 29 2e  btree_from_db]).
1550: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
1560: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 6f 62  ** we need to ob
1570: 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 20 66  tain the mutex f
1580: 6f 72 20 74 68 65 20 63 6f 6e 74 72 6f 6c 6c 69  or the controlli
1590: 6e 67 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  ng SQLite handle
15a0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20   before.  ** it 
15b0: 69 73 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20  is safe to call 
15c0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15d0: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  r()..  */.  sqli
15e0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15f0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b  pBt->db->mutex);
1600: 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1610: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 61 20  Enter(pBt);.  a 
1620: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
1630: 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
1640: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 66  Pager(pBt));.  f
1650: 6f 72 28 69 3d 30 3b 20 69 3c 31 31 3b 20 69 2b  or(i=0; i<11; i+
1660: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
1670: 68 61 72 20 2a 7a 4e 61 6d 65 5b 5d 20 3d 20 7b  har *zName[] = {
1680: 0a 20 20 20 20 20 20 22 72 65 66 22 2c 20 22 70  .      "ref", "p
1690: 61 67 65 22 2c 20 22 6d 61 78 22 2c 20 22 73 69  age", "max", "si
16a0: 7a 65 22 2c 20 22 73 74 61 74 65 22 2c 20 22 65  ze", "state", "e
16b0: 72 72 22 2c 0a 20 20 20 20 20 20 22 68 69 74 22  rr",.      "hit"
16c0: 2c 20 22 6d 69 73 73 22 2c 20 22 6f 76 66 6c 22  , "miss", "ovfl"
16d0: 2c 20 22 72 65 61 64 22 2c 20 22 77 72 69 74 65  , "read", "write
16e0: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61  ".    };.    cha
16f0: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20  r zBuf[100];.   
1700: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
1710: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 4e 61 6d 65  nt(interp, zName
1720: 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [i]);.    sqlite
1730: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1740: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 22 25  f(zBuf), zBuf,"%
1750: 64 22 2c 61 5b 69 5d 29 3b 0a 20 20 20 20 54 63  d",a[i]);.    Tc
1760: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
1770: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
1780: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1790: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 0a 20 20  eLeave(pBt);..  
17a0: 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6d  /* Release the m
17b0: 75 74 65 78 20 6f 6e 20 74 68 65 20 53 51 4c 69  utex on the SQLi
17c0: 74 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63  te handle that c
17d0: 6f 6e 74 72 6f 6c 73 20 74 68 69 73 20 62 2d 74  ontrols this b-t
17e0: 72 65 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ree */.  sqlite3
17f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 42 74  _mutex_leave(pBt
1800: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ->db->mutex);.  
1810: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1820: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1830: 20 62 74 72 65 65 5f 63 75 72 73 6f 72 20 49 44   btree_cursor ID
1840: 20 54 41 42 4c 45 4e 55 4d 20 57 52 49 54 45 41   TABLENUM WRITEA
1850: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65  BLE.**.** Create
1860: 20 61 20 6e 65 77 20 63 75 72 73 6f 72 2e 20 20   a new cursor.  
1870: 52 65 74 75 72 6e 20 74 68 65 20 49 44 20 66 6f  Return the ID fo
1880: 72 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  r the cursor..*/
1890: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
18a0: 65 5f 63 75 72 73 6f 72 28 0a 20 20 76 6f 69 64  e_cursor(.  void
18b0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
18c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
18e0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
18f0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1900: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1910: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1920: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1930: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
1940: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
1950: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1960: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1970: 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1980: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 0a 20  .  int iTable;. 
1990: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
19a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
19b0: 20 77 72 46 6c 61 67 3b 0a 20 20 63 68 61 72 20   wrFlag;.  char 
19c0: 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[30];..  if(
19d0: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
19e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19f0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a00: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a10: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
1a20: 20 20 20 20 20 20 20 22 20 49 44 20 54 41 42 4c         " ID TABL
1a30: 45 4e 55 4d 20 57 52 49 54 45 41 42 4c 45 5c 22  ENUM WRITEABLE\"
1a40: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1a50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a60: 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
1a70: 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 61 72  TestTextToPtr(ar
1a80: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63  gv[1]);.  if( Tc
1a90: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1aa0: 20 61 72 67 76 5b 32 5d 2c 20 26 69 54 61 62 6c   argv[2], &iTabl
1ab0: 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
1ac0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1ad0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 28 69 6e 74 65  _GetBoolean(inte
1ae0: 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20 26 77 72  rp, argv[3], &wr
1af0: 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20 54  Flag) ) return T
1b00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 43 75 72  CL_ERROR;.  pCur
1b10: 20 3d 20 28 42 74 43 75 72 73 6f 72 20 2a 29 63   = (BtCursor *)c
1b20: 6b 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 42 74  kalloc(sqlite3Bt
1b30: 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 29  reeCursorSize())
1b40: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c  ;.  memset(pCur,
1b50: 20 30 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65   0, sqlite3Btree
1b60: 43 75 72 73 6f 72 53 69 7a 65 28 29 29 3b 0a 20  CursorSize());. 
1b70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b80: 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20  er(pBt);.  rc = 
1b90: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b  sqlite3BtreeLock
1ba0: 54 61 62 6c 65 28 70 42 74 2c 20 69 54 61 62 6c  Table(pBt, iTabl
1bb0: 65 2c 20 77 72 46 6c 61 67 29 3b 0a 20 20 69 66  e, wrFlag);.  if
1bc0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bd0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1be0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70  te3BtreeCursor(p
1bf0: 42 74 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  Bt, iTable, wrFl
1c00: 61 67 2c 20 30 2c 20 70 43 75 72 29 3b 0a 20 20  ag, 0, pCur);.  
1c10: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1c20: 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 69 66  Leave(pBt);.  if
1c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6b 66 72  ( rc ){.    ckfr
1c40: 65 65 28 28 63 68 61 72 20 2a 29 70 43 75 72 29  ee((char *)pCur)
1c50: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1c60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65  Result(interp, e
1c70: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
1c80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
1ca0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1cb0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1cc0: 66 2c 22 25 70 22 2c 20 70 43 75 72 29 3b 0a 20  f,"%p", pCur);. 
1cd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ce0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1cf0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
1d00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d10: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
1d20: 63 6c 6f 73 65 5f 63 75 72 73 6f 72 20 49 44 0a  close_cursor ID.
1d30: 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  **.** Close a cu
1d40: 72 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e  rsor opened usin
1d50: 67 20 62 74 72 65 65 5f 63 75 72 73 6f 72 2e 0a  g btree_cursor..
1d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
1d70: 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72  ree_close_cursor
1d80: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1d90: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1da0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1db0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1dc0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1dd0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1de0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1e10: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1e20: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
1e30: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1e40: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
1e50: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 42  ursor *pCur;.  B
1e60: 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74  tree *pBt;.  int
1e70: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
1e80: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1e90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ea0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1eb0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ec0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
1ed0: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
1ee0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ef0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20  ROR;.  }.  pCur 
1f00: 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  = sqlite3TestTex
1f10: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
1f20: 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  .  pBt = pCur->p
1f30: 42 74 72 65 65 3b 0a 20 20 73 71 6c 69 74 65 33  Btree;.  sqlite3
1f40: 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
1f50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1f60: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1f70: 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
1f80: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
1f90: 0a 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20  .  ckfree((char 
1fa0: 2a 29 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  *)pCur);.  if( r
1fb0: 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c ){.    Tcl_App
1fc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fd0: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
1fe0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1ff0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2010: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2020: 65 3a 20 20 20 62 74 72 65 65 5f 6e 65 78 74 20  e:   btree_next 
2030: 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  ID.**.** Move th
2040: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2050: 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2060: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2070: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a   0 on success.**
2080: 20 6f 72 20 31 20 69 66 20 74 68 65 20 63 75 72   or 1 if the cur
2090: 73 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  sor was already 
20a0: 6f 6e 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  on the last entr
20b0: 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
20c0: 72 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  r if.** the tabl
20d0: 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73  e is empty..*/.s
20e0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
20f0: 6e 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  next(.  void *No
2100: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
2110: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2120: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2130: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2140: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2150: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2170: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2180: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
2190: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
21a0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
21b0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
21c0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
21d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
21e0: 20 72 65 73 20 3d 20 30 3b 0a 20 20 63 68 61 72   res = 0;.  char
21f0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
2200: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
2210: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2220: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2230: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2240: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
2250: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
2260: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2270: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2280: 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33    pCur = sqlite3
2290: 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 61 72  TestTextToPtr(ar
22a0: 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[1]);.  sqlite
22b0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75 72  3BtreeEnter(pCur
22c0: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63 20  ->pBtree);.  rc 
22d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
22e0: 78 74 28 70 43 75 72 2c 20 26 72 65 73 29 3b 0a  xt(pCur, &res);.
22f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2300: 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
2310: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2320: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2330: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
2340: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
2350: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2360: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
2370: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2380: 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25  of(zBuf),zBuf,"%
2390: 64 22 2c 72 65 73 29 3b 0a 20 20 54 63 6c 5f 41  d",res);.  Tcl_A
23a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23b0: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
23e0: 3a 20 20 20 62 74 72 65 65 5f 66 69 72 73 74 20  :   btree_first 
23f0: 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  ID.**.** Move th
2400: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2410: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
2420: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2430: 6e 20 30 20 69 66 20 74 68 65 0a 2a 2a 20 63 75  n 0 if the.** cu
2440: 72 73 6f 72 20 77 61 73 20 6c 65 66 74 20 70 6f  rsor was left po
2450: 69 6e 74 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  int to something
2460: 20 61 6e 64 20 31 20 69 66 20 74 68 65 20 74 61   and 1 if the ta
2470: 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2480: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2490: 65 5f 66 69 72 73 74 28 0a 20 20 76 6f 69 64 20  e_first(.  void 
24a0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
24b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24c0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24d0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24e0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24f0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
2500: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2510: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2520: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
2530: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
2540: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
2550: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
2560: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
2570: 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ur;.  int rc;.  
2580: 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 63  int res = 0;.  c
2590: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
25a0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
25b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
25c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
25d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
25e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
25f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
2600: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
2610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2620: 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
2630: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
2640: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c  (argv[1]);.  sql
2650: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
2660: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
2670: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2680: 65 46 69 72 73 74 28 70 43 75 72 2c 20 26 72 65  eFirst(pCur, &re
2690: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
26a0: 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42  eeLeave(pCur->pB
26b0: 74 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 20  tree);.  if( rc 
26c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
26d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
26e0: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
26f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2700: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  L_ERROR;.  }.  s
2710: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2720: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75  sizeof(zBuf),zBu
2730: 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20 54  f,"%d",res);.  T
2740: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2750: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
2760: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2770: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
2780: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 65 6f  sage:   btree_eo
2790: 66 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  f ID.**.** Retur
27a0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
27b0: 76 65 6e 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  ven cursor is no
27c0: 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
27d0: 76 61 6c 69 64 20 65 6e 74 72 79 2e 0a 2a 2a 20  valid entry..** 
27e0: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
27f0: 74 68 65 20 63 75 72 73 6f 72 20 64 6f 65 73 20  the cursor does 
2800: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
2810: 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69   entry..*/.stati
2820: 63 20 69 6e 74 20 62 74 72 65 65 5f 65 6f 66 28  c int btree_eof(
2830: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
2840: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2850: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2860: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2870: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2880: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2890: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
28a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28b0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
28c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28d0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
28e0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
28f0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ent */.){.  BtCu
2900: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
2910: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75  t rc;.  char zBu
2920: 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[50];..  if( ar
2930: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
2940: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2950: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2960: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2970: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
2980: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
2990: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75  ERROR;.  }.  pCu
29b0: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54  r = sqlite3TestT
29c0: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
29d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
29e0: 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74  eEnter(pCur->pBt
29f0: 72 65 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ree);.  rc = sql
2a00: 69 74 65 33 42 74 72 65 65 45 6f 66 28 70 43 75  ite3BtreeEof(pCu
2a10: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
2a20: 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42  eeLeave(pCur->pB
2a30: 74 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  tree);.  sqlite3
2a40: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2a50: 28 7a 42 75 66 29 2c 7a 42 75 66 2c 20 22 25 64  (zBuf),zBuf, "%d
2a60: 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70  ", rc);.  Tcl_Ap
2a70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2a80: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
2a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2ab0: 20 20 20 62 74 72 65 65 5f 70 61 79 6c 6f 61 64     btree_payload
2ac0: 5f 73 69 7a 65 20 49 44 0a 2a 2a 0a 2a 2a 20 52  _size ID.**.** R
2ad0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2ae0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
2af0: 6c 6f 61 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69  load.*/.static i
2b00: 6e 74 20 62 74 72 65 65 5f 70 61 79 6c 6f 61 64  nt btree_payload
2b10: 5f 73 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 4e  _size(.  void *N
2b20: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2b30: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2b40: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2b50: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2b60: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2b70: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b90: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2ba0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
2bb0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2bc0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2bd0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2bf0: 3b 0a 20 20 69 6e 74 20 6e 32 3b 0a 20 20 75 36  ;.  int n2;.  u6
2c00: 34 20 6e 31 3b 0a 20 20 63 68 61 72 20 7a 42 75  4 n1;.  char zBu
2c10: 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[50];..  if( ar
2c20: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
2c30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2c40: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2c50: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2c60: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
2c70: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
2c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75  ERROR;.  }.  pCu
2ca0: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54  r = sqlite3TestT
2cb0: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
2cc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
2cd0: 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74  eEnter(pCur->pBt
2ce0: 72 65 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ree);.  if( sqli
2cf0: 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 70 43  te3BtreeFlags(pC
2d00: 75 72 29 20 26 20 42 54 52 45 45 5f 49 4e 54 4b  ur) & BTREE_INTK
2d10: 45 59 20 29 7b 0a 20 20 20 20 6e 31 20 3d 20 30  EY ){.    n1 = 0
2d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2d30: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
2d40: 7a 65 28 70 43 75 72 2c 20 28 69 36 34 2a 29 26  ze(pCur, (i64*)&
2d50: 6e 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n1);.  }.  sqlit
2d60: 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
2d70: 70 43 75 72 2c 20 28 75 33 32 2a 29 26 6e 32 29  pCur, (u32*)&n2)
2d80: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2d90: 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72  Leave(pCur->pBtr
2da0: 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ee);.  sqlite3_s
2db0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2dc0: 42 75 66 29 2c 7a 42 75 66 2c 20 22 25 64 22 2c  Buf),zBuf, "%d",
2dd0: 20 28 69 6e 74 29 28 6e 31 2b 6e 32 29 29 3b 0a   (int)(n1+n2));.
2de0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2df0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
2e00: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
2e10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2e20: 2a 20 75 73 61 67 65 3a 20 20 20 76 61 72 69 6e  * usage:   varin
2e30: 74 5f 74 65 73 74 20 20 53 54 41 52 54 20 20 4d  t_test  START  M
2e40: 55 4c 54 49 50 4c 49 45 52 20 20 43 4f 55 4e 54  ULTIPLIER  COUNT
2e50: 20 20 49 4e 43 52 45 4d 45 4e 54 0a 2a 2a 0a 2a    INCREMENT.**.*
2e60: 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 74  * This command t
2e70: 65 73 74 73 20 74 68 65 20 70 75 74 56 61 72 69  ests the putVari
2e80: 6e 74 28 29 20 61 6e 64 20 67 65 74 56 61 72 69  nt() and getVari
2e90: 6e 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  nt().** routines
2ea0: 2c 20 62 6f 74 68 20 66 6f 72 20 61 63 63 75 72  , both for accur
2eb0: 61 63 79 20 61 6e 64 20 66 6f 72 20 73 70 65 65  acy and for spee
2ec0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  d..**.** An inte
2ed0: 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 75  ger is written u
2ee0: 73 69 6e 67 20 70 75 74 56 61 72 69 6e 74 28 29  sing putVarint()
2ef0: 20 61 6e 64 20 72 65 61 64 20 62 61 63 6b 20 77   and read back w
2f00: 69 74 68 0a 2a 2a 20 67 65 74 56 61 72 69 6e 74  ith.** getVarint
2f10: 28 29 20 61 6e 64 20 76 61 72 69 66 69 65 64 20  () and varified 
2f20: 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
2f30: 20 20 54 68 69 73 20 72 65 70 65 61 74 73 20 43    This repeats C
2f40: 4f 55 4e 54 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  OUNT.** times.  
2f50: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
2f60: 72 20 69 73 20 53 54 41 52 54 2a 4d 55 4c 54 49  r is START*MULTI
2f70: 50 4c 49 45 52 2e 20 20 45 61 63 68 20 69 74 65  PLIER.  Each ite
2f80: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 72 65 61  ration.** increa
2f90: 73 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  ses the integer 
2fa0: 62 79 20 49 4e 43 52 45 4d 45 4e 54 2e 0a 2a 2a  by INCREMENT..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
2fc0: 20 72 65 74 75 72 6e 73 20 6e 6f 74 68 69 6e 67   returns nothing
2fd0: 20 69 66 20 69 74 20 77 6f 72 6b 73 2e 20 20 49   if it works.  I
2fe0: 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  t returns an err
2ff0: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 66  or message.** if
3000: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
3010: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
3020: 20 69 6e 74 20 62 74 72 65 65 5f 76 61 72 69 6e   int btree_varin
3030: 74 5f 74 65 73 74 28 0a 20 20 76 6f 69 64 20 2a  t_test(.  void *
3040: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
3050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
3060: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
3070: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
3080: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
3090: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
30a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
30c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
30d0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
30e0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
30f0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
3100: 0a 20 20 75 33 32 20 73 74 61 72 74 2c 20 6d 75  .  u32 start, mu
3110: 6c 74 2c 20 63 6f 75 6e 74 2c 20 69 6e 63 72 3b  lt, count, incr;
3120: 0a 20 20 75 36 34 20 69 6e 2c 20 6f 75 74 3b 0a  .  u64 in, out;.
3130: 20 20 69 6e 74 20 6e 31 2c 20 6e 32 2c 20 69 2c    int n1, n2, i,
3140: 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   j;.  unsigned c
3150: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
3160: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
3170: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3180: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3190: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
31a0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
31b0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 53 54 41  0],.       " STA
31c0: 52 54 20 4d 55 4c 54 49 50 4c 49 45 52 20 43 4f  RT MULTIPLIER CO
31d0: 55 4e 54 20 49 4e 43 52 45 4d 45 4e 54 5c 22 22  UNT INCREMENT\""
31e0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
31f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3200: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
3210: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
3220: 2c 20 28 69 6e 74 2a 29 26 73 74 61 72 74 29 20  , (int*)&start) 
3230: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3240: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
3250: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
3260: 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 6d 75 6c  v[2], (int*)&mul
3270: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
3280: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
3290: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
32a0: 61 72 67 76 5b 33 5d 2c 20 28 69 6e 74 2a 29 26  argv[3], (int*)&
32b0: 63 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20  count) ) return 
32c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
32d0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
32e0: 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 28 69 6e  rp, argv[4], (in
32f0: 74 2a 29 26 69 6e 63 72 29 20 29 20 72 65 74 75  t*)&incr) ) retu
3300: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3310: 69 6e 20 3d 20 73 74 61 72 74 3b 0a 20 20 69 6e  in = start;.  in
3320: 20 2a 3d 20 6d 75 6c 74 3b 0a 20 20 66 6f 72 28   *= mult;.  for(
3330: 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 3b 20 69 2b  i=0; i<count; i+
3340: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 45 72  +){.    char zEr
3350: 72 5b 32 30 30 5d 3b 0a 20 20 20 20 6e 31 20 3d  r[200];.    n1 =
3360: 20 70 75 74 56 61 72 69 6e 74 28 7a 42 75 66 2c   putVarint(zBuf,
3370: 20 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 31   in);.    if( n1
3380: 3e 39 20 7c 7c 20 6e 31 3c 31 20 29 7b 0a 20 20  >9 || n1<1 ){.  
3390: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72      sprintf(zErr
33a0: 2c 20 22 70 75 74 56 61 72 69 6e 74 20 72 65 74  , "putVarint ret
33b0: 75 72 6e 65 64 20 25 64 20 2d 20 73 68 6f 75 6c  urned %d - shoul
33c0: 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  d be between 1 a
33d0: 6e 64 20 39 22 2c 20 6e 31 29 3b 0a 20 20 20 20  nd 9", n1);.    
33e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
33f0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
3400: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
3410: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3420: 20 7d 0a 20 20 20 20 6e 32 20 3d 20 67 65 74 56   }.    n2 = getV
3430: 61 72 69 6e 74 28 7a 42 75 66 2c 20 26 6f 75 74  arint(zBuf, &out
3440: 29 3b 0a 20 20 20 20 69 66 28 20 6e 31 21 3d 6e  );.    if( n1!=n
3450: 32 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  2 ){.      sprin
3460: 74 66 28 7a 45 72 72 2c 20 22 70 75 74 56 61 72  tf(zErr, "putVar
3470: 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64 20  int returned %d 
3480: 61 6e 64 20 67 65 74 56 61 72 69 6e 74 20 72 65  and getVarint re
3490: 74 75 72 6e 65 64 20 25 64 22 2c 20 6e 31 2c 20  turned %d", n1, 
34a0: 6e 32 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  n2);.      Tcl_A
34b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
34c0: 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20  rp, zErr, 0);.  
34d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
34e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
34f0: 69 66 28 20 69 6e 21 3d 6f 75 74 20 29 7b 0a 20  if( in!=out ){. 
3500: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72       sprintf(zEr
3510: 72 2c 20 22 57 72 6f 74 65 20 30 78 25 30 31 36  r, "Wrote 0x%016
3520: 6c 6c 78 20 61 6e 64 20 67 6f 74 20 62 61 63 6b  llx and got back
3530: 20 30 78 25 30 31 36 6c 6c 78 22 2c 20 69 6e 2c   0x%016llx", in,
3540: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 54 63 6c   out);.      Tcl
3550: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3560: 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a  terp, zErr, 0);.
3570: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
3580: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
3590: 20 20 69 66 28 20 28 69 6e 20 26 20 30 78 66 66    if( (in & 0xff
35a0: 66 66 66 66 66 66 29 3d 3d 69 6e 20 29 7b 0a 20  ffffff)==in ){. 
35b0: 20 20 20 20 20 75 33 32 20 6f 75 74 33 32 3b 0a       u32 out32;.
35c0: 20 20 20 20 20 20 6e 32 20 3d 20 67 65 74 56 61        n2 = getVa
35d0: 72 69 6e 74 33 32 28 7a 42 75 66 2c 20 6f 75 74  rint32(zBuf, out
35e0: 33 32 29 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d  32);.      out =
35f0: 20 6f 75 74 33 32 3b 0a 20 20 20 20 20 20 69 66   out32;.      if
3600: 28 20 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20  ( n1!=n2 ){.    
3610: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72      sprintf(zErr
3620: 2c 20 22 70 75 74 56 61 72 69 6e 74 20 72 65 74  , "putVarint ret
3630: 75 72 6e 65 64 20 25 64 20 61 6e 64 20 47 65 74  urned %d and Get
3640: 56 61 72 69 6e 74 33 32 20 72 65 74 75 72 6e 65  Varint32 returne
3650: 64 20 25 64 22 2c 20 0a 20 20 20 20 20 20 20 20  d %d", .        
3660: 20 20 20 20 20 20 20 20 20 20 6e 31 2c 20 6e 32            n1, n2
3670: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  );.        Tcl_A
3680: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3690: 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20  rp, zErr, 0);.  
36a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
36b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
36c0: 20 20 20 20 20 20 69 66 28 20 69 6e 21 3d 6f 75        if( in!=ou
36d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72  t ){.        spr
36e0: 69 6e 74 66 28 7a 45 72 72 2c 20 22 57 72 6f 74  intf(zErr, "Wrot
36f0: 65 20 30 78 25 30 31 36 6c 6c 78 20 61 6e 64 20  e 0x%016llx and 
3700: 67 6f 74 20 62 61 63 6b 20 30 78 25 30 31 36 6c  got back 0x%016l
3710: 6c 78 20 66 72 6f 6d 20 47 65 74 56 61 72 69 6e  lx from GetVarin
3720: 74 33 32 22 2c 0a 20 20 20 20 20 20 20 20 20 20  t32",.          
3730: 20 20 69 6e 2c 20 6f 75 74 29 3b 0a 20 20 20 20    in, out);.    
3740: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3750: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
3760: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  r, 0);.        r
3770: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3790: 20 20 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20      /* In order 
37a0: 74 6f 20 67 65 74 20 72 65 61 6c 69 73 74 69 63  to get realistic
37b0: 20 74 69 6d 69 6e 67 73 2c 20 72 75 6e 20 67 65   timings, run ge
37c0: 74 56 61 72 69 6e 74 20 31 39 20 6d 6f 72 65 20  tVarint 19 more 
37d0: 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68  times..    ** Th
37e0: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 67 65  is is because ge
37f0: 74 56 61 72 69 6e 74 20 69 73 20 63 61 6c 6c 65  tVarint is calle
3800: 64 20 61 62 6f 75 74 20 32 30 20 74 69 6d 65 73  d about 20 times
3810: 20 6d 6f 72 65 20 6f 66 74 65 6e 0a 20 20 20 20   more often.    
3820: 2a 2a 20 74 68 61 6e 20 70 75 74 56 61 72 69 6e  ** than putVarin
3830: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  t..    */.    fo
3840: 72 28 6a 3d 30 3b 20 6a 3c 31 39 3b 20 6a 2b 2b  r(j=0; j<19; j++
3850: 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
3860: 6e 74 28 7a 42 75 66 2c 20 26 6f 75 74 29 3b 0a  nt(zBuf, &out);.
3870: 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 2b 3d 20      }.    in += 
3880: 69 6e 63 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  incr;.  }.  retu
3890: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
38a0: 0a 2a 2a 20 75 73 61 67 65 3a 20 20 20 62 74 72  .** usage:   btr
38b0: 65 65 5f 66 72 6f 6d 5f 64 62 20 20 44 42 2d 48  ee_from_db  DB-H
38c0: 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ANDLE.**.** This
38d0: 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73   command returns
38e0: 20 74 68 65 20 62 74 72 65 65 20 68 61 6e 64 6c   the btree handl
38f0: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  e for the main d
3900: 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
3910: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 64  ed.** with the d
3920: 61 74 61 62 61 73 65 2d 68 61 6e 64 6c 65 20 70  atabase-handle p
3930: 61 73 73 65 64 20 61 73 20 74 68 65 20 61 72 67  assed as the arg
3940: 75 6d 65 6e 74 2e 20 45 78 61 6d 70 6c 65 20 75  ument. Example u
3950: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  sage:.**.** sqli
3960: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 2a  te3 db test.db.*
3970: 2a 20 73 65 74 20 62 74 20 5b 62 74 72 65 65 5f  * set bt [btree_
3980: 66 72 6f 6d 5f 64 62 20 64 62 5d 0a 2a 2f 0a 73  from_db db].*/.s
3990: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
39a0: 66 72 6f 6d 5f 64 62 28 0a 20 20 76 6f 69 64 20  from_db(.  void 
39b0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
39c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
39d0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
39e0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
39f0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3a00: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3a10: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3a20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3a30: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
3a40: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
3a50: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3a60: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3a70: 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  {.  char zBuf[10
3a80: 30 5d 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  0];.  Tcl_CmdInf
3a90: 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  o info;.  sqlite
3aa0: 33 20 2a 64 62 3b 0a 20 20 42 74 72 65 65 20 2a  3 *db;.  Btree *
3ab0: 70 42 74 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  pBt;.  int iDb =
3ac0: 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21   0;..  if( argc!
3ad0: 3d 32 20 26 26 20 61 72 67 63 21 3d 33 20 29 7b  =2 && argc!=3 ){
3ae0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3af0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3b00: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3b10: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3b20: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
3b30: 2d 48 41 4e 44 4c 45 20 3f 4e 3f 5c 22 22 2c 20  -HANDLE ?N?\"", 
3b40: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
3b50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
3b60: 20 69 66 28 20 31 21 3d 54 63 6c 5f 47 65 74 43   if( 1!=Tcl_GetC
3b70: 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
3b80: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 69 6e 66  p, argv[1], &inf
3b90: 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
3ba0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3bb0: 70 2c 20 22 4e 6f 20 73 75 63 68 20 64 62 2d 68  p, "No such db-h
3bc0: 61 6e 64 6c 65 3a 20 5c 22 22 2c 20 61 72 67 76  andle: \"", argv
3bd0: 5b 31 5d 2c 20 22 5c 22 22 2c 20 30 29 3b 0a 20  [1], "\"", 0);. 
3be0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3bf0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ROR;.  }.  if( a
3c00: 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20 69 44  rgc==3 ){.    iD
3c10: 62 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 32 5d  b = atoi(argv[2]
3c20: 29 3b 0a 20 20 7d 0a 0a 20 20 64 62 20 3d 20 2a  );.  }..  db = *
3c30: 28 28 73 71 6c 69 74 65 33 20 2a 2a 29 69 6e 66  ((sqlite3 **)inf
3c40: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
3c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  ;.  assert( db )
3c60: 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61  ;..  pBt = db->a
3c70: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 73  Db[iDb].pBt;.  s
3c80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3c90: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
3ca0: 75 66 2c 20 22 25 70 22 2c 20 70 42 74 29 3b 0a  uf, "%p", pBt);.
3cb0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
3cc0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 54 43  interp, zBuf, TC
3cd0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72  L_VOLATILE);.  r
3ce0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3cf0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
3d00: 62 74 72 65 65 5f 69 73 6d 65 6d 64 62 20 49 44  btree_ismemdb ID
3d10: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
3d20: 75 65 20 69 66 20 74 68 65 20 42 2d 54 72 65 65  ue if the B-Tree
3d30: 20 69 73 20 69 6e 2d 6d 65 6d 6f 72 79 2e 0a 2a   is in-memory..*
3d40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
3d50: 65 65 5f 69 73 6d 65 6d 64 62 28 0a 20 20 76 6f  ee_ismemdb(.  vo
3d60: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3d70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3d80: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3d90: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3da0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3db0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3dc0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3dd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3de0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3df0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
3e00: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3e10: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3e20: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
3e30: 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  t;.  int res;.. 
3e40: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
3e50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3e60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3e70: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
3e80: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
3e90: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
3ea0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
3eb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3ec0: 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  }.  pBt = sqlite
3ed0: 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 61  3TestTextToPtr(a
3ee0: 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74  rgv[1]);.  sqlit
3ef0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
3f00: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  Bt->db->mutex);.
3f10: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
3f20: 74 65 72 28 70 42 74 29 3b 0a 20 20 72 65 73 20  ter(pBt);.  res 
3f30: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
3f40: 4d 65 6d 64 62 28 73 71 6c 69 74 65 33 42 74 72  Memdb(sqlite3Btr
3f50: 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
3f60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
3f70: 76 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  ve(pBt);.  sqlit
3f80: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
3f90: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  Bt->db->mutex);.
3fa0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
3fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
3fc0: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73  ewBooleanObj(res
3fd0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
3fe0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
3ff0: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
4000: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
4010: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
4020: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33  .int Sqlitetest3
4030: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
4040: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74 61   *interp){.  sta
4050: 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
4060: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4070: 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20      Tcl_CmdProc 
4080: 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64  *xProc;.  } aCmd
4090: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 62  [] = {.     { "b
40a0: 74 72 65 65 5f 6f 70 65 6e 22 2c 20 20 20 20 20  tree_open",     
40b0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
40c0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6f 70  mdProc*)btree_op
40d0: 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  en              
40e0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
40f0: 65 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20  e_close",       
4100: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
4110: 72 6f 63 2a 29 62 74 72 65 65 5f 63 6c 6f 73 65  roc*)btree_close
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
4130: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 62  .     { "btree_b
4140: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
4150: 22 2c 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  ",  (Tcl_CmdProc
4160: 2a 29 62 74 72 65 65 5f 62 65 67 69 6e 5f 74 72  *)btree_begin_tr
4170: 61 6e 73 61 63 74 69 6f 6e 20 20 7d 2c 0a 20 20  ansaction  },.  
4180: 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61 67 65     { "btree_page
4190: 72 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20 20  r_stats",       
41a0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
41b0: 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61 74 73  tree_pager_stats
41c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
41d0: 7b 20 22 62 74 72 65 65 5f 63 75 72 73 6f 72 22  { "btree_cursor"
41e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
41f0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
4200: 65 5f 63 75 72 73 6f 72 20 20 20 20 20 20 20 20  e_cursor        
4210: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
4220: 62 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73  btree_close_curs
4230: 6f 72 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  or",       (Tcl_
4240: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63  CmdProc*)btree_c
4250: 6c 6f 73 65 5f 63 75 72 73 6f 72 20 20 20 20 20  lose_cursor     
4260: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
4270: 65 65 5f 6e 65 78 74 22 2c 20 20 20 20 20 20 20  ee_next",       
4280: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
4290: 50 72 6f 63 2a 29 62 74 72 65 65 5f 6e 65 78 74  Proc*)btree_next
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
42b0: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
42c0: 65 6f 66 22 2c 20 20 20 20 20 20 20 20 20 20 20  eof",           
42d0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
42e0: 63 2a 29 62 74 72 65 65 5f 65 6f 66 20 20 20 20  c*)btree_eof    
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4300: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61 79      { "btree_pay
4310: 6c 6f 61 64 5f 73 69 7a 65 22 2c 20 20 20 20 20  load_size",     
4320: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
4330: 62 74 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 69  btree_payload_si
4340: 7a 65 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ze       },.    
4350: 20 7b 20 22 62 74 72 65 65 5f 66 69 72 73 74 22   { "btree_first"
4360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
4370: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
4380: 65 65 5f 66 69 72 73 74 20 20 20 20 20 20 20 20  ee_first        
4390: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
43a0: 22 62 74 72 65 65 5f 76 61 72 69 6e 74 5f 74 65  "btree_varint_te
43b0: 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
43c0: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
43d0: 76 61 72 69 6e 74 5f 74 65 73 74 20 20 20 20 20  varint_test     
43e0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
43f0: 72 65 65 5f 66 72 6f 6d 5f 64 62 22 2c 20 20 20  ree_from_db",   
4400: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
4410: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 66 72 6f  dProc*)btree_fro
4420: 6d 5f 64 62 20 20 20 20 20 20 20 20 20 20 20 20  m_db            
4430: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
4440: 5f 69 73 6d 65 6d 64 62 22 2c 20 20 20 20 20 20  _ismemdb",      
4450: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
4460: 6f 63 2a 29 62 74 72 65 65 5f 69 73 6d 65 6d 64  oc*)btree_ismemd
4470: 62 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  b            }. 
4480: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   };.  int i;..  
4490: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
44a0: 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  f(aCmd)/sizeof(a
44b0: 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
44c0: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d     Tcl_CreateCom
44d0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d  mand(interp, aCm
44e0: 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64  d[i].zName, aCmd
44f0: 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29  [i].xProc, 0, 0)
4500: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4510: 54 43 4c 5f 4f 4b 3b 0a 7d 0a                    TCL_OK;.}.