/ Hex Artifact Content
Login

Artifact f5328839e29631ed9eef8674994ad7341b2de59b:


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 39 35 20 32 30 30 38 2f 30 34 2f 32 34 20 31  .95 2008/04/24 1
0240: 39 3a 31 35 3a 31 30 20 73 68 61 6e 65 20 45 78  9:15:10 shane Ex
0250: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0260: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0270: 6e 63 6c 75 64 65 20 22 62 74 72 65 65 49 6e 74  nclude "btreeInt
0280: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63  .h".#include "tc
0290: 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  l.h".#include <s
02a0: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
02b0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
02c0: 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 61 6e  .** Interpret an
02d0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 6e 75   SQLite error nu
02e0: 6d 62 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63  mber.*/.static c
02f0: 68 61 72 20 2a 65 72 72 6f 72 4e 61 6d 65 28 69  har *errorName(i
0300: 6e 74 20 72 63 29 7b 0a 20 20 63 68 61 72 20 2a  nt rc){.  char *
0310: 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28  zName;.  switch(
0320: 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
0330: 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20  SQLITE_OK:      
0340: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0350: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
0360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0370: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20   SQLITE_ERROR:  
0380: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0390: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
03a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
03b0: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
03c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
03d0: 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20  LITE_PERM";     
03e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
03f0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
0400: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0410: 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20  QLITE_ABORT";   
0420: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0430: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
0440: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0450: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
0460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0470: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
0480: 4d 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  M:      zName = 
0490: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20  "SQLITE_NOMEM"; 
04a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
04b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
04c0: 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d 65 20 3d  DONLY:   zName =
04d0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
04e0: 59 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  Y";    break;.  
04f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0500: 54 45 52 52 55 50 54 3a 20 20 7a 4e 61 6d 65 20  TERRUPT:  zName 
0510: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  = "SQLITE_INTERR
0520: 55 50 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  UPT";   break;. 
0530: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
0540: 4f 45 52 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OERR:      zName
0550: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
0560: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0570: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0580: 43 4f 52 52 55 50 54 3a 20 20 20 20 7a 4e 61 6d  CORRUPT:    zNam
0590: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
05a0: 55 50 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  UPT";     break;
05b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
05c0: 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a 4e 61  _FULL:       zNa
05d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c  me = "SQLITE_FUL
05e0: 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  L";        break
05f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0600: 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 4e  E_CANTOPEN:   zN
0610: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
0620: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62 72 65 61  NTOPEN";    brea
0630: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0640: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 7a  TE_PROTOCOL:   z
0650: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
0660: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 62 72 65  ROTOCOL";    bre
0670: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0680: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
0690: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
06a0: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 62 72  EMPTY";       br
06b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
06c0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20  LITE_LOCKED:    
06d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
06e0: 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 62  _LOCKED";      b
06f0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
0700: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
0710: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0720: 45 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20  E_Unknown";     
0730: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
0740: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
0750: 0a 2a 2a 20 41 20 62 6f 67 75 73 20 73 71 6c 69  .** A bogus sqli
0760: 74 65 33 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  te3 connection s
0770: 74 72 75 63 74 75 72 65 20 66 6f 72 20 75 73 65  tructure for use
0780: 20 69 6e 20 74 68 65 20 62 74 72 65 65 0a 2a 2a   in the btree.**
0790: 20 74 65 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69   tests..*/.stati
07a0: 63 20 73 71 6c 69 74 65 33 20 73 44 62 3b 0a 73  c sqlite3 sDb;.s
07b0: 74 61 74 69 63 20 69 6e 74 20 6e 52 65 66 53 71  tatic int nRefSq
07c0: 6c 69 74 65 33 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  lite3 = 0;../*.*
07d0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
07e0: 5f 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45 20 4e  _open FILENAME N
07f0: 43 41 43 48 45 20 46 4c 41 47 53 0a 2a 2a 0a 2a  CACHE FLAGS.**.*
0800: 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
0810: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
0820: 69 6e 74 20 62 74 72 65 65 5f 6f 70 65 6e 28 0a  int btree_open(.
0830: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
0840: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
0850: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
0860: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
0870: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
0880: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
0890: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
08a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
08b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
08c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
08d0: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
08e0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
08f0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65  nt */.){.  Btree
0900: 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 2c   *pBt;.  int rc,
0910: 20 6e 43 61 63 68 65 2c 20 66 6c 61 67 73 3b 0a   nCache, flags;.
0920: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
0930: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
0940: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
0950: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0960: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
0970: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
0980: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
0990: 46 49 4c 45 4e 41 4d 45 20 4e 43 41 43 48 45 20  FILENAME NCACHE 
09a0: 46 4c 41 47 53 5c 22 22 2c 20 30 29 3b 0a 20 20  FLAGS\"", 0);.  
09b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
09c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
09d0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
09e0: 20 61 72 67 76 5b 32 5d 2c 20 26 6e 43 61 63 68   argv[2], &nCach
09f0: 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
0a00: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
0a10: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
0a20: 61 72 67 76 5b 33 5d 2c 20 26 66 6c 61 67 73 29  argv[3], &flags)
0a30: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
0a40: 52 4f 52 3b 0a 20 20 6e 52 65 66 53 71 6c 69 74  ROR;.  nRefSqlit
0a50: 65 33 2b 2b 3b 0a 20 20 69 66 28 20 6e 52 65 66  e3++;.  if( nRef
0a60: 53 71 6c 69 74 65 33 3d 3d 31 20 29 7b 0a 20 20  Sqlite3==1 ){.  
0a70: 20 20 73 44 62 2e 70 56 66 73 20 3d 20 73 71 6c    sDb.pVfs = sql
0a80: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
0a90: 3b 0a 20 20 20 20 73 44 62 2e 6d 75 74 65 78 20  ;.    sDb.mutex 
0aa0: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
0ab0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
0ac0: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
0ad0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
0ae0: 5f 65 6e 74 65 72 28 73 44 62 2e 6d 75 74 65 78  _enter(sDb.mutex
0af0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
0b00: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 61  lite3BtreeOpen(a
0b10: 72 67 76 5b 31 5d 2c 20 26 73 44 62 2c 20 26 70  rgv[1], &sDb, &p
0b20: 42 74 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20  Bt, flags,.     
0b30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
0b40: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
0b50: 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
0b60: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
0b70: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
0b80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
0b90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0ba0: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
0bb0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
0bc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0bd0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
0be0: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 70  eeSetCacheSize(p
0bf0: 42 74 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 73  Bt, nCache);.  s
0c00: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
0c10: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
0c20: 75 66 2c 22 25 70 22 2c 20 70 42 74 29 3b 0a 20  uf,"%p", pBt);. 
0c30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0c40: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0c50: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
0c60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
0c70: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63 6c 6f  age:   btree_clo
0c80: 73 65 20 49 44 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73  se ID.**.** Clos
0c90: 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  e the given data
0ca0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
0cb0: 69 6e 74 20 62 74 72 65 65 5f 63 6c 6f 73 65 28  int btree_close(
0cc0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
0cd0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
0ce0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
0cf0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0d00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
0d10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
0d20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
0d30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0d40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
0d50: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0d60: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
0d70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
0d80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
0d90: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e *pBt;.  int rc
0da0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
0db0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
0dc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0dd0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
0de0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
0df0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
0e00: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
0e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0e20: 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c  .  }.  pBt = sql
0e30: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
0e40: 67 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[1]);.  rc = s
0e50: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
0e60: 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21  (pBt);.  if( rc!
0e70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0e80: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
0e90: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
0ea0: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
0eb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0ec0: 4f 52 3b 0a 20 20 7d 0a 20 20 6e 52 65 66 53 71  OR;.  }.  nRefSq
0ed0: 6c 69 74 65 33 2d 2d 3b 0a 20 20 69 66 28 20 6e  lite3--;.  if( n
0ee0: 52 65 66 53 71 6c 69 74 65 33 3d 3d 30 20 29 7b  RefSqlite3==0 ){
0ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
0f00: 65 78 5f 6c 65 61 76 65 28 73 44 62 2e 6d 75 74  ex_leave(sDb.mut
0f10: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
0f20: 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 44 62 2e  _mutex_free(sDb.
0f30: 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 44 62 2e  mutex);.    sDb.
0f40: 6d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 73  mutex = 0;.    s
0f50: 44 62 2e 70 56 66 73 20 3d 20 30 3b 0a 20 20 7d  Db.pVfs = 0;.  }
0f60: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
0f70: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
0f80: 65 3a 20 20 20 62 74 72 65 65 5f 62 65 67 69 6e  e:   btree_begin
0f90: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20 49 44 0a  _transaction ID.
0fa0: 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  **.** Start a ne
0fb0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  w transaction.*/
0fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
0fd0: 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  e_begin_transact
0fe0: 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ion(.  void *Not
0ff0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1000: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1010: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1020: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1030: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1040: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1060: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1070: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
1080: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
1090: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
10a0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
10b0: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
10c0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
10d0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10f0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1100: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1110: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
1120: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
1130: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1140: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d  ROR;.  }.  pBt =
1150: 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74   sqlite3TextToPt
1160: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71  r(argv[1]);.  sq
1170: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1180: 70 42 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pBt);.  rc = sql
1190: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
11a0: 61 6e 73 28 70 42 74 2c 20 31 29 3b 0a 20 20 73  ans(pBt, 1);.  s
11b0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11c0: 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21  (pBt);.  if( rc!
11d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11f0: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
1200: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1210: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1220: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
1230: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1240: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
1250: 5f 72 6f 6c 6c 62 61 63 6b 20 49 44 0a 2a 2a 0a  _rollback ID.**.
1260: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 63 68 61 6e  ** Rollback chan
1270: 67 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ges.*/.static in
1280: 74 20 62 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b  t btree_rollback
1290: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
12a0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
12b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
12c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
12d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
12e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
12f0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1310: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1320: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1330: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
1340: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1350: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72  ment */.){.  Btr
1360: 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72  ee *pBt;.  int r
1370: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
1380: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1390: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
13a0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
13b0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
13c0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
13d0: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
13e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13f0: 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71  ;.  }.  pBt = sq
1400: 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61  lite3TextToPtr(a
1410: 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74  rgv[1]);.  sqlit
1420: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1430: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1440: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
1450: 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt);.  sqlite3Bt
1460: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
1470: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1480: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
1490: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14a0: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
14b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
14c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
14d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
14e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
14f0: 20 20 20 62 74 72 65 65 5f 63 6f 6d 6d 69 74 20     btree_commit 
1500: 49 44 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  ID.**.** Commit 
1510: 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2f 0a 73  all changes.*/.s
1520: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
1530: 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a  commit(.  void *
1540: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
1550: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1560: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1570: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1580: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1590: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
15a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
15c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
15d0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
15e0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
15f0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
1600: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
1610: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
1620: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1630: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1640: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1650: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1660: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1670: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
1680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
16a0: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
16b0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
16c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16d0: 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20  er(pBt);.  rc = 
16e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
16f0: 69 74 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  it(pBt);.  sqlit
1700: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1710: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
1730: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1740: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
1750: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
1760: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1770: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1780: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1790: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 62 65 67  age:   btree_beg
17a0: 69 6e 5f 73 74 61 74 65 6d 65 6e 74 20 49 44 0a  in_statement ID.
17b0: 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  **.** Start a ne
17c0: 77 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  w statement tran
17d0: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  saction.*/.stati
17e0: 63 20 69 6e 74 20 62 74 72 65 65 5f 62 65 67 69  c int btree_begi
17f0: 6e 5f 73 74 61 74 65 6d 65 6e 74 28 0a 20 20 76  n_statement(.  v
1800: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1810: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1820: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1830: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1840: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1850: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1860: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1870: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1880: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
18a0: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
18b0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
18c0: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
18d0: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
18e0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
18f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1900: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1910: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1920: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1930: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22  ],.       " ID\"
1940: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1960: 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
1970: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31  TextToPtr(argv[1
1980: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ]);.  sqlite3Btr
1990: 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
19a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
19b0: 65 42 65 67 69 6e 53 74 6d 74 28 70 42 74 29 3b  eBeginStmt(pBt);
19c0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19d0: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 69 66 28  eave(pBt);.  if(
19e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19f0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65  Result(interp, e
1a10: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
1a20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a30: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1a40: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a50: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
1a60: 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b 5f 73 74  tree_rollback_st
1a70: 61 74 65 6d 65 6e 74 20 49 44 0a 2a 2a 0a 2a 2a  atement ID.**.**
1a80: 20 52 6f 6c 6c 62 61 63 6b 20 63 68 61 6e 67 65   Rollback change
1a90: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1aa0: 62 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b 5f 73  btree_rollback_s
1ab0: 74 61 74 65 6d 65 6e 74 28 0a 20 20 76 6f 69 64  tatement(.  void
1ac0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1ad0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ae0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1af0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1b00: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1b10: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1b20: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1b30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1b40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
1b50: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
1b60: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1b70: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1b80: 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1b90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1ba0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1bb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1bc0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1bd0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1be0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
1bf0: 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20         " ID\"", 
1c00: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1c20: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78  pBt = sqlite3Tex
1c30: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
1c40: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1c50: 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20  nter(pBt);.  rc 
1c60: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
1c70: 6c 6c 62 61 63 6b 53 74 6d 74 28 70 42 74 29 3b  llbackStmt(pBt);
1c80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c90: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 69 66 28  eave(pBt);.  if(
1ca0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cb0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1cc0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65  Result(interp, e
1cd0: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
1ce0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1cf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1d00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
1d20: 74 72 65 65 5f 63 6f 6d 6d 69 74 5f 73 74 61 74  tree_commit_stat
1d30: 65 6d 65 6e 74 20 49 44 0a 2a 2a 0a 2a 2a 20 43  ement ID.**.** C
1d40: 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
1d50: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1d60: 62 74 72 65 65 5f 63 6f 6d 6d 69 74 5f 73 74 61  btree_commit_sta
1d70: 74 65 6d 65 6e 74 28 0a 20 20 76 6f 69 64 20 2a  tement(.  void *
1d80: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
1d90: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1da0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1db0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1dc0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1dd0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
1de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1df0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1e00: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
1e10: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
1e20: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
1e30: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
1e40: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
1e50: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
1e60: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1e70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1ea0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1eb0: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
1ec0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ed0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
1ee0: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
1ef0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
1f00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1f10: 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20  er(pBt);.  rc = 
1f20: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1f30: 69 74 53 74 6d 74 28 70 42 74 29 3b 0a 20 20 73  itStmt(pBt);.  s
1f40: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f50: 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21  (pBt);.  if( rc!
1f60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f80: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
1f90: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1fa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1fb0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
1fc0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1fd0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
1fe0: 5f 63 72 65 61 74 65 5f 74 61 62 6c 65 20 49 44  _create_table ID
1ff0: 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 43 72 65   FLAGS.**.** Cre
2000: 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ate a new table 
2010: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
2020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
2030: 72 65 65 5f 63 72 65 61 74 65 5f 74 61 62 6c 65  ree_create_table
2040: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2050: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2060: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2070: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2080: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2090: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
20a0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
20b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
20d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
20e0: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
20f0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2100: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72  ment */.){.  Btr
2110: 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72  ee *pBt;.  int r
2120: 63 2c 20 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  c, iTable, flags
2130: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
2140: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
2150: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2160: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2170: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2180: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2190: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
21a0: 20 49 44 20 46 4c 41 47 53 5c 22 22 2c 20 30 29   ID FLAGS\"", 0)
21b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
21c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
21d0: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
21e0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
21f0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
2200: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
2210: 20 26 66 6c 61 67 73 29 20 29 20 72 65 74 75 72   &flags) ) retur
2220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
2230: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2240: 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  (pBt);.  rc = sq
2250: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
2260: 54 61 62 6c 65 28 70 42 74 2c 20 26 69 54 61 62  Table(pBt, &iTab
2270: 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71  le, flags);.  sq
2280: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2290: 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pBt);.  if( rc!=
22a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22c0: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
22d0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
22e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22f0: 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
2300: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2310: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2320: 64 22 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 54  d", iTable);.  T
2330: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2340: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
2350: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2360: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2370: 65 3a 20 20 20 62 74 72 65 65 5f 64 72 6f 70 5f  e:   btree_drop_
2380: 74 61 62 6c 65 20 49 44 20 54 41 42 4c 45 4e 55  table ID TABLENU
2390: 4d 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  M.**.** Delete a
23a0: 6e 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 66  n entire table f
23b0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
23c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
23d0: 74 72 65 65 5f 64 72 6f 70 5f 74 61 62 6c 65 28  tree_drop_table(
23e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
23f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2400: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2410: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2420: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2430: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2440: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2450: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2460: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
2490: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
24a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
24b0: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 54  e *pBt;.  int iT
24c0: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  able;.  int rc;.
24d0: 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 31 3b 0a    int notUsed1;.
24e0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
24f0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2500: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2510: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2520: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2530: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
2540: 20 54 41 42 4c 45 4e 55 4d 5c 22 22 2c 20 30 29   TABLENUM\"", 0)
2550: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2560: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
2570: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
2580: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
2590: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
25a0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
25b0: 20 26 69 54 61 62 6c 65 29 20 29 20 72 65 74 75   &iTable) ) retu
25c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25d0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
25e0: 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20 73  r(pBt);.  rc = s
25f0: 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
2600: 61 62 6c 65 28 70 42 74 2c 20 69 54 61 62 6c 65  able(pBt, iTable
2610: 2c 20 26 6e 6f 74 55 73 65 64 31 29 3b 0a 20 20  , &notUsed1);.  
2620: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2630: 65 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63  e(pBt);.  if( rc
2640: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2650: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2660: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
2670: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
2680: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2690: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
26a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
26b0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65  ** Usage:   btre
26c0: 65 5f 63 6c 65 61 72 5f 74 61 62 6c 65 20 49 44  e_clear_table ID
26d0: 20 54 41 42 4c 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20   TABLENUM.**.** 
26e0: 52 65 6d 6f 76 65 20 61 6c 6c 20 65 6e 74 72 69  Remove all entri
26f0: 65 73 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  es from the give
2700: 6e 20 74 61 62 6c 65 20 62 75 74 20 6b 65 65 70  n table but keep
2710: 20 74 68 65 20 74 61 62 6c 65 20 61 72 6f 75 6e   the table aroun
2720: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2730: 20 62 74 72 65 65 5f 63 6c 65 61 72 5f 74 61 62   btree_clear_tab
2740: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  le(.  void *NotU
2750: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
2760: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2770: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2780: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2790: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
27a0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27c0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
27d0: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
27e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a  r **argv      /*
27f0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
2800: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42  gument */.){.  B
2810: 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74  tree *pBt;.  int
2820: 20 69 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72   iTable;.  int r
2830: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  c;.  if( argc!=3
2840: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2850: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2860: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2870: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2880: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
2890: 20 49 44 20 54 41 42 4c 45 4e 55 4d 5c 22 22 2c   ID TABLENUM\"",
28a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
28b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
28c0: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65   pBt = sqlite3Te
28d0: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29  xtToPtr(argv[1])
28e0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
28f0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
2900: 32 5d 2c 20 26 69 54 61 62 6c 65 29 20 29 20 72  2], &iTable) ) r
2910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2920: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
2930: 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20  nter(pBt);.  rc 
2940: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
2950: 65 61 72 54 61 62 6c 65 28 70 42 74 2c 20 69 54  earTable(pBt, iT
2960: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
2970: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
2980: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2990: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
29a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29b0: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
29c0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
29d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29e0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
29f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2a00: 65 3a 20 20 20 62 74 72 65 65 5f 67 65 74 5f 6d  e:   btree_get_m
2a10: 65 74 61 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74  eta ID.**.** Ret
2a20: 75 72 6e 20 6d 65 74 61 20 64 61 74 61 0a 2a 2f  urn meta data.*/
2a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2a40: 65 5f 67 65 74 5f 6d 65 74 61 28 0a 20 20 76 6f  e_get_meta(.  vo
2a50: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2a60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a70: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2a80: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2a90: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2aa0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2ab0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2ac0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ad0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2ae0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
2af0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b00: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b10: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
2b20: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
2b30: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63  nt i;.  if( argc
2b40: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
2b50: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2b60: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2b70: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2b80: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
2b90: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
2ba0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2bb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d  ROR;.  }.  pBt =
2bc0: 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74   sqlite3TextToPt
2bd0: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 66 6f  r(argv[1]);.  fo
2be0: 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f  r(i=0; i<SQLITE_
2bf0: 4e 5f 42 54 52 45 45 5f 4d 45 54 41 3b 20 69 2b  N_BTREE_META; i+
2c00: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  +){.    char zBu
2c10: 66 5b 33 30 5d 3b 0a 20 20 20 20 75 6e 73 69 67  f[30];.    unsig
2c20: 6e 65 64 20 69 6e 74 20 76 3b 0a 20 20 20 20 73  ned int v;.    s
2c30: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2c40: 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
2c50: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
2c60: 65 74 61 28 70 42 74 2c 20 69 2c 20 26 76 29 3b  eta(pBt, i, &v);
2c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
2c80: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20  eLeave(pBt);.   
2c90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ca0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
2cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2cc0: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
2cd0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  c), 0);.      re
2ce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2cf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2d00: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2d10: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 22 25  f(zBuf), zBuf,"%
2d20: 64 22 2c 76 29 3b 0a 20 20 20 20 54 63 6c 5f 41  d",v);.    Tcl_A
2d30: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2d40: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  erp, zBuf);.  }.
2d50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2d60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2d70: 20 20 20 62 74 72 65 65 5f 75 70 64 61 74 65 5f     btree_update_
2d80: 6d 65 74 61 20 49 44 20 4d 45 54 41 44 41 54 41  meta ID METADATA
2d90: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ....**.** Return
2da0: 20 6d 65 74 61 20 64 61 74 61 0a 2a 2f 0a 73 74   meta data.*/.st
2db0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 75  atic int btree_u
2dc0: 70 64 61 74 65 5f 6d 65 74 61 28 0a 20 20 76 6f  pdate_meta(.  vo
2dd0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2de0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2df0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2e00: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2e10: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2e20: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2e30: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2e40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e50: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2e60: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
2e70: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2e80: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2e90: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
2ea0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
2eb0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 61 4d 65 74  nt i;.  int aMet
2ec0: 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  a[SQLITE_N_BTREE
2ed0: 5f 4d 45 54 41 5d 3b 0a 0a 20 20 69 66 28 20 61  _META];..  if( a
2ee0: 72 67 63 21 3d 32 2b 53 51 4c 49 54 45 5f 4e 5f  rgc!=2+SQLITE_N_
2ef0: 42 54 52 45 45 5f 4d 45 54 41 20 29 7b 0a 20 20  BTREE_META ){.  
2f00: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
2f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2f20: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
2f30: 66 29 2c 20 7a 42 75 66 2c 22 25 64 22 2c 53 51  f), zBuf,"%d",SQ
2f40: 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
2f50: 41 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  A);.    Tcl_Appe
2f60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2f70: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2f80: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2f90: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
2fa0: 20 49 44 20 4d 45 54 41 44 41 54 41 2e 2e 2e 5c   ID METADATA...\
2fb0: 22 20 28 4d 45 54 41 44 41 54 41 20 69 73 20 22  " (METADATA is "
2fc0: 2c 20 7a 42 75 66 2c 20 22 20 69 6e 74 65 67 65  , zBuf, " intege
2fd0: 72 73 29 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  rs)", 0);.    re
2fe0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ff0: 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69    }.  pBt = sqli
3000: 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67  te3TextToPtr(arg
3010: 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 31  v[1]);.  for(i=1
3020: 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52  ; i<SQLITE_N_BTR
3030: 45 45 5f 4d 45 54 41 3b 20 69 2b 2b 29 7b 0a 20  EE_META; i++){. 
3040: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
3050: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
3060: 2b 32 5d 2c 20 26 61 4d 65 74 61 5b 69 5d 29 20  +2], &aMeta[i]) 
3070: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3080: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
3090: 31 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 42 54  1; i<SQLITE_N_BT
30a0: 52 45 45 5f 4d 45 54 41 3b 20 69 2b 2b 29 7b 0a  REE_META; i++){.
30b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
30c0: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
30d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30e0: 65 55 70 64 61 74 65 4d 65 74 61 28 70 42 74 2c  eUpdateMeta(pBt,
30f0: 20 69 2c 20 61 4d 65 74 61 5b 69 5d 29 3b 0a 20   i, aMeta[i]);. 
3100: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
3110: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 69  eave(pBt);.    i
3120: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
3130: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
3140: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3150: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
3160: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
3170: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3190: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
31a0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
31b0: 5f 70 61 67 65 5f 64 75 6d 70 20 49 44 20 50 41  _page_dump ID PA
31c0: 47 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 50 72 69 6e  GENUM.**.** Prin
31d0: 74 20 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20  t a disassembly 
31e0: 6f 66 20 61 20 70 61 67 65 20 6f 6e 20 73 74 61  of a page on sta
31f0: 6e 64 61 72 64 20 6f 75 74 70 75 74 0a 2a 2f 0a  ndard output.*/.
3200: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
3210: 5f 70 61 67 65 5f 64 75 6d 70 28 0a 20 20 76 6f  _page_dump(.  vo
3220: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3230: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3240: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3250: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3260: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3270: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3280: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3290: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
32b0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
32c0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
32d0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
32e0: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
32f0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 3b 0a  t;.  int iPage;.
3300: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
3310: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
3320: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3330: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3340: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3350: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
3360: 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20         " ID\"", 
3370: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
3380: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
3390: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78  pBt = sqlite3Tex
33a0: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
33b0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
33c0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
33d0: 5d 2c 20 26 69 50 61 67 65 29 20 29 20 72 65 74  ], &iPage) ) ret
33e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
33f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3400: 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20  er(pBt);.  rc = 
3410: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
3420: 44 75 6d 70 28 70 42 74 2c 20 69 50 61 67 65 2c  Dump(pBt, iPage,
3430: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
3440: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
3450: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3460: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
3470: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3480: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
3490: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
34a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
34b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
34c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
34d0: 20 20 20 62 74 72 65 65 5f 74 72 65 65 5f 64 75     btree_tree_du
34e0: 6d 70 20 49 44 20 50 41 47 45 4e 55 4d 0a 2a 2a  mp ID PAGENUM.**
34f0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 69 73 61  .** Print a disa
3500: 73 73 65 6d 62 6c 79 20 6f 66 20 61 20 70 61 67  ssembly of a pag
3510: 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68  e and all its ch
3520: 69 6c 64 20 70 61 67 65 73 20 6f 6e 20 73 74 61  ild pages on sta
3530: 6e 64 61 72 64 20 6f 75 74 70 75 74 0a 2a 2f 0a  ndard output.*/.
3540: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
3550: 5f 74 72 65 65 5f 64 75 6d 70 28 0a 20 20 76 6f  _tree_dump(.  vo
3560: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3570: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3580: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3590: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
35a0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
35b0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
35c0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
35d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
35e0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
35f0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
3600: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3610: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3620: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
3630: 74 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 3b 0a  t;.  int iPage;.
3640: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
3650: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
3660: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3670: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3680: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3690: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
36a0: 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20         " ID\"", 
36b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
36c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
36d0: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78  pBt = sqlite3Tex
36e0: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
36f0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
3700: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
3710: 5d 2c 20 26 69 50 61 67 65 29 20 29 20 72 65 74  ], &iPage) ) ret
3720: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3730: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3740: 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20  er(pBt);.  rc = 
3750: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
3760: 44 75 6d 70 28 70 42 74 2c 20 69 50 61 67 65 2c  Dump(pBt, iPage,
3770: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   1);.  sqlite3Bt
3780: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
3790: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37a0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
37b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
37c0: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
37d0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
37e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
37f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
3800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
3810: 20 20 20 62 74 72 65 65 5f 70 61 67 65 72 5f 73     btree_pager_s
3820: 74 61 74 73 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65  tats ID.**.** Re
3830: 74 75 72 6e 73 20 70 61 67 65 72 20 73 74 61 74  turns pager stat
3840: 69 73 74 69 63 73 0a 2a 2f 0a 73 74 61 74 69 63  istics.*/.static
3850: 20 69 6e 74 20 62 74 72 65 65 5f 70 61 67 65 72   int btree_pager
3860: 5f 73 74 61 74 73 28 0a 20 20 76 6f 69 64 20 2a  _stats(.  void *
3870: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
3880: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
3890: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
38a0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
38b0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
38c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
38d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
38e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
38f0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
3900: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3910: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
3920: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
3930: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
3940: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 2a 61   int i;.  int *a
3950: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
3960: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3970: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3980: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
3990: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
39a0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
39b0: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
39c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
39d0: 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71  ;.  }.  pBt = sq
39e0: 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61  lite3TextToPtr(a
39f0: 72 67 76 5b 31 5d 29 3b 0a 20 0a 20 20 2f 2a 20  rgv[1]);. .  /* 
3a00: 4e 6f 72 6d 61 6c 6c 79 20 69 6e 20 74 68 69 73  Normally in this
3a10: 20 66 69 6c 65 2c 20 77 69 74 68 20 61 20 62 2d   file, with a b-
3a20: 74 72 65 65 20 68 61 6e 64 6c 65 20 6f 70 65 6e  tree handle open
3a30: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 20 20  ed using the .  
3a40: 2a 2a 20 5b 62 74 72 65 65 5f 6f 70 65 6e 5d 20  ** [btree_open] 
3a50: 63 6f 6d 6d 61 6e 64 20 69 74 20 69 73 20 73 61  command it is sa
3a60: 66 65 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  fe to call sqlit
3a70: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 64  e3BtreeEnter() d
3a80: 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2a 20 42 75  irectly..  ** Bu
3a90: 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
3aa0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 63 61 6c  is sometimes cal
3ab0: 6c 65 64 20 77 69 74 68 20 61 20 62 74 72 65 65  led with a btree
3ac0: 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64   handle obtained
3ad0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 61 6e 20 6f 70  .  ** from an op
3ae0: 65 6e 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65 63  en SQLite connec
3af0: 74 69 6f 6e 20 28 75 73 69 6e 67 20 5b 62 74 72  tion (using [btr
3b00: 65 65 5f 66 72 6f 6d 5f 64 62 5d 29 2e 20 49 6e  ee_from_db]). In
3b10: 20 74 68 69 73 20 63 61 73 65 0a 20 20 2a 2a 20   this case.  ** 
3b20: 77 65 20 6e 65 65 64 20 74 6f 20 6f 62 74 61 69  we need to obtai
3b30: 6e 20 74 68 65 20 6d 75 74 65 78 20 66 6f 72 20  n the mutex for 
3b40: 74 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  the controlling 
3b50: 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 20 62 65  SQLite handle be
3b60: 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  fore.  ** it is 
3b70: 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 73 71 6c  safe to call sql
3b80: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
3b90: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
3ba0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 42 74  _mutex_enter(pBt
3bb0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  ->db->mutex);.. 
3bc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3bd0: 65 72 28 70 42 74 29 3b 0a 20 20 61 20 3d 20 73  er(pBt);.  a = s
3be0: 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
3bf0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
3c00: 65 72 28 70 42 74 29 29 3b 0a 20 20 66 6f 72 28  er(pBt));.  for(
3c10: 69 3d 30 3b 20 69 3c 31 31 3b 20 69 2b 2b 29 7b  i=0; i<11; i++){
3c20: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
3c30: 20 2a 7a 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20   *zName[] = {.  
3c40: 20 20 20 20 22 72 65 66 22 2c 20 22 70 61 67 65      "ref", "page
3c50: 22 2c 20 22 6d 61 78 22 2c 20 22 73 69 7a 65 22  ", "max", "size"
3c60: 2c 20 22 73 74 61 74 65 22 2c 20 22 65 72 72 22  , "state", "err"
3c70: 2c 0a 20 20 20 20 20 20 22 68 69 74 22 2c 20 22  ,.      "hit", "
3c80: 6d 69 73 73 22 2c 20 22 6f 76 66 6c 22 2c 20 22  miss", "ovfl", "
3c90: 72 65 61 64 22 2c 20 22 77 72 69 74 65 22 0a 20  read", "write". 
3ca0: 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 7a     };.    char z
3cb0: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 54 63  Buf[100];.    Tc
3cc0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
3cd0: 69 6e 74 65 72 70 2c 20 7a 4e 61 6d 65 5b 69 5d  interp, zName[i]
3ce0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
3cf0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
3d00: 42 75 66 29 2c 20 7a 42 75 66 2c 22 25 64 22 2c  Buf), zBuf,"%d",
3d10: 61 5b 69 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 41  a[i]);.    Tcl_A
3d20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3d30: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  erp, zBuf);.  }.
3d40: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
3d50: 61 76 65 28 70 42 74 29 3b 0a 0a 20 20 2f 2a 20  ave(pBt);..  /* 
3d60: 52 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65  Release the mute
3d70: 78 20 6f 6e 20 74 68 65 20 53 51 4c 69 74 65 20  x on the SQLite 
3d80: 68 61 6e 64 6c 65 20 74 68 61 74 20 63 6f 6e 74  handle that cont
3d90: 72 6f 6c 73 20 74 68 69 73 20 62 2d 74 72 65 65  rols this b-tree
3da0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
3db0: 74 65 78 5f 6c 65 61 76 65 28 70 42 74 2d 3e 64  tex_leave(pBt->d
3dc0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
3dd0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
3de0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
3df0: 72 65 65 5f 70 61 67 65 72 5f 72 65 66 5f 64 75  ree_pager_ref_du
3e00: 6d 70 20 49 44 0a 2a 2a 0a 2a 2a 20 50 72 69 6e  mp ID.**.** Prin
3e10: 74 20 6f 75 74 20 61 6c 6c 20 6f 75 74 73 74 61  t out all outsta
3e20: 6e 64 69 6e 67 20 70 61 67 65 73 2e 0a 2a 2f 0a  nding pages..*/.
3e30: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
3e40: 5f 70 61 67 65 72 5f 72 65 66 5f 64 75 6d 70 28  _pager_ref_dump(
3e50: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3e60: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3e70: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3e80: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3e90: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3ea0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3eb0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ed0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3ee0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3ef0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
3f00: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3f10: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
3f20: 65 20 2a 70 42 74 3b 0a 0a 20 20 69 66 28 20 61  e *pBt;..  if( a
3f30: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
3f40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3f50: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3f60: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3f70: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
3f80: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
3f90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3fa0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
3fb0: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
3fc0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 23  oPtr(argv[1]);.#
3fd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3fe0: 54 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  T.  sqlite3Btree
3ff0: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 73 71  Enter(pBt);.  sq
4000: 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d  lite3PagerRefdum
4010: 70 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  p(sqlite3BtreePa
4020: 67 65 72 28 70 42 74 29 29 3b 0a 20 20 73 71 6c  ger(pBt));.  sql
4030: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
4040: 42 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  Bt);.#endif.  re
4050: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4060: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
4070: 74 72 65 65 5f 69 6e 74 65 67 72 69 74 79 5f 63  tree_integrity_c
4080: 68 65 63 6b 20 49 44 20 52 4f 4f 54 20 2e 2e 2e  heck ID ROOT ...
4090: 0a 2a 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f  .**.** Look thro
40a0: 75 67 68 20 65 76 65 72 79 20 70 61 67 65 20 6f  ugh every page o
40b0: 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
40c0: 65 20 66 69 6c 65 20 74 6f 20 76 65 72 69 66 79  e file to verify
40d0: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 66 6f 72 6d   correct.** form
40e0: 61 74 74 69 6e 67 20 61 6e 64 20 6c 69 6e 6b 61  atting and linka
40f0: 67 65 2e 20 20 52 65 74 75 72 6e 20 61 20 6c 69  ge.  Return a li
4100: 6e 65 20 6f 66 20 74 65 78 74 20 66 6f 72 20 65  ne of text for e
4110: 61 63 68 20 70 72 6f 62 6c 65 6d 20 66 6f 75 6e  ach problem foun
4120: 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  d..** Return an 
4130: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 66 20  empty string if 
4140: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
4150: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
4160: 20 62 74 72 65 65 5f 69 6e 74 65 67 72 69 74 79   btree_integrity
4170: 5f 63 68 65 63 6b 28 0a 20 20 76 6f 69 64 20 2a  _check(.  void *
4180: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4190: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
41a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
41b0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
41c0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
41d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
41e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
41f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4200: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
4210: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4220: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4230: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4240: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
4250: 20 69 6e 74 20 6e 52 6f 6f 74 3b 0a 20 20 69 6e   int nRoot;.  in
4260: 74 20 2a 61 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  t *aRoot;.  int 
4270: 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 3b 0a 20  i;.  int nErr;. 
4280: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a   char *zResult;.
4290: 0a 20 20 69 66 28 20 61 72 67 63 3c 33 20 29 7b  .  if( argc<3 ){
42a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
42b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
42c0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
42d0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
42e0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
42f0: 20 52 4f 4f 54 20 2e 2e 2e 5c 22 22 2c 20 30 29   ROOT ...\"", 0)
4300: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4310: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
4320: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
4330: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
4340: 20 6e 52 6f 6f 74 20 3d 20 61 72 67 63 2d 32 3b   nRoot = argc-2;
4350: 0a 20 20 61 52 6f 6f 74 20 3d 20 28 69 6e 74 2a  .  aRoot = (int*
4360: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
4370: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 61 72   sizeof(int)*(ar
4380: 67 63 2d 32 29 20 29 3b 0a 20 20 66 6f 72 28 69  gc-2) );.  for(i
4390: 3d 30 3b 20 69 3c 61 72 67 63 2d 32 3b 20 69 2b  =0; i<argc-2; i+
43a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
43b0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
43c0: 72 67 76 5b 69 2b 32 5d 2c 20 26 61 52 6f 6f 74  rgv[i+2], &aRoot
43d0: 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [i]) ) return TC
43e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 69 66  L_ERROR;.  }.#if
43f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4400: 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
4410: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4420: 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 7a 52 65  nter(pBt);.  zRe
4430: 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 42 74  sult = sqlite3Bt
4440: 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
4450: 6b 28 70 42 74 2c 20 61 52 6f 6f 74 2c 20 6e 52  k(pBt, aRoot, nR
4460: 6f 6f 74 2c 20 31 30 30 30 30 2c 20 26 6e 45 72  oot, 10000, &nEr
4470: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
4480: 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 23 65  eeLeave(pBt);.#e
4490: 6c 73 65 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20  lse.  zResult = 
44a0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  0;.#endif.  sqli
44b0: 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 2a 29  te3_free((void*)
44c0: 61 52 6f 6f 74 29 3b 0a 20 20 69 66 28 20 7a 52  aRoot);.  if( zR
44d0: 65 73 75 6c 74 20 29 7b 0a 20 20 20 20 54 63 6c  esult ){.    Tcl
44e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
44f0: 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20 30  terp, zResult, 0
4500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
4510: 72 65 65 28 7a 52 65 73 75 6c 74 29 3b 20 0a 20  ree(zResult); . 
4520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
4530: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4540: 67 65 3a 20 20 20 62 74 72 65 65 5f 63 75 72 73  ge:   btree_curs
4550: 6f 72 5f 6c 69 73 74 20 49 44 0a 2a 2a 0a 2a 2a  or_list ID.**.**
4560: 20 50 72 69 6e 74 20 69 6e 66 6f 72 6d 61 74 69   Print informati
4570: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 63 75 72  on about all cur
4580: 73 6f 72 73 20 74 6f 20 73 74 61 6e 64 61 72 64  sors to standard
4590: 20 6f 75 74 70 75 74 20 66 6f 72 20 64 65 62 75   output for debu
45a0: 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  gging..*/.static
45b0: 20 69 6e 74 20 62 74 72 65 65 5f 63 75 72 73 6f   int btree_curso
45c0: 72 5f 6c 69 73 74 28 0a 20 20 76 6f 69 64 20 2a  r_list(.  void *
45d0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
45e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
45f0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4600: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
4610: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
4620: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
4630: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4640: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4650: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
4660: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4670: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4680: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4690: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a  .  Btree *pBt;..
46a0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
46b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
46c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
46d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
46e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
46f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
4700: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4710: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4720: 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74   }.  pBt = sqlit
4730: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
4740: 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  [1]);.  sqlite3B
4750: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
4760: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75    sqlite3BtreeCu
4770: 72 73 6f 72 4c 69 73 74 28 70 42 74 29 3b 0a 20  rsorList(pBt);. 
4780: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4790: 76 65 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ve(pBt);.  retur
47a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
47b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
47c0: 74 72 65 65 5f 63 75 72 73 6f 72 20 49 44 20 54  tree_cursor ID T
47d0: 41 42 4c 45 4e 55 4d 20 57 52 49 54 45 41 42 4c  ABLENUM WRITEABL
47e0: 45 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  E.**.** Create a
47f0: 20 6e 65 77 20 63 75 72 73 6f 72 2e 20 20 52 65   new cursor.  Re
4800: 74 75 72 6e 20 74 68 65 20 49 44 20 66 6f 72 20  turn the ID for 
4810: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  the cursor..*/.s
4820: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
4830: 63 75 72 73 6f 72 28 0a 20 20 76 6f 69 64 20 2a  cursor(.  void *
4840: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4850: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4860: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4870: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
4880: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
4890: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
48a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
48b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
48c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
48d0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
48e0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
48f0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4900: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
4910: 20 69 6e 74 20 69 54 61 62 6c 65 3b 0a 20 20 42   int iTable;.  B
4920: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
4930: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 77   int rc;.  int w
4940: 72 46 6c 61 67 3b 0a 20 20 63 68 61 72 20 7a 42  rFlag;.  char zB
4950: 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61  uf[30];..  if( a
4960: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  rgc!=4 ){.    Tc
4970: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4980: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4990: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
49a0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
49b0: 20 20 20 20 20 22 20 49 44 20 54 41 42 4c 45 4e       " ID TABLEN
49c0: 55 4d 20 57 52 49 54 45 41 42 4c 45 5c 22 22 2c  UM WRITEABLE\"",
49d0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
49e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
49f0: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65   pBt = sqlite3Te
4a00: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29  xtToPtr(argv[1])
4a10: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
4a20: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
4a30: 32 5d 2c 20 26 69 54 61 62 6c 65 29 20 29 20 72  2], &iTable) ) r
4a40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4a50: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
4a60: 6f 6c 65 61 6e 28 69 6e 74 65 72 70 2c 20 61 72  olean(interp, ar
4a70: 67 76 5b 33 5d 2c 20 26 77 72 46 6c 61 67 29 20  gv[3], &wrFlag) 
4a80: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4a90: 4f 52 3b 0a 20 20 70 43 75 72 20 3d 20 28 42 74  OR;.  pCur = (Bt
4aa0: 43 75 72 73 6f 72 20 2a 29 63 6b 61 6c 6c 6f 63  Cursor *)ckalloc
4ab0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72  (sqlite3BtreeCur
4ac0: 73 6f 72 53 69 7a 65 28 29 29 3b 0a 20 20 6d 65  sorSize());.  me
4ad0: 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73 71  mset(pCur, 0, sq
4ae0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
4af0: 53 69 7a 65 28 29 29 3b 0a 20 20 73 71 6c 69 74  Size());.  sqlit
4b00: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
4b10: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
4b20: 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 42 74  3BtreeCursor(pBt
4b30: 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
4b40: 2c 20 30 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  , 0, pCur);.  sq
4b50: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
4b60: 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pBt);.  if( rc )
4b70: 7b 0a 20 20 20 20 63 6b 66 72 65 65 28 28 63 68  {.    ckfree((ch
4b80: 61 72 20 2a 29 70 43 75 72 29 3b 0a 20 20 20 20  ar *)pCur);.    
4b90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4ba0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
4bb0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
4bc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4bd0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
4be0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
4bf0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 22 25 70 22  zBuf), zBuf,"%p"
4c00: 2c 20 70 43 75 72 29 3b 0a 20 20 54 63 6c 5f 41  , pCur);.  Tcl_A
4c10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4c20: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
4c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4c50: 3a 20 20 20 62 74 72 65 65 5f 63 6c 6f 73 65 5f  :   btree_close_
4c60: 63 75 72 73 6f 72 20 49 44 0a 2a 2a 0a 2a 2a 20  cursor ID.**.** 
4c70: 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 6f  Close a cursor o
4c80: 70 65 6e 65 64 20 75 73 69 6e 67 20 62 74 72 65  pened using btre
4c90: 65 5f 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  e_cursor..*/.sta
4ca0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 63 6c  tic int btree_cl
4cb0: 6f 73 65 5f 63 75 72 73 6f 72 28 0a 20 20 76 6f  ose_cursor(.  vo
4cc0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4ce0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4cf0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4d00: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4d10: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4d20: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4d30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4d40: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4d50: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
4d60: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
4d70: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
4d80: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4d90: 2a 70 43 75 72 3b 0a 20 20 42 74 72 65 65 20 2a  *pCur;.  Btree *
4da0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pBt;.  int rc;..
4db0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
4dc0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
4dd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
4de0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
4df0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
4e00: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
4e10: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4e20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4e30: 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
4e40: 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67  te3TextToPtr(arg
4e50: 76 5b 31 5d 29 3b 0a 20 20 70 42 74 20 3d 20 70  v[1]);.  pBt = p
4e60: 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 73  Cur->pBtree;.  s
4e70: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
4e80: 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  (pBt);.  rc = sq
4e90: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
4ea0: 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 73  ursor(pCur);.  s
4eb0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
4ec0: 28 70 42 74 29 3b 0a 20 20 63 6b 66 72 65 65 28  (pBt);.  ckfree(
4ed0: 28 63 68 61 72 20 2a 29 70 43 75 72 29 3b 0a 20  (char *)pCur);. 
4ee0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54   if( rc ){.    T
4ef0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4f00: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
4f10: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
4f20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4f30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
4f40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4f50: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
4f60: 5f 6d 6f 76 65 5f 74 6f 20 49 44 20 4b 45 59 0a  _move_to ID KEY.
4f70: 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  **.** Move the c
4f80: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 65 6e 74  ursor to the ent
4f90: 72 79 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ry with the give
4fa0: 6e 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  n key..*/.static
4fb0: 20 69 6e 74 20 62 74 72 65 65 5f 6d 6f 76 65 5f   int btree_move_
4fc0: 74 6f 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  to(.  void *NotU
4fd0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4fe0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ff0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
5000: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
5010: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
5020: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
5030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5040: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
5050: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
5060: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a  r **argv      /*
5070: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
5080: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42  gument */.){.  B
5090: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
50a0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72   int rc;.  int r
50b0: 65 73 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  es;.  char zBuf[
50c0: 32 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  20];..  if( argc
50d0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
50e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
50f0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
5100: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
5110: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
5120: 20 20 22 20 49 44 20 4b 45 59 5c 22 22 2c 20 30    " ID KEY\"", 0
5130: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5140: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
5150: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78  Cur = sqlite3Tex
5160: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
5170: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
5180: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65  nter(pCur->pBtre
5190: 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
51a0: 33 42 74 72 65 65 46 6c 61 67 73 28 70 43 75 72  3BtreeFlags(pCur
51b0: 29 20 26 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  ) & BTREE_INTKEY
51c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65 79   ){.    int iKey
51d0: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
51e0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
51f0: 76 5b 32 5d 2c 20 26 69 4b 65 79 29 20 29 7b 0a  v[2], &iKey) ){.
5200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
5210: 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42  eeLeave(pCur->pB
5220: 74 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74  tree);.      ret
5230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5240: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
5250: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
5260: 28 70 43 75 72 2c 20 30 2c 20 30 2c 20 69 4b 65  (pCur, 0, 0, iKe
5270: 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 7d  y, 0, &res);.  }
5280: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
5290: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
52a0: 6f 28 70 43 75 72 2c 20 61 72 67 76 5b 32 5d 2c  o(pCur, argv[2],
52b0: 20 30 2c 20 73 74 72 6c 65 6e 28 61 72 67 76 5b   0, strlen(argv[
52c0: 32 5d 29 2c 20 30 2c 20 26 72 65 73 29 3b 20 20  2]), 0, &res);  
52d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
52e0: 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70  reeLeave(pCur->p
52f0: 42 74 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63  Btree);.  if( rc
5300: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5310: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5320: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
5330: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5340: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5350: 69 66 28 20 72 65 73 3c 30 20 29 20 72 65 73 20  if( res<0 ) res 
5360: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 72 65 73 3e  = -1;.  if( res>
5370: 30 20 29 20 72 65 73 20 3d 20 31 3b 0a 20 20 73  0 ) res = 1;.  s
5380: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5390: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
53a0: 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20  uf,"%d",res);.  
53b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
53c0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
53d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
53e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
53f0: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 64  Usage:   btree_d
5400: 65 6c 65 74 65 20 49 44 0a 2a 2a 0a 2a 2a 20 44  elete ID.**.** D
5410: 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
5420: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
5430: 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  is pointing to.*
5440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5450: 65 65 5f 64 65 6c 65 74 65 28 0a 20 20 76 6f 69  ee_delete(.  voi
5460: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
5470: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5480: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
5490: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
54a0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
54b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
54c0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
54d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
54e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
54f0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20  nst char **argv 
5500: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
5510: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
5520: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
5530: 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pCur;.  int rc;.
5540: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
5550: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
5560: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
5570: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
5580: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
5590: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49  v[0],.       " I
55a0: 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  D\"", 0);.    re
55b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
55c0: 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
55d0: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
55e0: 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[1]);.  sqlite
55f0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75 72  3BtreeEnter(pCur
5600: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63 20  ->pBtree);.  rc 
5610: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  = sqlite3BtreeDe
5620: 6c 65 74 65 28 70 43 75 72 29 3b 0a 20 20 73 71  lete(pCur);.  sq
5630: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
5640: 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20  pCur->pBtree);. 
5650: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54   if( rc ){.    T
5660: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5670: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
5680: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
5690: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
56a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
56b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
56c0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
56d0: 5f 69 6e 73 65 72 74 20 49 44 20 4b 45 59 20 44  _insert ID KEY D
56e0: 41 54 41 20 3f 4e 5a 45 52 4f 3f 0a 2a 2a 0a 2a  ATA ?NZERO?.**.*
56f0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 65  * Create a new e
5700: 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 67 69  ntry with the gi
5710: 76 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61  ven key and data
5720: 2e 20 20 49 66 20 61 6e 20 65 6e 74 72 79 20 61  .  If an entry a
5730: 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73 74 73  lready.** exists
5740: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
5750: 65 79 20 74 68 65 20 6f 6c 64 20 65 6e 74 72 79  ey the old entry
5760: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
5770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5780: 74 72 65 65 5f 69 6e 73 65 72 74 28 0a 20 20 76  tree_insert(.  v
5790: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
57a0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
57b0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
57c0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
57d0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
57e0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
57f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
5800: 20 6e 5a 65 72 6f 3b 0a 0a 20 20 69 66 28 20 6f   nZero;..  if( o
5810: 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
5820: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
5830: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
5840: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 49 44 20 4b  , 1, objv, "ID K
5850: 45 59 20 44 41 54 41 20 3f 4e 5a 45 52 4f 3f 22  EY DATA ?NZERO?"
5860: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5870: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
5880: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78  Cur = sqlite3Tex
5890: 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
58a0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a  ring(objv[1]));.
58b0: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 29 7b    if( objc==5 ){
58c0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
58d0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
58e0: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 5a 65  p, objv[4], &nZe
58f0: 72 6f 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ro) ) return TCL
5900: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
5910: 0a 20 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  .    nZero = 0;.
5920: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
5930: 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42  eeEnter(pCur->pB
5940: 74 72 65 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  tree);.  if( sql
5950: 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 70  ite3BtreeFlags(p
5960: 43 75 72 29 20 26 20 42 54 52 45 45 5f 49 4e 54  Cur) & BTREE_INT
5970: 4b 45 59 20 29 7b 0a 20 20 20 20 69 36 34 20 69  KEY ){.    i64 i
5980: 4b 65 79 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  Key;.    int len
5990: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
59a0: 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 20 20 69  har *pBuf;.    i
59b0: 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
59c0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
59d0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4b 65 79 29   objv[2], &iKey)
59e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
59f0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75 72  3BtreeLeave(pCur
5a00: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  ->pBtree);.     
5a10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5a20: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 75  R;.    }.    pBu
5a30: 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  f = Tcl_GetByteA
5a40: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
5a50: 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  [3], &len);.    
5a60: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5a70: 65 49 6e 73 65 72 74 28 70 43 75 72 2c 20 30 2c  eInsert(pCur, 0,
5a80: 20 69 4b 65 79 2c 20 70 42 75 66 2c 20 6c 65 6e   iKey, pBuf, len
5a90: 2c 20 6e 5a 65 72 6f 2c 20 30 29 3b 0a 20 20 7d  , nZero, 0);.  }
5aa0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6b 65  else{.    int ke
5ab0: 79 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 64 6c  ylen;.    int dl
5ac0: 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  en;.    unsigned
5ad0: 20 63 68 61 72 20 2a 70 4b 42 75 66 3b 0a 20 20   char *pKBuf;.  
5ae0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5af0: 2a 70 44 42 75 66 3b 0a 20 20 20 20 70 4b 42 75  *pDBuf;.    pKBu
5b00: 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  f = Tcl_GetByteA
5b10: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
5b20: 5b 32 5d 2c 20 26 6b 65 79 6c 65 6e 29 3b 0a 20  [2], &keylen);. 
5b30: 20 20 20 70 44 42 75 66 20 3d 20 54 63 6c 5f 47     pDBuf = Tcl_G
5b40: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
5b50: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 64 6c 65  bj(objv[3], &dle
5b60: 6e 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  n);.    rc = sql
5b70: 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
5b80: 70 43 75 72 2c 20 70 4b 42 75 66 2c 20 6b 65 79  pCur, pKBuf, key
5b90: 6c 65 6e 2c 20 70 44 42 75 66 2c 20 64 6c 65 6e  len, pDBuf, dlen
5ba0: 2c 20 6e 5a 65 72 6f 2c 20 30 29 3b 0a 20 20 7d  , nZero, 0);.  }
5bb0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
5bc0: 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65  eave(pCur->pBtre
5bd0: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
5be0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
5bf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
5c00: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
5c10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5c20: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5c30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c40: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
5c50: 62 74 72 65 65 5f 6e 65 78 74 20 49 44 0a 2a 2a  btree_next ID.**
5c60: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
5c70: 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
5c80: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
5c90: 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e  le.  Return 0 on
5ca0: 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 31   success.** or 1
5cb0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 77   if the cursor w
5cc0: 61 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68  as already on th
5cd0: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
5ce0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 66 0a  the table or if.
5cf0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
5d00: 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  empty..*/.static
5d10: 20 69 6e 74 20 62 74 72 65 65 5f 6e 65 78 74 28   int btree_next(
5d20: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
5d30: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5d40: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
5d50: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
5d60: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
5d70: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
5d80: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
5d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5da0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5db0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5dc0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
5dd0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5de0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ent */.){.  BtCu
5df0: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
5e00: 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65 73 20  t rc;.  int res 
5e10: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
5e20: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  [100];..  if( ar
5e30: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
5e40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5e50: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
5e60: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
5e70: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
5e80: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
5e90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5ea0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75  ERROR;.  }.  pCu
5eb0: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  r = sqlite3TextT
5ec0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
5ed0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
5ee0: 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29  er(pCur->pBtree)
5ef0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5f00: 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
5f10: 26 72 65 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  &res);.  sqlite3
5f20: 42 74 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d  BtreeLeave(pCur-
5f30: 3e 70 42 74 72 65 65 29 3b 0a 20 20 69 66 28 20  >pBtree);.  if( 
5f40: 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  rc ){.    Tcl_Ap
5f50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5f60: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
5f70: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
5f80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
5f90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
5fa0: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
5fb0: 7a 42 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a  zBuf,"%d",res);.
5fc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5fd0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
5fe0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
5ff0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6000: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
6010: 5f 70 72 65 76 20 49 44 0a 2a 2a 0a 2a 2a 20 4d  _prev ID.**.** M
6020: 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
6030: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
6040: 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
6050: 65 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e 0a  e.  Return 0 on.
6060: 2a 2a 20 73 75 63 63 65 73 73 20 61 6e 64 20 31  ** success and 1
6070: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 77   if the cursor w
6080: 61 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68  as already on th
6090: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
60a0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6f 72  .** the table or
60b0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 77 61   if the table wa
60c0: 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74  s empty..*/.stat
60d0: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 70 72 65  ic int btree_pre
60e0: 76 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  v(.  void *NotUs
60f0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
6100: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
6110: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
6120: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
6130: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
6140: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
6150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6160: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6170: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
6180: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
6190: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
61a0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
61b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
61c0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65  int rc;.  int re
61d0: 73 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  s = 0;.  char zB
61e0: 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
61f0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
6200: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6210: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
6220: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
6230: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
6240: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30        " ID\"", 0
6250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6260: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
6270: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78  Cur = sqlite3Tex
6280: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
6290: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
62a0: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65  nter(pCur->pBtre
62b0: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
62c0: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
62d0: 70 43 75 72 2c 20 26 72 65 73 29 3b 0a 20 20 73  pCur, &res);.  s
62e0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
62f0: 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a  (pCur->pBtree);.
6300: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
6310: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6320: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
6330: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
6340: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6350: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6360: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
6370: 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 64 22 2c  zBuf),zBuf,"%d",
6380: 72 65 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  res);.  Tcl_Appe
6390: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
63a0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
63b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
63c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
63d0: 20 62 74 72 65 65 5f 66 69 72 73 74 20 49 44 0a   btree_first ID.
63e0: 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  **.** Move the c
63f0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
6400: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
6410: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 30  table.  Return 0
6420: 20 69 66 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f   if the.** curso
6430: 72 20 77 61 73 20 6c 65 66 74 20 70 6f 69 6e 74  r was left point
6440: 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 61 6e   to something an
6450: 64 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  d 1 if the table
6460: 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74   is empty..*/.st
6470: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 66  atic int btree_f
6480: 69 72 73 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  irst(.  void *No
6490: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
64a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
64b0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
64c0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
64d0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
64e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6500: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
6510: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
6520: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
6530: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
6540: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
6550: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
6560: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
6570: 20 72 65 73 20 3d 20 30 3b 0a 20 20 63 68 61 72   res = 0;.  char
6580: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
6590: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
65a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
65b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
65c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
65d0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
65e0: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
65f0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
6600: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
6610: 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33    pCur = sqlite3
6620: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31  TextToPtr(argv[1
6630: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ]);.  sqlite3Btr
6640: 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42  eeEnter(pCur->pB
6650: 74 72 65 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  tree);.  rc = sq
6660: 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
6670: 70 43 75 72 2c 20 26 72 65 73 29 3b 0a 20 20 73  pCur, &res);.  s
6680: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6690: 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a  (pCur->pBtree);.
66a0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
66b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
66c0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
66d0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
66e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
66f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6700: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
6710: 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 64 22 2c  zBuf),zBuf,"%d",
6720: 72 65 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  res);.  Tcl_Appe
6730: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6740: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
6750: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6760: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
6770: 20 62 74 72 65 65 5f 6c 61 73 74 20 49 44 0a 2a   btree_last ID.*
6780: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
6790: 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
67a0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
67b0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ble.  Return 0 i
67c0: 66 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  f the.** cursor 
67d0: 77 61 73 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  was left point t
67e0: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 61 6e 64 20  o something and 
67f0: 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
6800: 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74  s empty..*/.stat
6810: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 6c 61 73  ic int btree_las
6820: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
6830: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
6840: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
6850: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
6860: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
6870: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
6880: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
6890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
68a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
68b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
68c0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
68d0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
68e0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
68f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
6900: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65  int rc;.  int re
6910: 73 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  s = 0;.  char zB
6920: 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
6930: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
6940: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6950: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
6960: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
6970: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
6980: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30        " ID\"", 0
6990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
69a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
69b0: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78  Cur = sqlite3Tex
69c0: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
69d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
69e0: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65  nter(pCur->pBtre
69f0: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
6a00: 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 75 72  e3BtreeLast(pCur
6a10: 2c 20 26 72 65 73 29 3b 0a 20 20 73 71 6c 69 74  , &res);.  sqlit
6a20: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75  e3BtreeLeave(pCu
6a30: 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 69 66  r->pBtree);.  if
6a40: 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
6a50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6a60: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
6a70: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
6a80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6a90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
6aa0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
6ab0: 29 2c 7a 42 75 66 2c 22 25 64 22 2c 72 65 73 29  ),zBuf,"%d",res)
6ac0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
6ad0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
6ae0: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
6af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6b00: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
6b10: 65 65 5f 65 6f 66 20 49 44 0a 2a 2a 0a 2a 2a 20  ee_eof ID.**.** 
6b20: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
6b30: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
6b40: 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
6b50: 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
6b60: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53  ..** Return FALS
6b70: 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
6b80: 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20 61 20  does point to a 
6b90: 76 61 6c 69 64 20 65 6e 74 72 79 2e 0a 2a 2f 0a  valid entry..*/.
6ba0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6bb0: 5f 65 6f 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _eof(.  void *No
6bc0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
6bd0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
6be0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
6bf0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
6c00: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
6c10: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c30: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
6c40: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
6c50: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
6c60: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
6c70: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
6c80: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
6c90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
6ca0: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69  r zBuf[50];..  i
6cb0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
6cc0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6cd0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
6ce0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
6cf0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
6d00: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
6d10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
6d20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
6d30: 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33    pCur = sqlite3
6d40: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31  TextToPtr(argv[1
6d50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ]);.  sqlite3Btr
6d60: 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42  eeEnter(pCur->pB
6d70: 74 72 65 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  tree);.  rc = sq
6d80: 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 70 43  lite3BtreeEof(pC
6d90: 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
6da0: 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70  reeLeave(pCur->p
6db0: 42 74 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65  Btree);.  sqlite
6dc0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
6dd0: 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 20 22 25  f(zBuf),zBuf, "%
6de0: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
6df0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6e00: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
6e10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
6e30: 3a 20 20 20 62 74 72 65 65 5f 6b 65 79 73 69 7a  :   btree_keysiz
6e40: 65 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  e ID.**.** Retur
6e50: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6e60: 62 79 74 65 73 20 6f 66 20 6b 65 79 2e 20 20 46  bytes of key.  F
6e70: 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
6e80: 6c 65 2c 20 74 68 69 73 0a 2a 2a 20 72 65 74 75  le, this.** retu
6e90: 72 6e 73 20 74 68 65 20 6b 65 79 20 69 74 73 65  rns the key itse
6ea0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lf..*/.static in
6eb0: 74 20 62 74 72 65 65 5f 6b 65 79 73 69 7a 65 28  t btree_keysize(
6ec0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
6ed0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
6ee0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
6ef0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
6f00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
6f10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
6f20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
6f30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6f40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
6f50: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6f60: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
6f70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
6f80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ent */.){.  BtCu
6f90: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 75 36  rsor *pCur;.  u6
6fa0: 34 20 6e 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  4 n;.  char zBuf
6fb0: 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67  [50];..  if( arg
6fc0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
6fd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6fe0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6ff0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
7000: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
7010: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
7020: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72  RROR;.  }.  pCur
7040: 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f   = sqlite3TextTo
7050: 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  Ptr(argv[1]);.  
7060: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
7070: 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b  r(pCur->pBtree);
7080: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
7090: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 28 69 36  eySize(pCur, (i6
70a0: 34 2a 29 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65  4*)&n);.  sqlite
70b0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75 72  3BtreeLeave(pCur
70c0: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 73 71 6c  ->pBtree);.  sql
70d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
70e0: 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
70f0: 20 22 25 6c 6c 75 22 2c 20 6e 29 3b 0a 20 20 54   "%llu", n);.  T
7100: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7110: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
7120: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7130: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
7140: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 6b 65  sage:   btree_ke
7150: 79 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  y ID.**.** Retur
7160: 6e 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  n the key for th
7170: 65 20 65 6e 74 72 79 20 61 74 20 77 68 69 63 68  e entry at which
7180: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
7190: 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ointing..*/.stat
71a0: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 6b 65 79  ic int btree_key
71b0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
71c0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
71d0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
71e0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
71f0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7200: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7210: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
7220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7230: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7240: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7250: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
7260: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
7270: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
7280: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
7290: 6e 74 20 72 63 3b 0a 20 20 75 36 34 20 6e 3b 0a  nt rc;.  u64 n;.
72a0: 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20    char *zBuf;.. 
72b0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
72c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
72d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
72e0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
72f0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
7300: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
7310: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
7320: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7330: 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
7340: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
7350: 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  [1]);.  sqlite3B
7360: 74 72 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e  treeEnter(pCur->
7370: 70 42 74 72 65 65 29 3b 0a 20 20 73 71 6c 69 74  pBtree);.  sqlit
7380: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
7390: 43 75 72 2c 20 28 69 36 34 2a 29 26 6e 29 3b 0a  Cur, (i64*)&n);.
73a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
73b0: 65 65 46 6c 61 67 73 28 70 43 75 72 29 20 26 20  eeFlags(pCur) & 
73c0: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 7b 0a  BTREE_INTKEY ){.
73d0: 20 20 20 20 63 68 61 72 20 7a 42 75 66 32 5b 36      char zBuf2[6
73e0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
73f0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
7400: 7a 42 75 66 32 29 2c 7a 42 75 66 32 2c 20 22 25  zBuf2),zBuf2, "%
7410: 6c 6c 75 22 2c 20 6e 29 3b 0a 20 20 20 20 54 63  llu", n);.    Tc
7420: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7430: 6e 74 65 72 70 2c 20 7a 42 75 66 32 2c 20 30 29  nterp, zBuf2, 0)
7440: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
7450: 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
7460: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 20  lloc( n+1 );.   
7470: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
7480: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e  eeKey(pCur, 0, n
7490: 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28  , zBuf);.    if(
74a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   rc ){.      sql
74b0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
74c0: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
74d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
74e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
74f0: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
7500: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
7510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7520: 20 20 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20    zBuf[n] = 0;. 
7530: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7540: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
7550: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7560: 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
7570: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
7580: 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72  Leave(pCur->pBtr
7590: 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ee);.  return SQ
75a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
75b0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
75c0: 5f 64 61 74 61 20 49 44 20 3f 4e 3f 0a 2a 2a 0a  _data ID ?N?.**.
75d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
75e0: 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ta for the entry
75f0: 20 61 74 20 77 68 69 63 68 20 74 68 65 20 63 75   at which the cu
7600: 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
7610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7620: 62 74 72 65 65 5f 64 61 74 61 28 0a 20 20 76 6f  btree_data(.  vo
7630: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
7640: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7650: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
7660: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
7670: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
7680: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
7690: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
76a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
76b0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
76c0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
76d0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
76e0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
76f0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
7700: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
7710: 0a 20 20 75 33 32 20 6e 3b 0a 20 20 63 68 61 72  .  u32 n;.  char
7720: 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 61   *zBuf;..  if( a
7730: 72 67 63 21 3d 32 20 26 26 20 61 72 67 63 21 3d  rgc!=2 && argc!=
7740: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
7750: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7760: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
7770: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
7780: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
7790: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
77a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
77b0: 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20  R;.  }.  pCur = 
77c0: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
77d0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c  (argv[1]);.  sql
77e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
77f0: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
7800: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
7810: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
7820: 61 74 61 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  ataSize(pCur, &n
7830: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7840: 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 32 5d  n = atoi(argv[2]
7850: 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 20 3d 20  );.  }.  zBuf = 
7860: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
7870: 6e 2b 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  n+1 );.  rc = sq
7880: 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 70  lite3BtreeData(p
7890: 43 75 72 2c 20 30 2c 20 6e 2c 20 7a 42 75 66 29  Cur, 0, n, zBuf)
78a0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
78b0: 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72  Leave(pCur->pBtr
78c0: 65 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ee);.  if( rc ){
78d0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
78e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
78f0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
7900: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7910: 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 72 65 74  e(zBuf);.    ret
7920: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7930: 20 7d 0a 20 20 7a 42 75 66 5b 6e 5d 20 3d 20 30   }.  zBuf[n] = 0
7940: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
7950: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
7960: 66 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  f, 0);.  sqlite3
7970: 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 72  _free(zBuf);.  r
7980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
79a0: 20 20 20 62 74 72 65 65 5f 66 65 74 63 68 5f 6b     btree_fetch_k
79b0: 65 79 20 49 44 20 41 4d 54 0a 2a 2a 0a 2a 2a 20  ey ID AMT.**.** 
79c0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  Use the sqlite3B
79d0: 74 72 65 65 4b 65 79 46 65 74 63 68 28 29 20 72  treeKeyFetch() r
79e0: 6f 75 74 69 6e 65 20 74 6f 20 67 65 74 20 41 4d  outine to get AM
79f0: 54 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  T bytes of the k
7a00: 65 79 2e 0a 2a 2a 20 49 66 20 73 71 6c 69 74 65  ey..** If sqlite
7a10: 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 29  3BtreeKeyFetch()
7a20: 20 66 61 69 6c 73 2c 20 72 65 74 75 72 6e 20 61   fails, return a
7a30: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a  n empty string..
7a40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
7a50: 72 65 65 5f 66 65 74 63 68 5f 6b 65 79 28 0a 20  ree_fetch_key(. 
7a60: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7a70: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7a80: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
7a90: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
7aa0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
7ab0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
7ac0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
7ad0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7ae0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7af0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
7b00: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
7b10: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
7b20: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  t */.){.  BtCurs
7b30: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
7b40: 6e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  n;.  int amt;.  
7b50: 75 36 34 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e 73  u64 nKey;.  cons
7b60: 74 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20  t char *zBuf;.  
7b70: 63 68 61 72 20 7a 53 74 61 74 69 63 5b 31 30 30  char zStatic[100
7b80: 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
7b90: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
7ba0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7bb0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7bc0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7bd0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7be0: 20 22 20 49 44 20 41 4d 54 5c 22 22 2c 20 30 29   " ID AMT\"", 0)
7bf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7c00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43  _ERROR;.  }.  pC
7c10: 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74  ur = sqlite3Text
7c20: 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a  ToPtr(argv[1]);.
7c30: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
7c40: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
7c50: 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
7c60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
7c70: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 43  te3BtreeEnter(pC
7c80: 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 73  ur->pBtree);.  s
7c90: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
7ca0: 7a 65 28 70 43 75 72 2c 20 28 69 36 34 2a 29 26  ze(pCur, (i64*)&
7cb0: 6e 4b 65 79 29 3b 0a 20 20 7a 42 75 66 20 3d 20  nKey);.  zBuf = 
7cc0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
7cd0: 65 74 63 68 28 70 43 75 72 2c 20 26 61 6d 74 29  etch(pCur, &amt)
7ce0: 3b 0a 20 20 69 66 28 20 7a 42 75 66 20 26 26 20  ;.  if( zBuf && 
7cf0: 61 6d 74 3e 3d 6e 20 29 7b 0a 20 20 20 20 61 73  amt>=n ){.    as
7d00: 73 65 72 74 28 20 6e 4b 65 79 3c 73 69 7a 65 6f  sert( nKey<sizeo
7d10: 66 28 7a 53 74 61 74 69 63 29 20 29 3b 0a 20 20  f(zStatic) );.  
7d20: 20 20 69 66 28 20 6e 3e 30 20 29 20 6e 4b 65 79    if( n>0 ) nKey
7d30: 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79   = n;.    memcpy
7d40: 28 7a 53 74 61 74 69 63 2c 20 7a 42 75 66 2c 20  (zStatic, zBuf, 
7d50: 28 69 6e 74 29 6e 4b 65 79 29 3b 20 0a 20 20 20  (int)nKey); .   
7d60: 20 7a 53 74 61 74 69 63 5b 6e 4b 65 79 5d 20 3d   zStatic[nKey] =
7d70: 20 30 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   0;.    Tcl_Appe
7d80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7d90: 20 7a 53 74 61 74 69 63 2c 20 30 29 3b 0a 20 20   zStatic, 0);.  
7da0: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
7db0: 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72  Leave(pCur->pBtr
7dc0: 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ee);.  return TC
7dd0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
7de0: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 66 65  sage:   btree_fe
7df0: 74 63 68 5f 64 61 74 61 20 49 44 20 41 4d 54 0a  tch_data ID AMT.
7e00: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
7e10: 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
7e20: 74 63 68 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  tch() routine to
7e30: 20 67 65 74 20 41 4d 54 20 62 79 74 65 73 20 6f   get AMT bytes o
7e40: 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 20 49 66  f the key..** If
7e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
7e60: 61 46 65 74 63 68 28 29 20 66 61 69 6c 73 2c 20  aFetch() fails, 
7e70: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
7e80: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
7e90: 63 20 69 6e 74 20 62 74 72 65 65 5f 66 65 74 63  c int btree_fetc
7ea0: 68 5f 64 61 74 61 28 0a 20 20 76 6f 69 64 20 2a  h_data(.  void *
7eb0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
7ec0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
7ed0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
7ee0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
7ef0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
7f00: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
7f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7f20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
7f30: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
7f40: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
7f50: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
7f60: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
7f70: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
7f80: 72 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  r;.  int n;.  in
7f90: 74 20 61 6d 74 3b 0a 20 20 75 33 32 20 6e 44 61  t amt;.  u32 nDa
7fa0: 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
7fb0: 20 2a 7a 42 75 66 3b 0a 20 20 63 68 61 72 20 7a   *zBuf;.  char z
7fc0: 53 74 61 74 69 63 5b 31 30 30 30 5d 3b 0a 0a 20  Static[1000];.. 
7fd0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
7fe0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
7ff0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8000: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8010: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8020: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 20  0],.       " ID 
8030: 41 4d 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AMT\"", 0);.    
8040: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8050: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73  ;.  }.  pCur = s
8060: 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28  qlite3TextToPtr(
8070: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
8080: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
8090: 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6e 29 20  p, argv[2], &n) 
80a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
80b0: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OR;.  sqlite3Btr
80c0: 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42  eeEnter(pCur->pB
80d0: 74 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  tree);.  sqlite3
80e0: 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
80f0: 75 72 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 7a  ur, &nData);.  z
8100: 42 75 66 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Buf = sqlite3Btr
8110: 65 65 44 61 74 61 46 65 74 63 68 28 70 43 75 72  eeDataFetch(pCur
8120: 2c 20 26 61 6d 74 29 3b 0a 20 20 69 66 28 20 7a  , &amt);.  if( z
8130: 42 75 66 20 26 26 20 61 6d 74 3e 3d 6e 20 29 7b  Buf && amt>=n ){
8140: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61  .    assert( nDa
8150: 74 61 3c 73 69 7a 65 6f 66 28 7a 53 74 61 74 69  ta<sizeof(zStati
8160: 63 29 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  c) );.    if( n>
8170: 30 20 29 20 6e 44 61 74 61 20 3d 20 6e 3b 0a 20  0 ) nData = n;. 
8180: 20 20 20 6d 65 6d 63 70 79 28 7a 53 74 61 74 69     memcpy(zStati
8190: 63 2c 20 7a 42 75 66 2c 20 28 69 6e 74 29 6e 44  c, zBuf, (int)nD
81a0: 61 74 61 29 3b 20 0a 20 20 20 20 7a 53 74 61 74  ata); .    zStat
81b0: 69 63 5b 6e 44 61 74 61 5d 20 3d 20 30 3b 0a 20  ic[nData] = 0;. 
81c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
81d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 53 74 61  ult(interp, zSta
81e0: 74 69 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  tic, 0);.  }.  s
81f0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
8200: 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a  (pCur->pBtree);.
8210: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
8230: 20 20 20 62 74 72 65 65 5f 70 61 79 6c 6f 61 64     btree_payload
8240: 5f 73 69 7a 65 20 49 44 0a 2a 2a 0a 2a 2a 20 52  _size ID.**.** R
8250: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8260: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
8270: 6c 6f 61 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69  load.*/.static i
8280: 6e 74 20 62 74 72 65 65 5f 70 61 79 6c 6f 61 64  nt btree_payload
8290: 5f 73 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 4e  _size(.  void *N
82a0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
82b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
82c0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
82d0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
82e0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
82f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8310: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
8320: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
8330: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
8340: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
8350: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
8360: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8370: 3b 0a 20 20 69 6e 74 20 6e 32 3b 0a 20 20 75 36  ;.  int n2;.  u6
8380: 34 20 6e 31 3b 0a 20 20 63 68 61 72 20 7a 42 75  4 n1;.  char zBu
8390: 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[50];..  if( ar
83a0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
83b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
83c0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
83d0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
83e0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
83f0: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
8400: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8410: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75  ERROR;.  }.  pCu
8420: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  r = sqlite3TextT
8430: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
8440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8450: 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29  er(pCur->pBtree)
8460: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  ;.  if( sqlite3B
8470: 74 72 65 65 46 6c 61 67 73 28 70 43 75 72 29 20  treeFlags(pCur) 
8480: 26 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29  & BTREE_INTKEY )
8490: 7b 0a 20 20 20 20 6e 31 20 3d 20 30 3b 0a 20 20  {.    n1 = 0;.  
84a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
84b0: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
84c0: 43 75 72 2c 20 28 69 36 34 2a 29 26 6e 31 29 3b  Cur, (i64*)&n1);
84d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
84e0: 72 65 65 44 61 74 61 53 69 7a 65 28 70 43 75 72  reeDataSize(pCur
84f0: 2c 20 28 75 33 32 2a 29 26 6e 32 29 3b 0a 20 20  , (u32*)&n2);.  
8500: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
8510: 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b  e(pCur->pBtree);
8520: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
8530: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
8540: 2c 7a 42 75 66 2c 20 22 25 64 22 2c 20 28 69 6e  ,zBuf, "%d", (in
8550: 74 29 28 6e 31 2b 6e 32 29 29 3b 0a 20 20 54 63  t)(n1+n2));.  Tc
8560: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8570: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
8580: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8590: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
85a0: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63 75 72  age:   btree_cur
85b0: 73 6f 72 5f 69 6e 66 6f 20 49 44 20 3f 55 50 2d  sor_info ID ?UP-
85c0: 43 4e 54 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  CNT?.**.** Retur
85d0: 6e 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  n integers conta
85e0: 69 6e 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  ining informatio
85f0: 6e 20 61 62 6f 75 74 20 74 68 65 20 65 6e 74 72  n about the entr
8600: 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
8610: 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 3a 0a  is pointing to:.
8620: 2a 2a 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  **.**   aResult[
8630: 30 5d 20 3d 20 20 54 68 65 20 70 61 67 65 20 6e  0] =  The page n
8640: 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
8650: 6c 74 5b 31 5d 20 3d 20 20 54 68 65 20 65 6e 74  lt[1] =  The ent
8660: 72 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61  ry number.**   a
8670: 52 65 73 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74  Result[2] =  Tot
8680: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  al number of ent
8690: 72 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ries on this pag
86a0: 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 33  e.**   aResult[3
86b0: 5d 20 3d 20 20 43 65 6c 6c 20 73 69 7a 65 20 28  ] =  Cell size (
86c0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 2b 20  local payload + 
86d0: 68 65 61 64 65 72 29 0a 2a 2a 20 20 20 61 52 65  header).**   aRe
86e0: 73 75 6c 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65  sult[4] =  Numbe
86f0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
8700: 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20  on this page.** 
8710: 20 20 61 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20    aResult[5] =  
8720: 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  Number of free b
8730: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 70 61 67  locks on the pag
8740: 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 36  e.**   aResult[6
8750: 5d 20 3d 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f  ] =  Total paylo
8760: 61 64 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 2b  ad size (local +
8770: 20 6f 76 65 72 66 6c 6f 77 29 0a 2a 2a 20 20 20   overflow).**   
8780: 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20 20 48 65  aResult[7] =  He
8790: 61 64 65 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ader size in byt
87a0: 65 73 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  es.**   aResult[
87b0: 38 5d 20 3d 20 20 4c 6f 63 61 6c 20 70 61 79 6c  8] =  Local payl
87c0: 6f 61 64 20 73 69 7a 65 0a 2a 2a 20 20 20 61 52  oad size.**   aR
87d0: 65 73 75 6c 74 5b 39 5d 20 3d 20 20 50 61 72 65  esult[9] =  Pare
87e0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a  nt page number.*
87f0: 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 30 5d 3d  *   aResult[10]=
8800: 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66    Page number of
8810: 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
8820: 6c 6f 77 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74  low page.*/.stat
8830: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 63 75 72  ic int btree_cur
8840: 73 6f 72 5f 69 6e 66 6f 28 0a 20 20 76 6f 69 64  sor_info(.  void
8850: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8860: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8870: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8880: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8890: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
88a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
88b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
88c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
88d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
88e0: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
88f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8900: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8910: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
8920: 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Cur;.  int rc;. 
8930: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
8940: 20 75 70 3b 0a 20 20 69 6e 74 20 61 52 65 73 75   up;.  int aResu
8950: 6c 74 5b 31 31 5d 3b 0a 20 20 63 68 61 72 20 7a  lt[11];.  char z
8960: 42 75 66 5b 34 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[400];..  if(
8970: 20 61 72 67 63 21 3d 32 20 26 26 20 61 72 67 63   argc!=2 && argc
8980: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
8990: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
89a0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
89b0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
89c0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
89d0: 20 20 22 20 49 44 20 3f 55 50 2d 43 4e 54 3f 5c    " ID ?UP-CNT?\
89e0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
89f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8a00: 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
8a10: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
8a20: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 61 72 67 63  [1]);.  if( argc
8a30: 3d 3d 33 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==3 ){.    if( T
8a40: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
8a50: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 75 70 29 20  , argv[2], &up) 
8a60: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8a70: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
8a80: 20 75 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73   up = 0;.  }.  s
8a90: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
8aa0: 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a  (pCur->pBtree);.
8ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8ac0: 72 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 70 43  reeCursorInfo(pC
8ad0: 75 72 2c 20 61 52 65 73 75 6c 74 2c 20 75 70 29  ur, aResult, up)
8ae0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
8af0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8b00: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
8b10: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
8b20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
8b30: 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
8b40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8b50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6a  L_ERROR;.  }.  j
8b60: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
8b70: 20 69 3c 73 69 7a 65 6f 66 28 61 52 65 73 75 6c   i<sizeof(aResul
8b80: 74 29 2f 73 69 7a 65 6f 66 28 61 52 65 73 75 6c  t)/sizeof(aResul
8b90: 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
8ba0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8bb0: 66 28 34 30 2c 26 7a 42 75 66 5b 6a 5d 2c 22 20  f(40,&zBuf[j]," 
8bc0: 25 64 22 2c 20 61 52 65 73 75 6c 74 5b 69 5d 29  %d", aResult[i])
8bd0: 3b 0a 20 20 20 20 6a 20 2b 3d 20 73 74 72 6c 65  ;.    j += strle
8be0: 6e 28 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 7d  n(&zBuf[j]);.  }
8bf0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
8c00: 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65  eave(pCur->pBtre
8c10: 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  e);.  Tcl_Append
8c20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 26  Result(interp, &
8c30: 7a 42 75 66 5b 31 5d 2c 20 30 29 3b 0a 20 20 72  zBuf[1], 0);.  r
8c40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 69 65 64  .}../*.** Copied
8c60: 20 66 72 6f 6d 20 62 74 72 65 65 2e 63 3a 0a 2a   from btree.c:.*
8c70: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 74 34 47  /.static u32 t4G
8c80: 65 74 34 62 79 74 65 28 75 6e 73 69 67 6e 65 64  et4byte(unsigned
8c90: 20 63 68 61 72 20 2a 70 29 7b 0a 20 20 72 65 74   char *p){.  ret
8ca0: 75 72 6e 20 28 70 5b 30 5d 3c 3c 32 34 29 20 7c  urn (p[0]<<24) |
8cb0: 20 28 70 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 70   (p[1]<<16) | (p
8cc0: 5b 32 5d 3c 3c 38 29 20 7c 20 70 5b 33 5d 3b 0a  [2]<<8) | p[3];.
8cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 62 74 72 65 65  }../*.**   btree
8ce0: 5f 6f 76 66 6c 5f 69 6e 66 6f 20 20 42 54 52 45  _ovfl_info  BTRE
8cf0: 45 20 20 43 55 52 53 4f 52 0a 2a 2a 0a 2a 2a 20  E  CURSOR.**.** 
8d00: 47 69 76 65 6e 20 61 20 63 75 72 73 6f 72 2c 20  Given a cursor, 
8d10: 72 65 74 75 72 6e 20 74 68 65 20 73 65 71 75 65  return the seque
8d20: 6e 63 65 20 6f 66 20 70 61 67 65 73 20 6e 75 6d  nce of pages num
8d30: 62 65 72 20 74 68 61 74 20 66 6f 72 6d 20 74 68  ber that form th
8d40: 65 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61  e.** overflow pa
8d50: 67 65 73 20 66 6f 72 20 74 68 65 20 64 61 74 61  ges for the data
8d60: 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68   of the entry th
8d70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
8d80: 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 2e 0a 2a 2f   point.** to..*/
8d90: 20 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72   .static int btr
8da0: 65 65 5f 6f 76 66 6c 5f 69 6e 66 6f 28 0a 20 20  ee_ovfl_info(.  
8db0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
8dc0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8dd0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
8de0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
8df0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
8e00: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
8e10: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
8e20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8e30: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8e40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
8e50: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
8e60: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
8e70: 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a   */.){.  Btree *
8e80: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
8e90: 2a 70 43 75 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pCur;.  Pager *
8ea0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
8eb0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
8ec0: 20 64 61 74 61 53 69 7a 65 3b 0a 20 20 75 33 32   dataSize;.  u32
8ed0: 20 70 67 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 70   pgno;.  void *p
8ee0: 50 61 67 65 3b 0a 20 20 69 6e 74 20 61 52 65 73  Page;.  int aRes
8ef0: 75 6c 74 5b 31 31 5d 3b 0a 20 20 63 68 61 72 20  ult[11];.  char 
8f00: 7a 45 6c 65 6d 5b 31 30 30 5d 3b 0a 20 20 54 63  zElem[100];.  Tc
8f10: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 0a  l_DString str;..
8f20: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
8f30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8f40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
8f50: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
8f60: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
8f70: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  [0], .          
8f80: 20 20 20 20 20 20 20 20 20 20 22 20 42 54 52 45            " BTRE
8f90: 45 20 43 55 52 53 4f 52 22 2c 20 30 29 3b 0a 20  E CURSOR", 0);. 
8fa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8fb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d  ROR;.  }.  pBt =
8fc0: 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74   sqlite3TextToPt
8fd0: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 70 43  r(argv[1]);.  pC
8fe0: 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74  ur = sqlite3Text
8ff0: 54 6f 50 74 72 28 61 72 67 76 5b 32 5d 29 3b 0a  ToPtr(argv[2]);.
9000: 20 20 69 66 28 20 28 2a 28 76 6f 69 64 2a 2a 29    if( (*(void**)
9010: 70 43 75 72 29 20 21 3d 20 28 76 6f 69 64 2a 29  pCur) != (void*)
9020: 70 42 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  pBt ){.    Tcl_A
9030: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9040: 72 70 2c 20 22 43 75 72 73 6f 72 20 22 2c 20 61  rp, "Cursor ", a
9050: 72 67 76 5b 32 5d 2c 20 22 20 64 6f 65 73 20 6e  rgv[2], " does n
9060: 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 62 74 72  ot belong to btr
9070: 65 65 20 22 2c 0a 20 20 20 20 20 20 20 61 72 67  ee ",.       arg
9080: 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 72 65  v[1], 0);.    re
9090: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
90a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
90b0: 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
90c0: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
90d0: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
90e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
90f0: 74 72 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 70  treeCursorInfo(p
9100: 43 75 72 2c 20 61 52 65 73 75 6c 74 2c 20 30 29  Cur, aResult, 0)
9110: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
9120: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9130: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
9140: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
9150: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
9160: 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 72 65  ave(pBt);.    re
9170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9180: 20 20 7d 0a 20 20 64 61 74 61 53 69 7a 65 20 3d    }.  dataSize =
9190: 20 70 42 74 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pBt->pBt->usabl
91a0: 65 53 69 7a 65 3b 0a 20 20 54 63 6c 5f 44 53 74  eSize;.  Tcl_DSt
91b0: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
91c0: 20 20 6e 20 3d 20 61 52 65 73 75 6c 74 5b 36 5d    n = aResult[6]
91d0: 20 2d 20 61 52 65 73 75 6c 74 5b 38 5d 3b 0a 20   - aResult[8];. 
91e0: 20 6e 20 3d 20 28 6e 20 2b 20 64 61 74 61 53 69   n = (n + dataSi
91f0: 7a 65 20 2d 20 31 29 2f 64 61 74 61 53 69 7a 65  ze - 1)/dataSize
9200: 3b 0a 20 20 70 67 6e 6f 20 3d 20 28 75 33 32 29  ;.  pgno = (u32)
9210: 61 52 65 73 75 6c 74 5b 31 30 5d 3b 0a 20 20 77  aResult[10];.  w
9220: 68 69 6c 65 28 20 70 67 6e 6f 20 26 26 20 6e 2d  hile( pgno && n-
9230: 2d 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  - ){.    DbPage 
9240: 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 73 70  *pDbPage;.    sp
9250: 72 69 6e 74 66 28 7a 45 6c 65 6d 2c 20 22 25 64  rintf(zElem, "%d
9260: 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 54 63  ", pgno);.    Tc
9270: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
9280: 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 45 6c  lement(&str, zEl
9290: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  em);.    if( sql
92a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
92b0: 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 44 62 50  ger, pgno, &pDbP
92c0: 61 67 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  age)!=SQLITE_OK 
92d0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
92e0: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
92f0: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
9300: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9310: 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 70 61  unable to get pa
9320: 67 65 20 22 2c 20 7a 45 6c 65 6d 2c 20 30 29 3b  ge ", zElem, 0);
9330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
9340: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
9350: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
9360: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9370: 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
9380: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
9390: 50 61 67 65 29 3b 0a 20 20 20 20 70 67 6e 6f 20  Page);.    pgno 
93a0: 3d 20 74 34 47 65 74 34 62 79 74 65 28 28 75 6e  = t4Get4byte((un
93b0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50 61  signed char*)pPa
93c0: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
93d0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
93e0: 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ge);.  }.  sqlit
93f0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
9400: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
9410: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 26  Result(interp, &
9420: 73 74 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  str);.  return S
9430: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9440: 2a 2a 20 54 68 65 20 63 6f 6d 6d 61 6e 64 20 69  ** The command i
9450: 73 20 70 72 6f 76 69 64 65 64 20 66 6f 72 20 74  s provided for t
9460: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 65  he purpose of se
9470: 74 74 69 6e 67 20 62 72 65 61 6b 70 6f 69 6e 74  tting breakpoint
9480: 73 2e 0a 2a 2a 20 69 6e 20 72 65 67 72 65 73 73  s..** in regress
9490: 69 6f 6e 20 74 65 73 74 20 73 63 72 69 70 74 73  ion test scripts
94a0: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 73 65 74 74 69  ..**.** By setti
94b0: 6e 67 20 61 20 47 44 42 20 62 72 65 61 6b 70 6f  ng a GDB breakpo
94c0: 69 6e 74 20 6f 6e 20 74 68 69 73 20 70 72 6f 63  int on this proc
94d0: 65 64 75 72 65 20 61 6e 64 20 65 78 65 63 75 74  edure and execut
94e0: 69 6e 67 20 74 68 65 0a 2a 2a 20 62 74 72 65 65  ing the.** btree
94f0: 5f 62 72 65 61 6b 70 6f 69 6e 74 20 63 6f 6d 6d  _breakpoint comm
9500: 61 6e 64 20 69 6e 20 61 20 74 65 73 74 20 73 63  and in a test sc
9510: 72 69 70 74 2c 20 77 65 20 63 61 6e 20 73 74 6f  ript, we can sto
9520: 70 20 47 44 42 20 61 74 0a 2a 2a 20 74 68 65 20  p GDB at.** the 
9530: 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 73 63 72  point in the scr
9540: 69 70 74 20 77 68 65 72 65 20 74 68 65 20 62 74  ipt where the bt
9550: 72 65 65 5f 62 72 65 61 6b 70 6f 69 6e 74 20 63  ree_breakpoint c
9560: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 73  ommand is.** ins
9570: 65 72 74 65 64 2e 20 20 54 68 69 73 20 69 73 20  erted.  This is 
9580: 75 73 65 66 75 6c 20 66 6f 72 20 64 65 62 75 67  useful for debug
9590: 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ging..*/.static 
95a0: 69 6e 74 20 62 74 72 65 65 5f 62 72 65 61 6b 70  int btree_breakp
95b0: 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  oint(.  void *No
95c0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
95d0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
95e0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
95f0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9600: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9610: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9630: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9640: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
9650: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
9660: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9670: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9680: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9690: 7d 0a 0a 2f 2a 0a 2a 2a 20 75 73 61 67 65 3a 20  }../*.** usage: 
96a0: 20 20 76 61 72 69 6e 74 5f 74 65 73 74 20 20 53    varint_test  S
96b0: 54 41 52 54 20 20 4d 55 4c 54 49 50 4c 49 45 52  TART  MULTIPLIER
96c0: 20 20 43 4f 55 4e 54 20 20 49 4e 43 52 45 4d 45    COUNT  INCREME
96d0: 4e 54 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  NT.**.** This co
96e0: 6d 6d 61 6e 64 20 74 65 73 74 73 20 74 68 65 20  mmand tests the 
96f0: 70 75 74 56 61 72 69 6e 74 28 29 20 61 6e 64 20  putVarint() and 
9700: 67 65 74 56 61 72 69 6e 74 28 29 0a 2a 2a 20 72  getVarint().** r
9710: 6f 75 74 69 6e 65 73 2c 20 62 6f 74 68 20 66 6f  outines, both fo
9720: 72 20 61 63 63 75 72 61 63 79 20 61 6e 64 20 66  r accuracy and f
9730: 6f 72 20 73 70 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  or speed..**.** 
9740: 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
9750: 69 74 74 65 6e 20 75 73 69 6e 67 20 70 75 74 56  itten using putV
9760: 61 72 69 6e 74 28 29 20 61 6e 64 20 72 65 61 64  arint() and read
9770: 20 62 61 63 6b 20 77 69 74 68 0a 2a 2a 20 67 65   back with.** ge
9780: 74 56 61 72 69 6e 74 28 29 20 61 6e 64 20 76 61  tVarint() and va
9790: 72 69 66 69 65 64 20 74 6f 20 62 65 20 75 6e 63  rified to be unc
97a0: 68 61 6e 67 65 64 2e 20 20 54 68 69 73 20 72 65  hanged.  This re
97b0: 70 65 61 74 73 20 43 4f 55 4e 54 0a 2a 2a 20 74  peats COUNT.** t
97c0: 69 6d 65 73 2e 20 20 54 68 65 20 66 69 72 73 74  imes.  The first
97d0: 20 69 6e 74 65 67 65 72 20 69 73 20 53 54 41 52   integer is STAR
97e0: 54 2a 4d 55 4c 54 49 50 4c 49 45 52 2e 20 20 45  T*MULTIPLIER.  E
97f0: 61 63 68 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a  ach iteration.**
9800: 20 69 6e 63 72 65 61 73 65 73 20 74 68 65 20 69   increases the i
9810: 6e 74 65 67 65 72 20 62 79 20 49 4e 43 52 45 4d  nteger by INCREM
9820: 45 4e 54 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ENT..**.** This 
9830: 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
9840: 6e 6f 74 68 69 6e 67 20 69 66 20 69 74 20 77 6f  nothing if it wo
9850: 72 6b 73 2e 20 20 49 74 20 72 65 74 75 72 6e 73  rks.  It returns
9860: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9870: 65 0a 2a 2a 20 69 66 20 73 6f 6d 65 74 68 69 6e  e.** if somethin
9880: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
9890: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
98a0: 65 5f 76 61 72 69 6e 74 5f 74 65 73 74 28 0a 20  e_varint_test(. 
98b0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
98c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
98d0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
98e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
98f0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9900: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9910: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9930: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9940: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
9950: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
9960: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9970: 74 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 73 74  t */.){.  u32 st
9980: 61 72 74 2c 20 6d 75 6c 74 2c 20 63 6f 75 6e 74  art, mult, count
9990: 2c 20 69 6e 63 72 3b 0a 20 20 75 36 34 20 69 6e  , incr;.  u64 in
99a0: 2c 20 6f 75 74 3b 0a 20 20 69 6e 74 20 6e 31 2c  , out;.  int n1,
99b0: 20 6e 32 2c 20 69 2c 20 6a 3b 0a 20 20 75 6e 73   n2, i, j;.  uns
99c0: 69 67 6e 65 64 20 63 68 61 72 20 7a 42 75 66 5b  igned char zBuf[
99d0: 31 30 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  100];.  if( argc
99e0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
99f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9a00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9a10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9a20: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9a30: 20 20 22 20 53 54 41 52 54 20 4d 55 4c 54 49 50    " START MULTIP
9a40: 4c 49 45 52 20 43 4f 55 4e 54 20 49 4e 43 52 45  LIER COUNT INCRE
9a50: 4d 45 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20  MENT\"", 0);.   
9a60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a70: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
9a80: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
9a90: 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26  argv[1], (int*)&
9aa0: 73 74 61 72 74 29 20 29 20 72 65 74 75 72 6e 20  start) ) return 
9ab0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
9ac0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9ad0: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e  rp, argv[2], (in
9ae0: 74 2a 29 26 6d 75 6c 74 29 20 29 20 72 65 74 75  t*)&mult) ) retu
9af0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9b00: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9b10: 6e 74 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20  nterp, argv[3], 
9b20: 28 69 6e 74 2a 29 26 63 6f 75 6e 74 29 20 29 20  (int*)&count) ) 
9b30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9b40: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
9b50: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
9b60: 34 5d 2c 20 28 69 6e 74 2a 29 26 69 6e 63 72 29  4], (int*)&incr)
9b70: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9b80: 52 4f 52 3b 0a 20 20 69 6e 20 3d 20 73 74 61 72  ROR;.  in = star
9b90: 74 3b 0a 20 20 69 6e 20 2a 3d 20 6d 75 6c 74 3b  t;.  in *= mult;
9ba0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f  .  for(i=0; i<co
9bb0: 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  unt; i++){.    c
9bc0: 68 61 72 20 7a 45 72 72 5b 32 30 30 5d 3b 0a 20  har zErr[200];. 
9bd0: 20 20 20 6e 31 20 3d 20 70 75 74 56 61 72 69 6e     n1 = putVarin
9be0: 74 28 7a 42 75 66 2c 20 69 6e 29 3b 0a 20 20 20  t(zBuf, in);.   
9bf0: 20 69 66 28 20 6e 31 3e 39 20 7c 7c 20 6e 31 3c   if( n1>9 || n1<
9c00: 31 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  1 ){.      sprin
9c10: 74 66 28 7a 45 72 72 2c 20 22 70 75 74 56 61 72  tf(zErr, "putVar
9c20: 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64 20  int returned %d 
9c30: 2d 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77  - should be betw
9c40: 65 65 6e 20 31 20 61 6e 64 20 39 22 2c 20 6e 31  een 1 and 9", n1
9c50: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
9c60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9c70: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
9c80: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9c90: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 32  OR;.    }.    n2
9ca0: 20 3d 20 67 65 74 56 61 72 69 6e 74 28 7a 42 75   = getVarint(zBu
9cb0: 66 2c 20 26 6f 75 74 29 3b 0a 20 20 20 20 69 66  f, &out);.    if
9cc0: 28 20 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20  ( n1!=n2 ){.    
9cd0: 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 20    sprintf(zErr, 
9ce0: 22 70 75 74 56 61 72 69 6e 74 20 72 65 74 75 72  "putVarint retur
9cf0: 6e 65 64 20 25 64 20 61 6e 64 20 67 65 74 56 61  ned %d and getVa
9d00: 72 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64  rint returned %d
9d10: 22 2c 20 6e 31 2c 20 6e 32 29 3b 0a 20 20 20 20  ", n1, n2);.    
9d20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9d30: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
9d40: 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
9d50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9d60: 20 7d 0a 20 20 20 20 69 66 28 20 69 6e 21 3d 6f   }.    if( in!=o
9d70: 75 74 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69  ut ){.      spri
9d80: 6e 74 66 28 7a 45 72 72 2c 20 22 57 72 6f 74 65  ntf(zErr, "Wrote
9d90: 20 30 78 25 30 31 36 6c 6c 78 20 61 6e 64 20 67   0x%016llx and g
9da0: 6f 74 20 62 61 63 6b 20 30 78 25 30 31 36 6c 6c  ot back 0x%016ll
9db0: 78 22 2c 20 69 6e 2c 20 6f 75 74 29 3b 0a 20 20  x", in, out);.  
9dc0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9dd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
9de0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r, 0);.      ret
9df0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 69 6e     }.    if( (in
9e10: 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3d 3d   & 0xffffffff)==
9e20: 69 6e 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  in ){.      u32 
9e30: 6f 75 74 33 32 3b 0a 20 20 20 20 20 20 6e 32 20  out32;.      n2 
9e40: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 7a 42  = getVarint32(zB
9e50: 75 66 2c 20 6f 75 74 33 32 29 3b 0a 20 20 20 20  uf, out32);.    
9e60: 20 20 6f 75 74 20 3d 20 6f 75 74 33 32 3b 0a 20    out = out32;. 
9e70: 20 20 20 20 20 69 66 28 20 6e 31 21 3d 6e 32 20       if( n1!=n2 
9e80: 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e  ){.        sprin
9e90: 74 66 28 7a 45 72 72 2c 20 22 70 75 74 56 61 72  tf(zErr, "putVar
9ea0: 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64 20  int returned %d 
9eb0: 61 6e 64 20 47 65 74 56 61 72 69 6e 74 33 32 20  and GetVarint32 
9ec0: 72 65 74 75 72 6e 65 64 20 25 64 22 2c 20 0a 20  returned %d", . 
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 6e 31 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20   n1, n2);.      
9ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9f00: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
9f10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
9f20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9f40: 20 69 6e 21 3d 6f 75 74 20 29 7b 0a 20 20 20 20   in!=out ){.    
9f50: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72      sprintf(zErr
9f60: 2c 20 22 57 72 6f 74 65 20 30 78 25 30 31 36 6c  , "Wrote 0x%016l
9f70: 6c 78 20 61 6e 64 20 67 6f 74 20 62 61 63 6b 20  lx and got back 
9f80: 30 78 25 30 31 36 6c 6c 78 20 66 72 6f 6d 20 47  0x%016llx from G
9f90: 65 74 56 61 72 69 6e 74 33 32 22 2c 0a 20 20 20  etVarint32",.   
9fa0: 20 20 20 20 20 20 20 20 20 69 6e 2c 20 6f 75 74           in, out
9fb0: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  );.        Tcl_A
9fc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9fd0: 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20  rp, zErr, 0);.  
9fe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
9ff0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
a000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
a010: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 72 65   order to get re
a020: 61 6c 69 73 74 69 63 20 74 69 6d 69 6e 67 73 2c  alistic timings,
a030: 20 72 75 6e 20 67 65 74 56 61 72 69 6e 74 20 31   run getVarint 1
a040: 39 20 6d 6f 72 65 20 74 69 6d 65 73 2e 0a 20 20  9 more times..  
a050: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
a060: 61 75 73 65 20 67 65 74 56 61 72 69 6e 74 20 69  ause getVarint i
a070: 73 20 63 61 6c 6c 65 64 20 61 62 6f 75 74 20 32  s called about 2
a080: 30 20 74 69 6d 65 73 20 6d 6f 72 65 20 6f 66 74  0 times more oft
a090: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70  en.    ** than p
a0a0: 75 74 56 61 72 69 6e 74 2e 0a 20 20 20 20 2a 2f  utVarint..    */
a0b0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
a0c0: 31 39 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  19; j++){.      
a0d0: 67 65 74 56 61 72 69 6e 74 28 7a 42 75 66 2c 20  getVarint(zBuf, 
a0e0: 26 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &out);.    }.   
a0f0: 20 69 6e 20 2b 3d 20 69 6e 63 72 3b 0a 20 20 7d   in += incr;.  }
a100: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
a110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 75 73 61 67 65  ;.}../*.** usage
a120: 3a 20 20 20 62 74 72 65 65 5f 66 72 6f 6d 5f 64  :   btree_from_d
a130: 62 20 20 44 42 2d 48 41 4e 44 4c 45 0a 2a 2a 0a  b  DB-HANDLE.**.
a140: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
a150: 72 65 74 75 72 6e 73 20 74 68 65 20 62 74 72 65  returns the btre
a160: 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
a170: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 61   main database a
a180: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
a190: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 2d 68  h the database-h
a1a0: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
a1b0: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 45 78  the argument. Ex
a1c0: 61 6d 70 6c 65 20 75 73 61 67 65 3a 0a 2a 2a 0a  ample usage:.**.
a1d0: 2a 2a 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  ** sqlite3 db te
a1e0: 73 74 2e 64 62 0a 2a 2a 20 73 65 74 20 62 74 20  st.db.** set bt 
a1f0: 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 20 64  [btree_from_db d
a200: 62 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b].*/.static int
a210: 20 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62 28 0a   btree_from_db(.
a220: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a230: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a240: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a250: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a260: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a270: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a280: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a290: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a2a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a2b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
a2c0: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
a2d0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a2e0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a2f0: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 54 63 6c  zBuf[100];.  Tcl
a300: 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  _CmdInfo info;. 
a310: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
a320: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
a330: 74 20 69 44 62 20 3d 20 30 3b 0a 0a 20 20 69 66  t iDb = 0;..  if
a340: 28 20 61 72 67 63 21 3d 32 20 26 26 20 61 72 67  ( argc!=2 && arg
a350: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
a360: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a370: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
a380: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
a390: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
a3a0: 20 20 20 22 20 44 42 2d 48 41 4e 44 4c 45 20 3f     " DB-HANDLE ?
a3b0: 4e 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  N?\"", 0);.    r
a3c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a3d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 31 21 3d 54  .  }..  if( 1!=T
a3e0: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
a3f0: 6f 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  o(interp, argv[1
a400: 5d 2c 20 26 69 6e 66 6f 29 20 29 7b 0a 20 20 20  ], &info) ){.   
a410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a420: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 73 75  t(interp, "No su
a430: 63 68 20 64 62 2d 68 61 6e 64 6c 65 3a 20 5c 22  ch db-handle: \"
a440: 22 2c 20 61 72 67 76 5b 31 5d 2c 20 22 5c 22 22  ", argv[1], "\""
a450: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a460: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a470: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
a480: 0a 20 20 20 20 69 44 62 20 3d 20 61 74 6f 69 28  .    iDb = atoi(
a490: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d 0a 0a 20  argv[2]);.  }.. 
a4a0: 20 64 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33   db = *((sqlite3
a4b0: 20 2a 2a 29 69 6e 66 6f 2e 6f 62 6a 43 6c 69 65   **)info.objClie
a4c0: 6e 74 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  ntData);.  asser
a4d0: 74 28 20 64 62 20 29 3b 0a 0a 20 20 70 42 74 20  t( db );..  pBt 
a4e0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
a4f0: 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  Bt;.  sqlite3_sn
a500: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
a510: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22 2c  uf), zBuf, "%p",
a520: 20 70 42 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74   pBt);.  Tcl_Set
a530: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
a540: 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  Buf, TCL_VOLATIL
a550: 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
a560: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 75  _OK;.}.../*.** u
a570: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 73 65  sage:   btree_se
a580: 74 5f 63 61 63 68 65 5f 73 69 7a 65 20 49 44 20  t_cache_size ID 
a590: 4e 43 41 43 48 45 0a 2a 2a 0a 2a 2a 20 53 65 74  NCACHE.**.** Set
a5a0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a5b0: 20 63 61 63 68 65 20 75 73 65 64 20 62 79 20 62   cache used by b
a5c0: 74 72 65 65 20 24 49 44 2e 0a 2a 2f 0a 73 74 61  tree $ID..*/.sta
a5d0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 73 65  tic int btree_se
a5e0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 0a 20 20  t_cache_size(.  
a5f0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
a600: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
a610: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
a620: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
a630: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
a640: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
a650: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
a660: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a670: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a680: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
a690: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
a6a0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
a6b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 61   */.){.  int nCa
a6c0: 63 68 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  che;.  Btree *pB
a6d0: 74 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  t;..  if( argc!=
a6e0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
a6f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a700: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
a710: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
a720: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
a730: 22 20 42 54 20 4e 43 41 43 48 45 5c 22 22 2c 20  " BT NCACHE\"", 
a740: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a750: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a760: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78  pBt = sqlite3Tex
a770: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
a780: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
a790: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
a7a0: 5d 2c 20 26 6e 43 61 63 68 65 29 20 29 20 72 65  ], &nCache) ) re
a7b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a7c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a7d0: 5f 65 6e 74 65 72 28 70 42 74 2d 3e 64 62 2d 3e  _enter(pBt->db->
a7e0: 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
a7f0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
a800: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
a810: 53 65 74 43 61 63 68 65 53 69 7a 65 28 70 42 74  SetCacheSize(pBt
a820: 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 73 71 6c  , nCache);.  sql
a830: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
a840: 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Bt);.  sqlite3_m
a850: 75 74 65 78 5f 6c 65 61 76 65 28 70 42 74 2d 3e  utex_leave(pBt->
a860: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 72  db->mutex);..  r
a870: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a880: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
a890: 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74   commands with t
a8a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
a8b0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74  er..*/.int Sqlit
a8c0: 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c 5f  etest3_Init(Tcl_
a8d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
a8e0: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
a8f0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3b  lite3BtreeTrace;
a900: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
a910: 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
a920: 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d  ame;.     Tcl_Cm
a930: 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
a940: 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  } aCmd[] = {.   
a950: 20 20 7b 20 22 62 74 72 65 65 5f 6f 70 65 6e 22    { "btree_open"
a960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a970: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
a980: 72 65 65 5f 6f 70 65 6e 20 20 20 20 20 20 20 20  ree_open        
a990: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
a9a0: 20 22 62 74 72 65 65 5f 63 6c 6f 73 65 22 2c 20   "btree_close", 
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
a9c0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
a9d0: 5f 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20  _close          
a9e0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
a9f0: 74 72 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73  tree_begin_trans
aa00: 61 63 74 69 6f 6e 22 2c 20 20 28 54 63 6c 5f 43  action",  (Tcl_C
aa10: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 62 65  mdProc*)btree_be
aa20: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin_transaction 
aa30: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
aa40: 65 5f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20  e_commit",      
aa50: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
aa60: 72 6f 63 2a 29 62 74 72 65 65 5f 63 6f 6d 6d 69  roc*)btree_commi
aa70: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t             },
aa80: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 72  .     { "btree_r
aa90: 6f 6c 6c 62 61 63 6b 22 2c 20 20 20 20 20 20 20  ollback",       
aaa0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
aab0: 2a 29 62 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b  *)btree_rollback
aac0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
aad0: 20 20 20 7b 20 22 62 74 72 65 65 5f 63 72 65 61     { "btree_crea
aae0: 74 65 5f 74 61 62 6c 65 22 2c 20 20 20 20 20 20  te_table",      
aaf0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
ab00: 74 72 65 65 5f 63 72 65 61 74 65 5f 74 61 62 6c  tree_create_tabl
ab10: 65 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  e       },.     
ab20: 7b 20 22 62 74 72 65 65 5f 64 72 6f 70 5f 74 61  { "btree_drop_ta
ab30: 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 54  ble",         (T
ab40: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
ab50: 65 5f 64 72 6f 70 5f 74 61 62 6c 65 20 20 20 20  e_drop_table    
ab60: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
ab70: 62 74 72 65 65 5f 63 6c 65 61 72 5f 74 61 62 6c  btree_clear_tabl
ab80: 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
ab90: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63  CmdProc*)btree_c
aba0: 6c 65 61 72 5f 74 61 62 6c 65 20 20 20 20 20 20  lear_table      
abb0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
abc0: 65 65 5f 67 65 74 5f 6d 65 74 61 22 2c 20 20 20  ee_get_meta",   
abd0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
abe0: 50 72 6f 63 2a 29 62 74 72 65 65 5f 67 65 74 5f  Proc*)btree_get_
abf0: 6d 65 74 61 20 20 20 20 20 20 20 20 20 20 20 7d  meta           }
ac00: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
ac10: 75 70 64 61 74 65 5f 6d 65 74 61 22 2c 20 20 20  update_meta",   
ac20: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
ac30: 63 2a 29 62 74 72 65 65 5f 75 70 64 61 74 65 5f  c*)btree_update_
ac40: 6d 65 74 61 20 20 20 20 20 20 20 20 7d 2c 0a 20  meta        },. 
ac50: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61 67      { "btree_pag
ac60: 65 5f 64 75 6d 70 22 2c 20 20 20 20 20 20 20 20  e_dump",        
ac70: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
ac80: 62 74 72 65 65 5f 70 61 67 65 5f 64 75 6d 70 20  btree_page_dump 
ac90: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
aca0: 20 7b 20 22 62 74 72 65 65 5f 74 72 65 65 5f 64   { "btree_tree_d
acb0: 75 6d 70 22 2c 20 20 20 20 20 20 20 20 20 20 28  ump",          (
acc0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
acd0: 65 65 5f 74 72 65 65 5f 64 75 6d 70 20 20 20 20  ee_tree_dump    
ace0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
acf0: 22 62 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61  "btree_pager_sta
ad00: 74 73 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  ts",        (Tcl
ad10: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
ad20: 70 61 67 65 72 5f 73 74 61 74 73 20 20 20 20 20  pager_stats     
ad30: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
ad40: 72 65 65 5f 70 61 67 65 72 5f 72 65 66 5f 64 75  ree_pager_ref_du
ad50: 6d 70 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  mp",     (Tcl_Cm
ad60: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 70 61 67  dProc*)btree_pag
ad70: 65 72 5f 72 65 66 5f 64 75 6d 70 20 20 20 20 20  er_ref_dump     
ad80: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
ad90: 5f 63 75 72 73 6f 72 22 2c 20 20 20 20 20 20 20  _cursor",       
ada0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
adb0: 6f 63 2a 29 62 74 72 65 65 5f 63 75 72 73 6f 72  oc*)btree_cursor
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
add0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63 6c       { "btree_cl
ade0: 6f 73 65 5f 63 75 72 73 6f 72 22 2c 20 20 20 20  ose_cursor",    
adf0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
ae00: 29 62 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72  )btree_close_cur
ae10: 73 6f 72 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  sor       },.   
ae20: 20 20 7b 20 22 62 74 72 65 65 5f 6d 6f 76 65 5f    { "btree_move_
ae30: 74 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  to",            
ae40: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
ae50: 72 65 65 5f 6d 6f 76 65 5f 74 6f 20 20 20 20 20  ree_move_to     
ae60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
ae70: 20 22 62 74 72 65 65 5f 64 65 6c 65 74 65 22 2c   "btree_delete",
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
ae90: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
aea0: 5f 64 65 6c 65 74 65 20 20 20 20 20 20 20 20 20  _delete         
aeb0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
aec0: 74 72 65 65 5f 6e 65 78 74 22 2c 20 20 20 20 20  tree_next",     
aed0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
aee0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6e 65  mdProc*)btree_ne
aef0: 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
af00: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
af10: 65 5f 70 72 65 76 22 2c 20 20 20 20 20 20 20 20  e_prev",        
af20: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
af30: 72 6f 63 2a 29 62 74 72 65 65 5f 70 72 65 76 20  roc*)btree_prev 
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
af50: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 65  .     { "btree_e
af60: 6f 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  of",            
af70: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
af80: 2a 29 62 74 72 65 65 5f 65 6f 66 20 20 20 20 20  *)btree_eof     
af90: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
afa0: 20 20 20 7b 20 22 62 74 72 65 65 5f 6b 65 79 73     { "btree_keys
afb0: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
afc0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
afd0: 74 72 65 65 5f 6b 65 79 73 69 7a 65 20 20 20 20  tree_keysize    
afe0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
aff0: 7b 20 22 62 74 72 65 65 5f 6b 65 79 22 2c 20 20  { "btree_key",  
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
b010: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
b020: 65 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  e_key           
b030: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
b040: 62 74 72 65 65 5f 64 61 74 61 22 2c 20 20 20 20  btree_data",    
b050: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
b060: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 64  CmdProc*)btree_d
b070: 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20 20  ata             
b080: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
b090: 65 65 5f 66 65 74 63 68 5f 6b 65 79 22 2c 20 20  ee_fetch_key",  
b0a0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
b0b0: 50 72 6f 63 2a 29 62 74 72 65 65 5f 66 65 74 63  Proc*)btree_fetc
b0c0: 68 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 7d  h_key          }
b0d0: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
b0e0: 66 65 74 63 68 5f 64 61 74 61 22 2c 20 20 20 20  fetch_data",    
b0f0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
b100: 63 2a 29 62 74 72 65 65 5f 66 65 74 63 68 5f 64  c*)btree_fetch_d
b110: 61 74 61 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ata         },. 
b120: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61 79      { "btree_pay
b130: 6c 6f 61 64 5f 73 69 7a 65 22 2c 20 20 20 20 20  load_size",     
b140: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
b150: 62 74 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 69  btree_payload_si
b160: 7a 65 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ze       },.    
b170: 20 7b 20 22 62 74 72 65 65 5f 66 69 72 73 74 22   { "btree_first"
b180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
b190: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
b1a0: 65 65 5f 66 69 72 73 74 20 20 20 20 20 20 20 20  ee_first        
b1b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
b1c0: 22 62 74 72 65 65 5f 6c 61 73 74 22 2c 20 20 20  "btree_last",   
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
b1e0: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
b1f0: 6c 61 73 74 20 20 20 20 20 20 20 20 20 20 20 20  last            
b200: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
b210: 72 65 65 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  ree_integrity_ch
b220: 65 63 6b 22 2c 20 20 20 20 28 54 63 6c 5f 43 6d  eck",    (Tcl_Cm
b230: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 69 6e 74  dProc*)btree_int
b240: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 20 20 20  egrity_check    
b250: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
b260: 5f 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20  _breakpoint",   
b270: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
b280: 6f 63 2a 29 62 74 72 65 65 5f 62 72 65 61 6b 70  oc*)btree_breakp
b290: 6f 69 6e 74 20 20 20 20 20 20 20 20 20 7d 2c 0a  oint         },.
b2a0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 76 61       { "btree_va
b2b0: 72 69 6e 74 5f 74 65 73 74 22 2c 20 20 20 20 20  rint_test",     
b2c0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
b2d0: 29 62 74 72 65 65 5f 76 61 72 69 6e 74 5f 74 65  )btree_varint_te
b2e0: 73 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  st        },.   
b2f0: 20 20 7b 20 22 62 74 72 65 65 5f 62 65 67 69 6e    { "btree_begin
b300: 5f 73 74 61 74 65 6d 65 6e 74 22 2c 20 20 20 20  _statement",    
b310: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
b320: 72 65 65 5f 62 65 67 69 6e 5f 73 74 61 74 65 6d  ree_begin_statem
b330: 65 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ent    },.     {
b340: 20 22 62 74 72 65 65 5f 63 6f 6d 6d 69 74 5f 73   "btree_commit_s
b350: 74 61 74 65 6d 65 6e 74 22 2c 20 20 20 28 54 63  tatement",   (Tc
b360: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
b370: 5f 63 6f 6d 6d 69 74 5f 73 74 61 74 65 6d 65 6e  _commit_statemen
b380: 74 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62  t   },.     { "b
b390: 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b 5f 73 74  tree_rollback_st
b3a0: 61 74 65 6d 65 6e 74 22 2c 20 28 54 63 6c 5f 43  atement", (Tcl_C
b3b0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 72 6f  mdProc*)btree_ro
b3c0: 6c 6c 62 61 63 6b 5f 73 74 61 74 65 6d 65 6e 74  llback_statement
b3d0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
b3e0: 65 5f 66 72 6f 6d 5f 64 62 22 2c 20 20 20 20 20  e_from_db",     
b3f0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
b400: 72 6f 63 2a 29 62 74 72 65 65 5f 66 72 6f 6d 5f  roc*)btree_from_
b410: 64 62 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  db            },
b420: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 73  .     { "btree_s
b430: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 22 2c 20  et_cache_size", 
b440: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
b450: 2a 29 62 74 72 65 65 5f 73 65 74 5f 63 61 63 68  *)btree_set_cach
b460: 65 5f 73 69 7a 65 20 20 20 20 20 7d 2c 0a 20 20  e_size     },.  
b470: 20 20 20 7b 20 22 62 74 72 65 65 5f 63 75 72 73     { "btree_curs
b480: 6f 72 5f 69 6e 66 6f 22 2c 20 20 20 20 20 20 20  or_info",       
b490: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
b4a0: 74 72 65 65 5f 63 75 72 73 6f 72 5f 69 6e 66 6f  tree_cursor_info
b4b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
b4c0: 7b 20 22 62 74 72 65 65 5f 6f 76 66 6c 5f 69 6e  { "btree_ovfl_in
b4d0: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  fo",          (T
b4e0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
b4f0: 65 5f 6f 76 66 6c 5f 69 6e 66 6f 20 20 20 20 20  e_ovfl_info     
b500: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
b510: 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 6c 69 73  btree_cursor_lis
b520: 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
b530: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63  CmdProc*)btree_c
b540: 75 72 73 6f 72 5f 6c 69 73 74 20 20 20 20 20 20  ursor_list      
b550: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
b560: 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  i;..  for(i=0; i
b570: 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69  <sizeof(aCmd)/si
b580: 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69  zeof(aCmd[0]); i
b590: 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
b5a0: 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
b5b0: 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65  p, aCmd[i].zName
b5c0: 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c  , aCmd[i].xProc,
b5d0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63   0, 0);.  }.  Tc
b5e0: 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
b5f0: 2c 20 22 62 74 72 65 65 5f 74 72 61 63 65 22 2c  , "btree_trace",
b600: 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
b610: 42 74 72 65 65 54 72 61 63 65 2c 0a 20 20 20 20  BtreeTrace,.    
b620: 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
b630: 0a 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 5f  .  /* The btree_
b640: 69 6e 73 65 72 74 20 63 6f 6d 6d 61 6e 64 20 69  insert command i
b650: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
b660: 69 6e 67 20 74 68 65 20 74 63 6c 20 27 6f 62 6a  ing the tcl 'obj
b670: 65 63 74 27 0a 20 20 2a 2a 20 69 6e 74 65 72 66  ect'.  ** interf
b680: 61 63 65 2c 20 6e 6f 74 20 74 68 65 20 73 74 72  ace, not the str
b690: 69 6e 67 20 69 6e 74 65 72 66 61 63 65 20 6c 69  ing interface li
b6a0: 6b 65 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ke the other com
b6b0: 6d 61 6e 64 73 20 69 6e 20 74 68 69 73 0a 20 20  mands in this.  
b6c0: 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ** file. This is
b6d0: 20 73 6f 20 62 69 6e 61 72 79 20 64 61 74 61 20   so binary data 
b6e0: 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64 20  can be inserted 
b6f0: 69 6e 74 6f 20 62 74 72 65 65 20 74 61 62 6c 65  into btree table
b700: 73 2e 0a 20 20 2a 2f 0a 20 20 54 63 6c 5f 43 72  s..  */.  Tcl_Cr
b710: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
b720: 6e 74 65 72 70 2c 20 22 62 74 72 65 65 5f 69 6e  nterp, "btree_in
b730: 73 65 72 74 22 2c 20 62 74 72 65 65 5f 69 6e 73  sert", btree_ins
b740: 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  ert, 0, 0);.  re
b750: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a     turn TCL_OK;.}.