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

Artifact 5705fc361dd60fe830f1934841aee509c733c6a9:


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 36 20 32 30 30 38 2f 30 35 2f 32 37 20 32  .96 2008/05/27 2
0240: 30 3a 31 37 3a 30 31 20 73 68 61 6e 65 20 45 78  0:17:01 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 33 32 20 76  f[30];.    u32 v
2c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
2c30: 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
2c40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2c50: 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20  reeGetMeta(pBt, 
2c60: 69 2c 20 26 76 29 3b 0a 20 20 20 20 73 71 6c 69  i, &v);.    sqli
2c70: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
2c80: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
2c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ca0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2cb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
2cc0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
2cd0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2ce0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
2cf0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d00: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
2d10: 7a 42 75 66 2c 22 25 64 22 2c 76 29 3b 0a 20 20  zBuf,"%d",v);.  
2d20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2d30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
2d40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2d50: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2d60: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
2d70: 75 70 64 61 74 65 5f 6d 65 74 61 20 49 44 20 4d  update_meta ID M
2d80: 45 54 41 44 41 54 41 2e 2e 2e 0a 2a 2a 0a 2a 2a  ETADATA....**.**
2d90: 20 52 65 74 75 72 6e 20 6d 65 74 61 20 64 61 74   Return meta dat
2da0: 61 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  a.*/.static int 
2db0: 62 74 72 65 65 5f 75 70 64 61 74 65 5f 6d 65 74  btree_update_met
2dc0: 61 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  a(.  void *NotUs
2dd0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2de0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2df0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2e00: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2e10: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2e20: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e40: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2e50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2e60: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
2e70: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
2e80: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
2e90: 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
2ea0: 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  rc;.  int i;.  i
2eb0: 6e 74 20 61 4d 65 74 61 5b 53 51 4c 49 54 45 5f  nt aMeta[SQLITE_
2ec0: 4e 5f 42 54 52 45 45 5f 4d 45 54 41 5d 3b 0a 0a  N_BTREE_META];..
2ed0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 2b 53 51    if( argc!=2+SQ
2ee0: 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
2ef0: 41 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  A ){.    char zB
2f00: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[30];.    sqli
2f10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2f20: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
2f30: 22 25 64 22 2c 53 51 4c 49 54 45 5f 4e 5f 42 54  "%d",SQLITE_N_BT
2f40: 52 45 45 5f 4d 45 54 41 29 3b 0a 20 20 20 20 54  REE_META);.    T
2f50: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2f60: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2f70: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2f80: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
2f90: 20 20 20 20 20 20 22 20 49 44 20 4d 45 54 41 44        " ID METAD
2fa0: 41 54 41 2e 2e 2e 5c 22 20 28 4d 45 54 41 44 41  ATA...\" (METADA
2fb0: 54 41 20 69 73 20 22 2c 20 7a 42 75 66 2c 20 22  TA is ", zBuf, "
2fc0: 20 69 6e 74 65 67 65 72 73 29 22 2c 20 30 29 3b   integers)", 0);
2fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2fe0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74  ERROR;.  }.  pBt
2ff0: 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f   = sqlite3TextTo
3000: 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  Ptr(argv[1]);.  
3010: 66 6f 72 28 69 3d 31 3b 20 69 3c 53 51 4c 49 54  for(i=1; i<SQLIT
3020: 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 3b 20  E_N_BTREE_META; 
3030: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
3040: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
3050: 20 61 72 67 76 5b 69 2b 32 5d 2c 20 26 61 4d 65   argv[i+2], &aMe
3060: 74 61 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20  ta[i]) ) return 
3070: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
3080: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 53 51 4c 49   for(i=1; i<SQLI
3090: 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 3b  TE_N_BTREE_META;
30a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
30b0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
30c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
30d0: 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
30e0: 74 61 28 70 42 74 2c 20 69 2c 20 61 4d 65 74 61  ta(pBt, i, aMeta
30f0: 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  [i]);.    sqlite
3100: 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
3110: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
3120: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3130: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3140: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
3150: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
3160: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3170: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
3180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3190: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
31a0: 20 20 62 74 72 65 65 5f 70 61 67 65 5f 64 75 6d    btree_page_dum
31b0: 70 20 49 44 20 50 41 47 45 4e 55 4d 0a 2a 2a 0a  p ID PAGENUM.**.
31c0: 2a 2a 20 50 72 69 6e 74 20 61 20 64 69 73 61 73  ** Print a disas
31d0: 73 65 6d 62 6c 79 20 6f 66 20 61 20 70 61 67 65  sembly of a page
31e0: 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74   on standard out
31f0: 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  put.*/.static in
3200: 74 20 62 74 72 65 65 5f 70 61 67 65 5f 64 75 6d  t btree_page_dum
3210: 70 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  p(.  void *NotUs
3220: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
3230: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
3240: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3250: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3260: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3270: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3290: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
32a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
32b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
32c0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
32d0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
32e0: 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
32f0: 69 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  iPage;.  int rc;
3300: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ..  if( argc!=3 
3310: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3320: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3330: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
3340: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
3350: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
3360: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
3370: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3380: 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c  .  }.  pBt = sql
3390: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
33a0: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63  gv[1]);.  if( Tc
33b0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
33c0: 20 61 72 67 76 5b 32 5d 2c 20 26 69 50 61 67 65   argv[2], &iPage
33d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
33e0: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 42  RROR;.  sqlite3B
33f0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
3400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
3410: 72 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c  reePageDump(pBt,
3420: 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 73 71   iPage, 0);.  sq
3430: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
3440: 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pBt);.  if( rc!=
3450: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3460: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3470: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
3480: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
3490: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
34a0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
34b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
34c0: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
34d0: 74 72 65 65 5f 64 75 6d 70 20 49 44 20 50 41 47  tree_dump ID PAG
34e0: 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74  ENUM.**.** Print
34f0: 20 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f   a disassembly o
3500: 66 20 61 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  f a page and all
3510: 20 69 74 73 20 63 68 69 6c 64 20 70 61 67 65 73   its child pages
3520: 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74   on standard out
3530: 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  put.*/.static in
3540: 74 20 62 74 72 65 65 5f 74 72 65 65 5f 64 75 6d  t btree_tree_dum
3550: 70 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  p(.  void *NotUs
3560: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
3570: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
3580: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3590: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
35a0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
35b0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
35c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35d0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
35e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
35f0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
3600: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3610: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
3620: 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
3630: 69 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  iPage;.  int rc;
3640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ..  if( argc!=3 
3650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
3680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
3690: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
36a0: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
36b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
36c0: 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c  .  }.  pBt = sql
36d0: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
36e0: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63  gv[1]);.  if( Tc
36f0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
3700: 20 61 72 67 76 5b 32 5d 2c 20 26 69 50 61 67 65   argv[2], &iPage
3710: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3720: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 42  RROR;.  sqlite3B
3730: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
3740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
3750: 72 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c  reePageDump(pBt,
3760: 20 69 50 61 67 65 2c 20 31 29 3b 0a 20 20 73 71   iPage, 1);.  sq
3770: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
3780: 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pBt);.  if( rc!=
3790: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
37b0: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
37c0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
37d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
37e0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
37f0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
3800: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
3810: 70 61 67 65 72 5f 73 74 61 74 73 20 49 44 0a 2a  pager_stats ID.*
3820: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 70 61 67  *.** Returns pag
3830: 65 72 20 73 74 61 74 69 73 74 69 63 73 0a 2a 2f  er statistics.*/
3840: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
3850: 65 5f 70 61 67 65 72 5f 73 74 61 74 73 28 0a 20  e_pager_stats(. 
3860: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
3870: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3880: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
3890: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
38a0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
38b0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
38c0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
38d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
38e0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
38f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
3900: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
3910: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
3920: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20  t */.){.  Btree 
3930: 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pBt;.  int i;. 
3940: 20 69 6e 74 20 2a 61 3b 0a 0a 20 20 69 66 28 20   int *a;..  if( 
3950: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
3960: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3970: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3980: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
3990: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
39a0: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30        " ID\"", 0
39b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
39c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
39d0: 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74  Bt = sqlite3Text
39e0: 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a  ToPtr(argv[1]);.
39f0: 20 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20   .  /* Normally 
3a00: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 77 69  in this file, wi
3a10: 74 68 20 61 20 62 2d 74 72 65 65 20 68 61 6e 64  th a b-tree hand
3a20: 6c 65 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  le opened using 
3a30: 74 68 65 20 0a 20 20 2a 2a 20 5b 62 74 72 65 65  the .  ** [btree
3a40: 5f 6f 70 65 6e 5d 20 63 6f 6d 6d 61 6e 64 20 69  _open] command i
3a50: 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 61 6c  t is safe to cal
3a60: 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  l sqlite3BtreeEn
3a70: 74 65 72 28 29 20 64 69 72 65 63 74 6c 79 2e 0a  ter() directly..
3a80: 20 20 2a 2a 20 42 75 74 20 74 68 69 73 20 66 75    ** But this fu
3a90: 6e 63 74 69 6f 6e 20 69 73 20 73 6f 6d 65 74 69  nction is someti
3aa0: 6d 65 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  mes called with 
3ab0: 61 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 6f  a btree handle o
3ac0: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 66 72 6f  btained.  ** fro
3ad0: 6d 20 61 6e 20 6f 70 65 6e 20 53 51 4c 69 74 65  m an open SQLite
3ae0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 75 73 69   connection (usi
3af0: 6e 67 20 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64  ng [btree_from_d
3b00: 62 5d 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73  b]). In this cas
3b10: 65 0a 20 20 2a 2a 20 77 65 20 6e 65 65 64 20 74  e.  ** we need t
3b20: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74  o obtain the mut
3b30: 65 78 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 72  ex for the contr
3b40: 6f 6c 6c 69 6e 67 20 53 51 4c 69 74 65 20 68 61  olling SQLite ha
3b50: 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a  ndle before.  **
3b60: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 63   it is safe to c
3b70: 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65  all sqlite3Btree
3b80: 45 6e 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  Enter()..  */.  
3b90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
3ba0: 74 65 72 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  ter(pBt->db->mut
3bb0: 65 78 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ex);..  sqlite3B
3bc0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
3bd0: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67    a = sqlite3Pag
3be0: 65 72 53 74 61 74 73 28 73 71 6c 69 74 65 33 42  erStats(sqlite3B
3bf0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
3c00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 31  .  for(i=0; i<11
3c10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  ; i++){.    stat
3c20: 69 63 20 63 68 61 72 20 2a 7a 4e 61 6d 65 5b 5d  ic char *zName[]
3c30: 20 3d 20 7b 0a 20 20 20 20 20 20 22 72 65 66 22   = {.      "ref"
3c40: 2c 20 22 70 61 67 65 22 2c 20 22 6d 61 78 22 2c  , "page", "max",
3c50: 20 22 73 69 7a 65 22 2c 20 22 73 74 61 74 65 22   "size", "state"
3c60: 2c 20 22 65 72 72 22 2c 0a 20 20 20 20 20 20 22  , "err",.      "
3c70: 68 69 74 22 2c 20 22 6d 69 73 73 22 2c 20 22 6f  hit", "miss", "o
3c80: 76 66 6c 22 2c 20 22 72 65 61 64 22 2c 20 22 77  vfl", "read", "w
3c90: 72 69 74 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20  rite".    };.   
3ca0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
3cb0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  .    Tcl_AppendE
3cc0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
3cd0: 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 73 71  Name[i]);.    sq
3ce0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3cf0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
3d00: 66 2c 22 25 64 22 2c 61 5b 69 5d 29 3b 0a 20 20  f,"%d",a[i]);.  
3d10: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3d20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
3d30: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3d40: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
3d50: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
3d60: 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
3d70: 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 20 74 68  SQLite handle th
3d80: 61 74 20 63 6f 6e 74 72 6f 6c 73 20 74 68 69 73  at controls this
3d90: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c   b-tree */.  sql
3da0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
3db0: 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
3dc0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3dd0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3de0: 65 3a 20 20 20 62 74 72 65 65 5f 70 61 67 65 72  e:   btree_pager
3df0: 5f 72 65 66 5f 64 75 6d 70 20 49 44 0a 2a 2a 0a  _ref_dump ID.**.
3e00: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 61 6c 6c  ** Print out all
3e10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
3e20: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
3e30: 74 20 62 74 72 65 65 5f 70 61 67 65 72 5f 72 65  t btree_pager_re
3e40: 66 5f 64 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a  f_dump(.  void *
3e50: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
3e60: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
3e70: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
3e80: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
3e90: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
3ea0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
3eb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
3ed0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
3ee0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3ef0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
3f00: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
3f10: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a  .  Btree *pBt;..
3f20: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
3f30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3f40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3f50: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3f60: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3f70: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
3f80: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
3f90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3fa0: 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74   }.  pBt = sqlit
3fb0: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
3fc0: 5b 31 5d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  [1]);.#ifdef SQL
3fd0: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
3fe0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
3ff0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
4000: 72 52 65 66 64 75 6d 70 28 73 71 6c 69 74 65 33  rRefdump(sqlite3
4010: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
4020: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4030: 4c 65 61 76 65 28 70 42 74 29 3b 0a 23 65 6e 64  Leave(pBt);.#end
4040: 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
4050: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4060: 67 65 3a 20 20 20 62 74 72 65 65 5f 69 6e 74 65  ge:   btree_inte
4070: 67 72 69 74 79 5f 63 68 65 63 6b 20 49 44 20 52  grity_check ID R
4080: 4f 4f 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  OOT ....**.** Lo
4090: 6f 6b 20 74 68 72 6f 75 67 68 20 65 76 65 72 79  ok through every
40a0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 67 69 76   page of the giv
40b0: 65 6e 20 42 54 72 65 65 20 66 69 6c 65 20 74 6f  en BTree file to
40c0: 20 76 65 72 69 66 79 20 63 6f 72 72 65 63 74 0a   verify correct.
40d0: 2a 2a 20 66 6f 72 6d 61 74 74 69 6e 67 20 61 6e  ** formatting an
40e0: 64 20 6c 69 6e 6b 61 67 65 2e 20 20 52 65 74 75  d linkage.  Retu
40f0: 72 6e 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  rn a line of tex
4100: 74 20 66 6f 72 20 65 61 63 68 20 70 72 6f 62 6c  t for each probl
4110: 65 6d 20 66 6f 75 6e 64 2e 0a 2a 2a 20 52 65 74  em found..** Ret
4120: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
4130: 69 6e 67 20 69 66 20 65 76 65 72 79 74 68 69 6e  ing if everythin
4140: 67 20 77 6f 72 6b 65 64 2e 0a 2a 2f 0a 73 74 61  g worked..*/.sta
4150: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 69 6e  tic int btree_in
4160: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28 0a 20  tegrity_check(. 
4170: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4180: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4190: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
41a0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
41b0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
41c0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
41d0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
41e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
41f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4200: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
4210: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
4220: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4230: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20  t */.){.  Btree 
4240: 2a 70 42 74 3b 0a 20 20 69 6e 74 20 6e 52 6f 6f  *pBt;.  int nRoo
4250: 74 3b 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b  t;.  int *aRoot;
4260: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4270: 6e 45 72 72 3b 0a 20 20 63 68 61 72 20 2a 7a 52  nErr;.  char *zR
4280: 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 61 72  esult;..  if( ar
4290: 67 63 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc<3 ){.    Tcl_
42a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
42b0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
42c0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
42d0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
42e0: 20 20 20 22 20 49 44 20 52 4f 4f 54 20 2e 2e 2e     " ID ROOT ...
42f0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4300: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4310: 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74   }.  pBt = sqlit
4320: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
4330: 5b 31 5d 29 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20  [1]);.  nRoot = 
4340: 61 72 67 63 2d 32 3b 0a 20 20 61 52 6f 6f 74 20  argc-2;.  aRoot 
4350: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
4360: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69  malloc( sizeof(i
4370: 6e 74 29 2a 28 61 72 67 63 2d 32 29 20 29 3b 0a  nt)*(argc-2) );.
4380: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
4390: 63 2d 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  c-2; i++){.    i
43a0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
43b0: 74 65 72 70 2c 20 61 72 67 76 5b 69 2b 32 5d 2c  terp, argv[i+2],
43c0: 20 26 61 52 6f 6f 74 5b 69 5d 29 20 29 20 72 65   &aRoot[i]) ) re
43d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
43e0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
43f0: 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
4400: 59 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74 65  Y_CHECK.  sqlite
4410: 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
4420: 3b 0a 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71  ;.  zResult = sq
4430: 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 72  lite3BtreeIntegr
4440: 69 74 79 43 68 65 63 6b 28 70 42 74 2c 20 61 52  ityCheck(pBt, aR
4450: 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 31 30 30 30  oot, nRoot, 1000
4460: 30 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c  0, &nErr);.  sql
4470: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
4480: 42 74 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 52 65  Bt);.#else.  zRe
4490: 73 75 6c 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  sult = 0;.#endif
44a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
44b0: 28 76 6f 69 64 2a 29 61 52 6f 6f 74 29 3b 0a 20  (void*)aRoot);. 
44c0: 20 69 66 28 20 7a 52 65 73 75 6c 74 20 29 7b 0a   if( zResult ){.
44d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
44e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
44f0: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  sult, 0);.    sq
4500: 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75  lite3_free(zResu
4510: 6c 74 29 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  lt); .  }.  retu
4520: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
4530: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
4540: 65 65 5f 63 75 72 73 6f 72 5f 6c 69 73 74 20 49  ee_cursor_list I
4550: 44 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 69 6e  D.**.** Print in
4560: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4570: 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 6f 20 73  all cursors to s
4580: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 66  tandard output f
4590: 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f  or debugging..*/
45a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
45b0: 65 5f 63 75 72 73 6f 72 5f 6c 69 73 74 28 0a 20  e_cursor_list(. 
45c0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
45d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
45e0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
45f0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4600: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4610: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4620: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4640: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
4660: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
4670: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4680: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20  t */.){.  Btree 
4690: 2a 70 42 74 3b 0a 0a 20 20 69 66 28 20 61 72 67  *pBt;..  if( arg
46a0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
46b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
46c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
46d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
46e0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
46f0: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
4700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4710: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20  RROR;.  }.  pBt 
4720: 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  = sqlite3TextToP
4730: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73  tr(argv[1]);.  s
4740: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
4750: 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pBt);.  sqlite3
4760: 42 74 72 65 65 43 75 72 73 6f 72 4c 69 73 74 28  BtreeCursorList(
4770: 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
4780: 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
4790: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
47a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
47b0: 67 65 3a 20 20 20 62 74 72 65 65 5f 63 75 72 73  ge:   btree_curs
47c0: 6f 72 20 49 44 20 54 41 42 4c 45 4e 55 4d 20 57  or ID TABLENUM W
47d0: 52 49 54 45 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 43  RITEABLE.**.** C
47e0: 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
47f0: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
4800: 49 44 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f  ID for the curso
4810: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
4820: 20 62 74 72 65 65 5f 63 75 72 73 6f 72 28 0a 20   btree_cursor(. 
4830: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4840: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4850: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4860: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4870: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4880: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4890: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
48a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
48b0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
48c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
48d0: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
48e0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
48f0: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20  t */.){.  Btree 
4900: 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 54 61 62  *pBt;.  int iTab
4910: 6c 65 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  le;.  BtCursor *
4920: 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pCur;.  int rc;.
4930: 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20 20    int wrFlag;.  
4940: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a  char zBuf[30];..
4950: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
4960: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
4970: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
4980: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
4990: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
49a0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
49b0: 20 54 41 42 4c 45 4e 55 4d 20 57 52 49 54 45 41   TABLENUM WRITEA
49c0: 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  BLE\"", 0);.    
49d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
49e0: 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71  ;.  }.  pBt = sq
49f0: 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61  lite3TextToPtr(a
4a00: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54  rgv[1]);.  if( T
4a10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
4a20: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 54 61 62  , argv[2], &iTab
4a30: 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  le) ) return TCL
4a40: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
4a50: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 28 69 6e 74  l_GetBoolean(int
4a60: 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20 26 77  erp, argv[3], &w
4a70: 72 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  rFlag) ) return 
4a80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 43 75  TCL_ERROR;.  pCu
4a90: 72 20 3d 20 28 42 74 43 75 72 73 6f 72 20 2a 29  r = (BtCursor *)
4aa0: 63 6b 61 6c 6c 6f 63 28 73 71 6c 69 74 65 33 42  ckalloc(sqlite3B
4ab0: 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
4ac0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72  );.  memset(pCur
4ad0: 2c 20 30 2c 20 73 71 6c 69 74 65 33 42 74 72 65  , 0, sqlite3Btre
4ae0: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 29 3b 0a  eCursorSize());.
4af0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
4b00: 74 65 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d  ter(pBt);.  rc =
4b10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
4b20: 73 6f 72 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  sor(pBt, iTable,
4b30: 20 77 72 46 6c 61 67 2c 20 30 2c 20 70 43 75 72   wrFlag, 0, pCur
4b40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4b50: 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 69  eLeave(pBt);.  i
4b60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6b 66  f( rc ){.    ckf
4b70: 72 65 65 28 28 63 68 61 72 20 2a 29 70 43 75 72  ree((char *)pCur
4b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
4b90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4ba0: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
4bb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4bc0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  L_ERROR;.  }.  s
4bd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4be0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
4bf0: 75 66 2c 22 25 70 22 2c 20 70 43 75 72 29 3b 0a  uf,"%p", pCur);.
4c00: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4c10: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
4c20: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
4c30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4c40: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
4c50: 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72 20 49 44  _close_cursor ID
4c60: 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  .**.** Close a c
4c70: 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69  ursor opened usi
4c80: 6e 67 20 62 74 72 65 65 5f 63 75 72 73 6f 72 2e  ng btree_cursor.
4c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4ca0: 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f  tree_close_curso
4cb0: 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  r(.  void *NotUs
4cc0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4cd0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4ce0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4cf0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4d00: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4d10: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4d30: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4d40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4d50: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
4d60: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4d70: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
4d80: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
4d90: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
4da0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67  t rc;..  if( arg
4db0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
4dc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4dd0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4de0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4df0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4e00: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
4e10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4e20: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72  RROR;.  }.  pCur
4e30: 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f   = sqlite3TextTo
4e40: 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  Ptr(argv[1]);.  
4e50: 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
4e60: 65 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ee;.  sqlite3Btr
4e70: 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
4e80: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
4e90: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 75  eCloseCursor(pCu
4ea0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
4eb0: 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20  eeLeave(pBt);.  
4ec0: 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 70  ckfree((char *)p
4ed0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
4ee0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4ef0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65  Result(interp, e
4f00: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
4f10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4f20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
4f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f50: 20 20 62 74 72 65 65 5f 6d 6f 76 65 5f 74 6f 20    btree_move_to 
4f60: 49 44 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 4d 6f 76  ID KEY.**.** Mov
4f70: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
4f80: 74 68 65 20 65 6e 74 72 79 20 77 69 74 68 20 74  the entry with t
4f90: 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 0a 2a 2f  he given key..*/
4fa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4fb0: 65 5f 6d 6f 76 65 5f 74 6f 28 0a 20 20 76 6f 69  e_move_to(.  voi
4fc0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4fd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4fe0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4ff0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
5000: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
5010: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
5020: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
5030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
5040: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
5050: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20  nst char **argv 
5060: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
5070: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
5080: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
5090: 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pCur;.  int rc;.
50a0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 63 68 61    int res;.  cha
50b0: 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 0a 20 20 69  r zBuf[20];..  i
50c0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
50d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
50e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
50f0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
5100: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
5110: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 20 4b 45  ,.       " ID KE
5120: 59 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  Y\"", 0);.    re
5130: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5140: 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
5150: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
5160: 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[1]);.  sqlite
5170: 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75 72  3BtreeEnter(pCur
5180: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 69 66 28  ->pBtree);.  if(
5190: 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
51a0: 67 73 28 70 43 75 72 29 20 26 20 42 54 52 45 45  gs(pCur) & BTREE
51b0: 5f 49 4e 54 4b 45 59 20 29 7b 0a 20 20 20 20 69  _INTKEY ){.    i
51c0: 6e 74 20 69 4b 65 79 3b 0a 20 20 20 20 69 66 28  nt iKey;.    if(
51d0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
51e0: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 4b  rp, argv[2], &iK
51f0: 65 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ey) ){.      sql
5200: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
5210: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
5220: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5230: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
5240: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5250: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 30 2c  eMoveto(pCur, 0,
5260: 20 30 2c 20 69 4b 65 79 2c 20 30 2c 20 26 72 65   0, iKey, 0, &re
5270: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
5280: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5290: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 61  eeMoveto(pCur, a
52a0: 72 67 76 5b 32 5d 2c 20 30 2c 20 73 74 72 6c 65  rgv[2], 0, strle
52b0: 6e 28 61 72 67 76 5b 32 5d 29 2c 20 30 2c 20 26  n(argv[2]), 0, &
52c0: 72 65 73 29 3b 20 20 0a 20 20 7d 0a 20 20 73 71  res);  .  }.  sq
52d0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
52e0: 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20  pCur->pBtree);. 
52f0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54   if( rc ){.    T
5300: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5310: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
5320: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
5330: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5340: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 3c 30  .  }.  if( res<0
5350: 20 29 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 69   ) res = -1;.  i
5360: 66 28 20 72 65 73 3e 30 20 29 20 72 65 73 20 3d  f( res>0 ) res =
5370: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   1;.  sqlite3_sn
5380: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
5390: 75 66 29 2c 20 7a 42 75 66 2c 22 25 64 22 2c 72  uf), zBuf,"%d",r
53a0: 65 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  es);.  Tcl_Appen
53b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
53c0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
53d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
53e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
53f0: 62 74 72 65 65 5f 64 65 6c 65 74 65 20 49 44 0a  btree_delete ID.
5400: 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
5410: 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
5420: 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
5430: 6e 67 20 74 6f 0a 2a 2f 0a 73 74 61 74 69 63 20  ng to.*/.static 
5440: 69 6e 74 20 62 74 72 65 65 5f 64 65 6c 65 74 65  int btree_delete
5450: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
5460: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
5470: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
5480: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
5490: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
54a0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
54b0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
54c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
54d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
54e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
54f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
5500: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
5510: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
5520: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
5530: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
5540: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
5550: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5560: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
5570: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
5580: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
5590: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
55a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
55b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75  ERROR;.  }.  pCu
55c0: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  r = sqlite3TextT
55d0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
55e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
55f0: 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29  er(pCur->pBtree)
5600: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5610: 42 74 72 65 65 44 65 6c 65 74 65 28 70 43 75 72  BtreeDelete(pCur
5620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
5630: 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74  eLeave(pCur->pBt
5640: 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ree);.  if( rc )
5650: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
5660: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65  Result(interp, e
5670: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
5680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
5690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
56a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
56b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
56c0: 20 20 62 74 72 65 65 5f 69 6e 73 65 72 74 20 49    btree_insert I
56d0: 44 20 4b 45 59 20 44 41 54 41 20 3f 4e 5a 45 52  D KEY DATA ?NZER
56e0: 4f 3f 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20  O?.**.** Create 
56f0: 61 20 6e 65 77 20 65 6e 74 72 79 20 77 69 74 68  a new entry with
5700: 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 20 61   the given key a
5710: 6e 64 20 64 61 74 61 2e 20 20 49 66 20 61 6e 20  nd data.  If an 
5720: 65 6e 74 72 79 20 61 6c 72 65 61 64 79 0a 2a 2a  entry already.**
5730: 20 65 78 69 73 74 73 20 77 69 74 68 20 74 68 65   exists with the
5740: 20 73 61 6d 65 20 6b 65 79 20 74 68 65 20 6f 6c   same key the ol
5750: 64 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77  d entry is overw
5760: 72 69 74 74 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ritten..*/.stati
5770: 63 20 69 6e 74 20 62 74 72 65 65 5f 69 6e 73 65  c int btree_inse
5780: 72 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  rt(.  void * cli
5790: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
57a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
57b0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
57c0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
57d0: 5b 5d 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  [].){.  BtCursor
57e0: 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63   *pCur;.  int rc
57f0: 3b 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 3b 0a 0a  ;.  int nZero;..
5800: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
5810: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
5820: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
5830: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
5840: 2c 20 22 49 44 20 4b 45 59 20 44 41 54 41 20 3f  , "ID KEY DATA ?
5850: 4e 5a 45 52 4f 3f 22 29 3b 0a 20 20 20 20 72 65  NZERO?");.    re
5860: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5870: 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
5880: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 54 63  ite3TextToPtr(Tc
5890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
58a0: 5b 31 5d 29 29 3b 0a 20 20 69 66 28 20 6f 62 6a  [1]));.  if( obj
58b0: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c==5 ){.    if( 
58c0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
58d0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
58e0: 5d 2c 20 26 6e 5a 65 72 6f 29 20 29 20 72 65 74  ], &nZero) ) ret
58f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 5a 65 72   }else{.    nZer
5910: 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  o = 0;.  }.  sql
5920: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
5930: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
5940: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
5950: 46 6c 61 67 73 28 70 43 75 72 29 20 26 20 42 54  Flags(pCur) & BT
5960: 52 45 45 5f 49 4e 54 4b 45 59 20 29 7b 0a 20 20  REE_INTKEY ){.  
5970: 20 20 69 36 34 20 69 4b 65 79 3b 0a 20 20 20 20    i64 iKey;.    
5980: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e 73  int len;.    uns
5990: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
59a0: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
59b0: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
59c0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
59d0: 20 26 69 4b 65 79 29 20 29 7b 0a 20 20 20 20 20   &iKey) ){.     
59e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
59f0: 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29  ve(pCur->pBtree)
5a00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
5a10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5a20: 20 20 20 20 70 42 75 66 20 3d 20 54 63 6c 5f 47      pBuf = Tcl_G
5a30: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
5a40: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
5a50: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
5a60: 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
5a70: 43 75 72 2c 20 30 2c 20 69 4b 65 79 2c 20 70 42  Cur, 0, iKey, pB
5a80: 75 66 2c 20 6c 65 6e 2c 20 6e 5a 65 72 6f 2c 20  uf, len, nZero, 
5a90: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
5aa0: 20 69 6e 74 20 6b 65 79 6c 65 6e 3b 0a 20 20 20   int keylen;.   
5ab0: 20 69 6e 74 20 64 6c 65 6e 3b 0a 20 20 20 20 75   int dlen;.    u
5ac0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4b  nsigned char *pK
5ad0: 42 75 66 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Buf;.    unsigne
5ae0: 64 20 63 68 61 72 20 2a 70 44 42 75 66 3b 0a 20  d char *pDBuf;. 
5af0: 20 20 20 70 4b 42 75 66 20 3d 20 54 63 6c 5f 47     pKBuf = Tcl_G
5b00: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
5b10: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79  bj(objv[2], &key
5b20: 6c 65 6e 29 3b 0a 20 20 20 20 70 44 42 75 66 20  len);.    pDBuf 
5b30: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
5b40: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ayFromObj(objv[3
5b50: 5d 2c 20 26 64 6c 65 6e 29 3b 0a 20 20 20 20 72  ], &dlen);.    r
5b60: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5b70: 49 6e 73 65 72 74 28 70 43 75 72 2c 20 70 4b 42  Insert(pCur, pKB
5b80: 75 66 2c 20 6b 65 79 6c 65 6e 2c 20 70 44 42 75  uf, keylen, pDBu
5b90: 66 2c 20 64 6c 65 6e 2c 20 6e 5a 65 72 6f 2c 20  f, dlen, nZero, 
5ba0: 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
5bb0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75 72  3BtreeLeave(pCur
5bc0: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 69 66 28  ->pBtree);.  if(
5bd0: 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41   rc ){.    Tcl_A
5be0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5bf0: 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63  rp, errorName(rc
5c00: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
5c10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
5c20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5c30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
5c40: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 6e 65 78  age:   btree_nex
5c50: 74 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20  t ID.**.** Move 
5c60: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
5c70: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
5c80: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
5c90: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 0a  rn 0 on success.
5ca0: 2a 2a 20 6f 72 20 31 20 69 66 20 74 68 65 20 63  ** or 1 if the c
5cb0: 75 72 73 6f 72 20 77 61 73 20 61 6c 72 65 61 64  ursor was alread
5cc0: 79 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 65 6e  y on the last en
5cd0: 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
5ce0: 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 74 61   or if.** the ta
5cf0: 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
5d00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5d10: 65 5f 6e 65 78 74 28 0a 20 20 76 6f 69 64 20 2a  e_next(.  void *
5d20: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5d30: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5d40: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5d50: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5d60: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5d70: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
5d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5d90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5da0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
5db0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5dc0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
5dd0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5de0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
5df0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  r;.  int rc;.  i
5e00: 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 63 68  nt res = 0;.  ch
5e10: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
5e20: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
5e30: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
5e40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
5e50: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
5e60: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
5e70: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
5e80: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
5e90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5ea0: 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
5eb0: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
5ec0: 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  [1]);.  sqlite3B
5ed0: 74 72 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e  treeEnter(pCur->
5ee0: 70 42 74 72 65 65 29 3b 0a 20 20 72 63 20 3d 20  pBtree);.  rc = 
5ef0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
5f00: 28 70 43 75 72 2c 20 26 72 65 73 29 3b 0a 20 20  (pCur, &res);.  
5f10: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
5f20: 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b  e(pCur->pBtree);
5f30: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
5f40: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
5f50: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
5f60: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
5f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5f80: 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
5f90: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
5fa0: 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 64 22  (zBuf),zBuf,"%d"
5fb0: 2c 72 65 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ,res);.  Tcl_App
5fc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5fd0: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
5fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
6000: 20 20 62 74 72 65 65 5f 70 72 65 76 20 49 44 0a    btree_prev ID.
6010: 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  **.** Move the c
6020: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 72 65  ursor to the pre
6030: 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
6040: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
6050: 6e 20 30 20 6f 6e 0a 2a 2a 20 73 75 63 63 65 73  n 0 on.** succes
6060: 73 20 61 6e 64 20 31 20 69 66 20 74 68 65 20 63  s and 1 if the c
6070: 75 72 73 6f 72 20 77 61 73 20 61 6c 72 65 61 64  ursor was alread
6080: 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65  y on the first e
6090: 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 65 20 74  ntry in.** the t
60a0: 61 62 6c 65 20 6f 72 20 69 66 20 74 68 65 20 74  able or if the t
60b0: 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79 2e 0a  able was empty..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
60d0: 72 65 65 5f 70 72 65 76 28 0a 20 20 76 6f 69 64  ree_prev(.  void
60e0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
60f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6100: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
6110: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
6120: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
6130: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
6140: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
6150: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
6160: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
6170: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
6180: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
6190: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
61a0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
61b0: 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Cur;.  int rc;. 
61c0: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
61d0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
61e0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
61f0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
6200: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
6210: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
6220: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
6230: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49  v[0],.       " I
6240: 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  D\"", 0);.    re
6250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6260: 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
6270: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
6280: 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[1]);.  sqlite
6290: 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75 72  3BtreeEnter(pCur
62a0: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63 20  ->pBtree);.  rc 
62b0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
62c0: 65 76 69 6f 75 73 28 70 43 75 72 2c 20 26 72 65  evious(pCur, &re
62d0: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
62e0: 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42  eeLeave(pCur->pB
62f0: 74 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 20  tree);.  if( rc 
6300: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
6310: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6320: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
6330: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6340: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  L_ERROR;.  }.  s
6350: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6360: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75  sizeof(zBuf),zBu
6370: 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20 54  f,"%d",res);.  T
6380: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6390: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
63a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
63b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
63c0: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 66 69  sage:   btree_fi
63d0: 72 73 74 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76  rst ID.**.** Mov
63e0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
63f0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
6400: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
6410: 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 0a 2a  eturn 0 if the.*
6420: 2a 20 63 75 72 73 6f 72 20 77 61 73 20 6c 65 66  * cursor was lef
6430: 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 74  t point to somet
6440: 68 69 6e 67 20 61 6e 64 20 31 20 69 66 20 74 68  hing and 1 if th
6450: 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
6460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6470: 62 74 72 65 65 5f 66 69 72 73 74 28 0a 20 20 76  btree_first(.  v
6480: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6490: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
64a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
64b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
64c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
64d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
64e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
64f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6500: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
6520: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
6530: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6540: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
6550: 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63   *pCur;.  int rc
6560: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  ;.  int res = 0;
6570: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
6580: 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
6590: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
65a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
65b0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
65c0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
65d0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
65e0: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
65f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6600: 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20  R;.  }.  pCur = 
6610: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
6620: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c  (argv[1]);.  sql
6630: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
6640: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
6650: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6660: 65 46 69 72 73 74 28 70 43 75 72 2c 20 26 72 65  eFirst(pCur, &re
6670: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
6680: 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42  eeLeave(pCur->pB
6690: 74 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 20  tree);.  if( rc 
66a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
66b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
66c0: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
66d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
66e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  L_ERROR;.  }.  s
66f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6700: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75  sizeof(zBuf),zBu
6710: 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20 54  f,"%d",res);.  T
6720: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6730: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
6740: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6750: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
6760: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 6c 61  sage:   btree_la
6770: 73 74 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65  st ID.**.** Move
6780: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
6790: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
67a0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
67b0: 75 72 6e 20 30 20 69 66 20 74 68 65 0a 2a 2a 20  urn 0 if the.** 
67c0: 63 75 72 73 6f 72 20 77 61 73 20 6c 65 66 74 20  cursor was left 
67d0: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 74 68 69  point to somethi
67e0: 6e 67 20 61 6e 64 20 31 20 69 66 20 74 68 65 20  ng and 1 if the 
67f0: 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
6800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6810: 72 65 65 5f 6c 61 73 74 28 0a 20 20 76 6f 69 64  ree_last(.  void
6820: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
6830: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6840: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
6850: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
6860: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
6870: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
6880: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
6890: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
68a0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
68b0: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
68c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
68d0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
68e0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
68f0: 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Cur;.  int rc;. 
6900: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
6910: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
6920: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
6930: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
6940: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
6950: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
6960: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
6970: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49  v[0],.       " I
6980: 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  D\"", 0);.    re
6990: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
69a0: 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c    }.  pCur = sql
69b0: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
69c0: 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65  gv[1]);.  sqlite
69d0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 43 75 72  3BtreeEnter(pCur
69e0: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 63 20  ->pBtree);.  rc 
69f0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  = sqlite3BtreeLa
6a00: 73 74 28 70 43 75 72 2c 20 26 72 65 73 29 3b 0a  st(pCur, &res);.
6a10: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
6a20: 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  ave(pCur->pBtree
6a30: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
6a40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6a50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
6a60: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
6a70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6a80: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
6a90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
6aa0: 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25  of(zBuf),zBuf,"%
6ab0: 64 22 2c 72 65 73 29 3b 0a 20 20 54 63 6c 5f 41  d",res);.  Tcl_A
6ac0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6ad0: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
6ae0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
6b00: 3a 20 20 20 62 74 72 65 65 5f 65 6f 66 20 49 44  :   btree_eof ID
6b10: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
6b20: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
6b30: 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
6b40: 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
6b50: 64 20 65 6e 74 72 79 2e 0a 2a 2a 20 52 65 74 75  d entry..** Retu
6b60: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  rn FALSE if the 
6b70: 63 75 72 73 6f 72 20 64 6f 65 73 20 70 6f 69 6e  cursor does poin
6b80: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
6b90: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
6ba0: 74 20 62 74 72 65 65 5f 65 6f 66 28 0a 20 20 76  t btree_eof(.  v
6bb0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6bc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6bd0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6be0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
6bf0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
6c00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
6c10: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
6c20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6c30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
6c50: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
6c60: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6c70: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
6c80: 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63   *pCur;.  int rc
6c90: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
6ca0: 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
6cb0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
6cc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6cd0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
6ce0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
6cf0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
6d00: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
6d10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6d20: 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20  R;.  }.  pCur = 
6d30: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
6d40: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c  (argv[1]);.  sql
6d50: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
6d60: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
6d70: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6d80: 65 45 6f 66 28 70 43 75 72 29 3b 0a 20 20 73 71  eEof(pCur);.  sq
6d90: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
6da0: 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20  pCur->pBtree);. 
6db0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6dc0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a  f(sizeof(zBuf),z
6dd0: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
6de0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6df0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
6e00: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
6e10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6e20: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
6e30: 5f 6b 65 79 73 69 7a 65 20 49 44 0a 2a 2a 0a 2a  _keysize ID.**.*
6e40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
6e50: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
6e60: 6b 65 79 2e 20 20 46 6f 72 20 61 6e 20 49 4e 54  key.  For an INT
6e70: 4b 45 59 20 74 61 62 6c 65 2c 20 74 68 69 73 0a  KEY table, this.
6e80: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ** returns the k
6e90: 65 79 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74  ey itself..*/.st
6ea0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 6b  atic int btree_k
6eb0: 65 79 73 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a  eysize(.  void *
6ec0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6ed0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6ee0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6ef0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6f00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6f10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
6f20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6f30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
6f40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
6f50: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
6f60: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
6f70: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
6f80: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
6f90: 72 3b 0a 20 20 75 36 34 20 6e 3b 0a 20 20 63 68  r;.  u64 n;.  ch
6fa0: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20  ar zBuf[50];..  
6fb0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
6fc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6fd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
6fe0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
6ff0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
7000: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22  ],.       " ID\"
7010: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
7020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7030: 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
7040: 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b  3TextToPtr(argv[
7050: 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  1]);.  sqlite3Bt
7060: 72 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70  reeEnter(pCur->p
7070: 42 74 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65  Btree);.  sqlite
7080: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
7090: 75 72 2c 20 28 69 36 34 2a 29 26 6e 29 3b 0a 20  ur, (i64*)&n);. 
70a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
70b0: 76 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29  ve(pCur->pBtree)
70c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
70d0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
70e0: 29 2c 7a 42 75 66 2c 20 22 25 6c 6c 75 22 2c 20  ),zBuf, "%llu", 
70f0: 6e 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  n);.  Tcl_Append
7100: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
7110: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
7120: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7130: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
7140: 74 72 65 65 5f 6b 65 79 20 49 44 0a 2a 2a 0a 2a  tree_key ID.**.*
7150: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6b 65 79  * Return the key
7160: 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 61   for the entry a
7170: 74 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  t which the curs
7180: 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a  or is pointing..
7190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
71a0: 72 65 65 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20  ree_key(.  void 
71b0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
71c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
71d0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
71e0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
71f0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
7200: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
7210: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7220: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7230: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
7240: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
7250: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
7260: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
7270: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
7280: 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ur;.  int rc;.  
7290: 75 36 34 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a  u64 n;.  char *z
72a0: 42 75 66 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  Buf;..  if( argc
72b0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
72c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
72d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
72e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
72f0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
7300: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
7310: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7320: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20  ROR;.  }.  pCur 
7330: 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  = sqlite3TextToP
7340: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73  tr(argv[1]);.  s
7350: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7360: 28 70 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a  (pCur->pBtree);.
7370: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
7380: 79 53 69 7a 65 28 70 43 75 72 2c 20 28 69 36 34  ySize(pCur, (i64
7390: 2a 29 26 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  *)&n);.  if( sql
73a0: 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 70  ite3BtreeFlags(p
73b0: 43 75 72 29 20 26 20 42 54 52 45 45 5f 49 4e 54  Cur) & BTREE_INT
73c0: 4b 45 59 20 29 7b 0a 20 20 20 20 63 68 61 72 20  KEY ){.    char 
73d0: 7a 42 75 66 32 5b 36 30 5d 3b 0a 20 20 20 20 73  zBuf2[60];.    s
73e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
73f0: 73 69 7a 65 6f 66 28 7a 42 75 66 32 29 2c 7a 42  sizeof(zBuf2),zB
7400: 75 66 32 2c 20 22 25 6c 6c 75 22 2c 20 6e 29 3b  uf2, "%llu", n);
7410: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7420: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
7430: 75 66 32 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  uf2, 0);.  }else
7440: 7b 0a 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c  {.    zBuf = sql
7450: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31  ite3_malloc( n+1
7460: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
7470: 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75  ite3BtreeKey(pCu
7480: 72 2c 20 30 2c 20 6e 2c 20 7a 42 75 66 29 3b 0a  r, 0, n, zBuf);.
7490: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
74a0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
74b0: 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42 74 72  Leave(pCur->pBtr
74c0: 65 65 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ee);.      Tcl_A
74d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
74e0: 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63  rp, errorName(rc
74f0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ), 0);.      ret
7500: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7510: 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6e 5d     }.    zBuf[n]
7520: 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 41 70   = 0;.    Tcl_Ap
7530: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7540: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20  p, zBuf, 0);.   
7550: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
7560: 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  uf);.  }.  sqlit
7570: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75  e3BtreeLeave(pCu
7580: 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 65  r->pBtree);.  re
7590: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
75a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
75b0: 20 20 62 74 72 65 65 5f 64 61 74 61 20 49 44 20    btree_data ID 
75c0: 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ?N?.**.** Return
75d0: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
75e0: 65 20 65 6e 74 72 79 20 61 74 20 77 68 69 63 68  e entry at which
75f0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
7600: 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ointing..*/.stat
7610: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 64 61 74  ic int btree_dat
7620: 61 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  a(.  void *NotUs
7630: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
7640: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
7650: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
7660: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
7670: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
7680: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
7690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
76a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
76b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
76c0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
76d0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
76e0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
76f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
7700: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
7710: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
7720: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 26 26    if( argc!=2 &&
7730: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
7740: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7750: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
7760: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
7770: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
7780: 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20         " ID\"", 
7790: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
77a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
77b0: 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65  pCur = sqlite3Te
77c0: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29  xtToPtr(argv[1])
77d0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
77e0: 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72  Enter(pCur->pBtr
77f0: 65 65 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  ee);.  if( argc=
7800: 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =2 ){.    sqlite
7810: 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70  3BtreeDataSize(p
7820: 43 75 72 2c 20 26 6e 29 3b 0a 20 20 7d 65 6c 73  Cur, &n);.  }els
7830: 65 7b 0a 20 20 20 20 6e 20 3d 20 61 74 6f 69 28  e{.    n = atoi(
7840: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  argv[2]);.  }.  
7850: 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zBuf = sqlite3_m
7860: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
7870: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
7880: 65 44 61 74 61 28 70 43 75 72 2c 20 30 2c 20 6e  eData(pCur, 0, n
7890: 2c 20 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  , zBuf);.  sqlit
78a0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75  e3BtreeLeave(pCu
78b0: 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 69 66  r->pBtree);.  if
78c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
78d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
78e0: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
78f0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  c), 0);.    sqli
7900: 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
7910: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7920: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  RROR;.  }.  zBuf
7930: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 41  [n] = 0;.  Tcl_A
7940: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7950: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
7960: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
7970: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  f);.  return SQL
7980: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7990: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
79a0: 66 65 74 63 68 5f 6b 65 79 20 49 44 20 41 4d 54  fetch_key ID AMT
79b0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
79c0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
79d0: 74 63 68 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  tch() routine to
79e0: 20 67 65 74 20 41 4d 54 20 62 79 74 65 73 20 6f   get AMT bytes o
79f0: 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 20 49 66  f the key..** If
7a00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
7a10: 46 65 74 63 68 28 29 20 66 61 69 6c 73 2c 20 72  Fetch() fails, r
7a20: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
7a30: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
7a40: 20 69 6e 74 20 62 74 72 65 65 5f 66 65 74 63 68   int btree_fetch
7a50: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
7a60: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
7a70: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
7a80: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
7a90: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
7aa0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
7ab0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ad0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
7ae0: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
7af0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
7b00: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
7b10: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
7b20: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
7b30: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
7b40: 61 6d 74 3b 0a 20 20 75 36 34 20 6e 4b 65 79 3b  amt;.  u64 nKey;
7b50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7b60: 42 75 66 3b 0a 20 20 63 68 61 72 20 7a 53 74 61  Buf;.  char zSta
7b70: 74 69 63 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66  tic[1000];..  if
7b80: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
7b90: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7ba0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
7bb0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
7bc0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
7bd0: 0a 20 20 20 20 20 20 20 22 20 49 44 20 41 4d 54  .       " ID AMT
7be0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7bf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7c00: 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
7c10: 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67  te3TextToPtr(arg
7c20: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[1]);.  if( Tcl
7c30: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
7c40: 61 72 67 76 5b 32 5d 2c 20 26 6e 29 20 29 20 72  argv[2], &n) ) r
7c50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7c60: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
7c70: 6e 74 65 72 28 70 43 75 72 2d 3e 70 42 74 72 65  nter(pCur->pBtre
7c80: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
7c90: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
7ca0: 28 69 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (i64*)&nKey);.  
7cb0: 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 42 74  zBuf = sqlite3Bt
7cc0: 72 65 65 4b 65 79 46 65 74 63 68 28 70 43 75 72  reeKeyFetch(pCur
7cd0: 2c 20 26 61 6d 74 29 3b 0a 20 20 69 66 28 20 7a  , &amt);.  if( z
7ce0: 42 75 66 20 26 26 20 61 6d 74 3e 3d 6e 20 29 7b  Buf && amt>=n ){
7cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
7d00: 79 3c 73 69 7a 65 6f 66 28 7a 53 74 61 74 69 63  y<sizeof(zStatic
7d10: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30  ) );.    if( n>0
7d20: 20 29 20 6e 4b 65 79 20 3d 20 6e 3b 0a 20 20 20   ) nKey = n;.   
7d30: 20 6d 65 6d 63 70 79 28 7a 53 74 61 74 69 63 2c   memcpy(zStatic,
7d40: 20 7a 42 75 66 2c 20 28 69 6e 74 29 6e 4b 65 79   zBuf, (int)nKey
7d50: 29 3b 20 0a 20 20 20 20 7a 53 74 61 74 69 63 5b  ); .    zStatic[
7d60: 6e 4b 65 79 5d 20 3d 20 30 3b 0a 20 20 20 20 54  nKey] = 0;.    T
7d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7d80: 69 6e 74 65 72 70 2c 20 7a 53 74 61 74 69 63 2c  interp, zStatic,
7d90: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
7da0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75  e3BtreeLeave(pCu
7db0: 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 72 65  r->pBtree);.  re
7dc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
7dd0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
7de0: 74 72 65 65 5f 66 65 74 63 68 5f 64 61 74 61 20  tree_fetch_data 
7df0: 49 44 20 41 4d 54 0a 2a 2a 0a 2a 2a 20 55 73 65  ID AMT.**.** Use
7e00: 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
7e10: 65 44 61 74 61 46 65 74 63 68 28 29 20 72 6f 75  eDataFetch() rou
7e20: 74 69 6e 65 20 74 6f 20 67 65 74 20 41 4d 54 20  tine to get AMT 
7e30: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
7e40: 2e 0a 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 42  ..** If sqlite3B
7e50: 74 72 65 65 44 61 74 61 46 65 74 63 68 28 29 20  treeDataFetch() 
7e60: 66 61 69 6c 73 2c 20 72 65 74 75 72 6e 20 61 6e  fails, return an
7e70: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a   empty string..*
7e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
7e90: 65 65 5f 66 65 74 63 68 5f 64 61 74 61 28 0a 20  ee_fetch_data(. 
7ea0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7eb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7ec0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
7ed0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
7ee0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
7ef0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
7f00: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
7f10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7f30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
7f40: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
7f50: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
7f60: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  t */.){.  BtCurs
7f70: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
7f80: 6e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  n;.  int amt;.  
7f90: 75 33 32 20 6e 44 61 74 61 3b 0a 20 20 63 6f 6e  u32 nData;.  con
7fa0: 73 74 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20  st char *zBuf;. 
7fb0: 20 63 68 61 72 20 7a 53 74 61 74 69 63 5b 31 30   char zStatic[10
7fc0: 30 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  00];..  if( argc
7fd0: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
7fe0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7ff0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8000: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8010: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8020: 20 20 22 20 49 44 20 41 4d 54 5c 22 22 2c 20 30    " ID AMT\"", 0
8030: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
8040: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
8050: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78  Cur = sqlite3Tex
8060: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
8070: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
8080: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
8090: 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
80a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
80b0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
80c0: 43 75 72 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20  Cur->pBtree);.  
80d0: 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
80e0: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 44 61 74  Size(pCur, &nDat
80f0: 61 29 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c  a);.  zBuf = sql
8100: 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
8110: 63 68 28 70 43 75 72 2c 20 26 61 6d 74 29 3b 0a  ch(pCur, &amt);.
8120: 20 20 69 66 28 20 7a 42 75 66 20 26 26 20 61 6d    if( zBuf && am
8130: 74 3e 3d 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  t>=n ){.    asse
8140: 72 74 28 20 6e 44 61 74 61 3c 73 69 7a 65 6f 66  rt( nData<sizeof
8150: 28 7a 53 74 61 74 69 63 29 20 29 3b 0a 20 20 20  (zStatic) );.   
8160: 20 69 66 28 20 6e 3e 30 20 29 20 6e 44 61 74 61   if( n>0 ) nData
8170: 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79   = n;.    memcpy
8180: 28 7a 53 74 61 74 69 63 2c 20 7a 42 75 66 2c 20  (zStatic, zBuf, 
8190: 28 69 6e 74 29 6e 44 61 74 61 29 3b 20 0a 20 20  (int)nData); .  
81a0: 20 20 7a 53 74 61 74 69 63 5b 6e 44 61 74 61 5d    zStatic[nData]
81b0: 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 41 70   = 0;.    Tcl_Ap
81c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
81d0: 70 2c 20 7a 53 74 61 74 69 63 2c 20 30 29 3b 0a  p, zStatic, 0);.
81e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
81f0: 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70 42  eeLeave(pCur->pB
8200: 74 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  tree);.  return 
8210: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8220: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
8230: 70 61 79 6c 6f 61 64 5f 73 69 7a 65 20 49 44 0a  payload_size ID.
8240: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
8250: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8260: 20 6f 66 20 70 61 79 6c 6f 61 64 0a 2a 2f 0a 73   of payload.*/.s
8270: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
8280: 70 61 79 6c 6f 61 64 5f 73 69 7a 65 28 0a 20 20  payload_size(.  
8290: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
82a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
82b0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
82c0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
82d0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
82e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
82f0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
8300: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8310: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
8330: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
8340: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
8350: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
8360: 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 6e  r *pCur;.  int n
8370: 32 3b 0a 20 20 75 36 34 20 6e 31 3b 0a 20 20 63  2;.  u64 n1;.  c
8380: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20  har zBuf[50];.. 
8390: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
83a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
83b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
83c0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
83d0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
83e0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
83f0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
8400: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8410: 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
8420: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
8430: 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  [1]);.  sqlite3B
8440: 74 72 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e  treeEnter(pCur->
8450: 70 42 74 72 65 65 29 3b 0a 20 20 69 66 28 20 73  pBtree);.  if( s
8460: 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
8470: 28 70 43 75 72 29 20 26 20 42 54 52 45 45 5f 49  (pCur) & BTREE_I
8480: 4e 54 4b 45 59 20 29 7b 0a 20 20 20 20 6e 31 20  NTKEY ){.    n1 
8490: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
84a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
84b0: 79 53 69 7a 65 28 70 43 75 72 2c 20 28 69 36 34  ySize(pCur, (i64
84c0: 2a 29 26 6e 31 29 3b 0a 20 20 7d 0a 20 20 73 71  *)&n1);.  }.  sq
84d0: 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
84e0: 7a 65 28 70 43 75 72 2c 20 28 75 33 32 2a 29 26  ze(pCur, (u32*)&
84f0: 6e 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n2);.  sqlite3Bt
8500: 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d 3e 70  reeLeave(pCur->p
8510: 42 74 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65  Btree);.  sqlite
8520: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
8530: 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 20 22 25  f(zBuf),zBuf, "%
8540: 64 22 2c 20 28 69 6e 74 29 28 6e 31 2b 6e 32 29  d", (int)(n1+n2)
8550: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
8560: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
8570: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
8580: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8590: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
85a0: 72 65 65 5f 63 75 72 73 6f 72 5f 69 6e 66 6f 20  ree_cursor_info 
85b0: 49 44 20 3f 55 50 2d 43 4e 54 3f 0a 2a 2a 0a 2a  ID ?UP-CNT?.**.*
85c0: 2a 20 52 65 74 75 72 6e 20 69 6e 74 65 67 65 72  * Return integer
85d0: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e 66  s containing inf
85e0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
85f0: 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
8600: 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
8610: 6e 67 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ng to:.**.**   a
8620: 52 65 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65  Result[0] =  The
8630: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   page number.** 
8640: 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20    aResult[1] =  
8650: 54 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  The entry number
8660: 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 32 5d  .**   aResult[2]
8670: 20 3d 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   =  Total number
8680: 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74   of entries on t
8690: 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  his page.**   aR
86a0: 65 73 75 6c 74 5b 33 5d 20 3d 20 20 43 65 6c 6c  esult[3] =  Cell
86b0: 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 70 61 79   size (local pay
86c0: 6c 6f 61 64 20 2b 20 68 65 61 64 65 72 29 0a 2a  load + header).*
86d0: 2a 20 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d  *   aResult[4] =
86e0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
86f0: 20 62 79 74 65 73 20 6f 6e 20 74 68 69 73 20 70   bytes on this p
8700: 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
8710: 5b 35 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66  [5] =  Number of
8720: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20   free blocks on 
8730: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  the page.**   aR
8740: 65 73 75 6c 74 5b 36 5d 20 3d 20 20 54 6f 74 61  esult[6] =  Tota
8750: 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 28  l payload size (
8760: 6c 6f 63 61 6c 20 2b 20 6f 76 65 72 66 6c 6f 77  local + overflow
8770: 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 37  ).**   aResult[7
8780: 5d 20 3d 20 20 48 65 61 64 65 72 20 73 69 7a 65  ] =  Header size
8790: 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20 20 61   in bytes.**   a
87a0: 52 65 73 75 6c 74 5b 38 5d 20 3d 20 20 4c 6f 63  Result[8] =  Loc
87b0: 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 0a  al payload size.
87c0: 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 39 5d 20  **   aResult[9] 
87d0: 3d 20 20 50 61 72 65 6e 74 20 70 61 67 65 20 6e  =  Parent page n
87e0: 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73 75  umber.**   aResu
87f0: 6c 74 5b 31 30 5d 3d 20 20 50 61 67 65 20 6e 75  lt[10]=  Page nu
8800: 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
8810: 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
8820: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
8830: 72 65 65 5f 63 75 72 73 6f 72 5f 69 6e 66 6f 28  ree_cursor_info(
8840: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8850: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8860: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
8870: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
8880: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
8890: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
88a0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
88b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
88c0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
88d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
88e0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
88f0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8900: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ent */.){.  BtCu
8910: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
8920: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
8930: 3b 0a 20 20 69 6e 74 20 75 70 3b 0a 20 20 69 6e  ;.  int up;.  in
8940: 74 20 61 52 65 73 75 6c 74 5b 31 31 5d 3b 0a 20  t aResult[11];. 
8950: 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b   char zBuf[400];
8960: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
8970: 26 26 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  && argc!=3 ){.  
8980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8990: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
89a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
89b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
89c0: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 20 3f 55  ,.       " ID ?U
89d0: 50 2d 43 4e 54 3f 5c 22 22 2c 20 30 29 3b 0a 20  P-CNT?\"", 0);. 
89e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
89f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20  ROR;.  }.  pCur 
8a00: 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  = sqlite3TextToP
8a10: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  tr(argv[1]);.  i
8a20: 66 28 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20  f( argc==3 ){.  
8a30: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
8a40: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
8a50: 2c 20 26 75 70 29 20 29 20 72 65 74 75 72 6e 20  , &up) ) return 
8a60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
8a70: 73 65 7b 0a 20 20 20 20 75 70 20 3d 20 30 3b 0a  se{.    up = 0;.
8a80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
8a90: 65 65 45 6e 74 65 72 28 70 43 75 72 2d 3e 70 42  eeEnter(pCur->pB
8aa0: 74 72 65 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  tree);.  rc = sq
8ab0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
8ac0: 49 6e 66 6f 28 70 43 75 72 2c 20 61 52 65 73 75  Info(pCur, aResu
8ad0: 6c 74 2c 20 75 70 29 3b 0a 20 20 69 66 28 20 72  lt, up);.  if( r
8ae0: 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c ){.    Tcl_App
8af0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8b00: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
8b10: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
8b20: 42 74 72 65 65 4c 65 61 76 65 28 70 43 75 72 2d  BtreeLeave(pCur-
8b30: 3e 70 42 74 72 65 65 29 3b 0a 20 20 20 20 72 65  >pBtree);.    re
8b40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8b50: 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66    }.  j = 0;.  f
8b60: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
8b70: 28 61 52 65 73 75 6c 74 29 2f 73 69 7a 65 6f 66  (aResult)/sizeof
8b80: 28 61 52 65 73 75 6c 74 5b 30 5d 29 3b 20 69 2b  (aResult[0]); i+
8b90: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
8ba0: 73 6e 70 72 69 6e 74 66 28 34 30 2c 26 7a 42 75  snprintf(40,&zBu
8bb0: 66 5b 6a 5d 2c 22 20 25 64 22 2c 20 61 52 65 73  f[j]," %d", aRes
8bc0: 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 6a 20 2b  ult[i]);.    j +
8bd0: 3d 20 73 74 72 6c 65 6e 28 26 7a 42 75 66 5b 6a  = strlen(&zBuf[j
8be0: 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ]);.  }.  sqlite
8bf0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 43 75 72  3BtreeLeave(pCur
8c00: 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 54 63 6c  ->pBtree);.  Tcl
8c10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8c20: 74 65 72 70 2c 20 26 7a 42 75 66 5b 31 5d 2c 20  terp, &zBuf[1], 
8c30: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
8c40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8c50: 20 43 6f 70 69 65 64 20 66 72 6f 6d 20 62 74 72   Copied from btr
8c60: 65 65 2e 63 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  ee.c:.*/.static 
8c70: 75 33 32 20 74 34 47 65 74 34 62 79 74 65 28 75  u32 t4Get4byte(u
8c80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 29  nsigned char *p)
8c90: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 5b 30 5d  {.  return (p[0]
8ca0: 3c 3c 32 34 29 20 7c 20 28 70 5b 31 5d 3c 3c 31  <<24) | (p[1]<<1
8cb0: 36 29 20 7c 20 28 70 5b 32 5d 3c 3c 38 29 20 7c  6) | (p[2]<<8) |
8cc0: 20 70 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   p[3];.}../*.** 
8cd0: 20 20 62 74 72 65 65 5f 6f 76 66 6c 5f 69 6e 66    btree_ovfl_inf
8ce0: 6f 20 20 42 54 52 45 45 20 20 43 55 52 53 4f 52  o  BTREE  CURSOR
8cf0: 0a 2a 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 63  .**.** Given a c
8d00: 75 72 73 6f 72 2c 20 72 65 74 75 72 6e 20 74 68  ursor, return th
8d10: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70 61  e sequence of pa
8d20: 67 65 73 20 6e 75 6d 62 65 72 20 74 68 61 74 20  ges number that 
8d30: 66 6f 72 6d 20 74 68 65 0a 2a 2a 20 6f 76 65 72  form the.** over
8d40: 66 6c 6f 77 20 70 61 67 65 73 20 66 6f 72 20 74  flow pages for t
8d50: 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 65  he data of the e
8d60: 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
8d70: 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 0a 2a 2a  rsor is point.**
8d80: 20 74 6f 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20   to..*/ .static 
8d90: 69 6e 74 20 62 74 72 65 65 5f 6f 76 66 6c 5f 69  int btree_ovfl_i
8da0: 6e 66 6f 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nfo(.  void *Not
8db0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
8dc0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
8dd0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
8de0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8df0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8e00: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8e20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8e30: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
8e40: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
8e50: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8e60: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8e70: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 42 74  Btree *pBt;.  Bt
8e80: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
8e90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
8ea0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
8eb0: 3b 0a 20 20 69 6e 74 20 64 61 74 61 53 69 7a 65  ;.  int dataSize
8ec0: 3b 0a 20 20 75 33 32 20 70 67 6e 6f 3b 0a 20 20  ;.  u32 pgno;.  
8ed0: 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69  void *pPage;.  i
8ee0: 6e 74 20 61 52 65 73 75 6c 74 5b 31 31 5d 3b 0a  nt aResult[11];.
8ef0: 20 20 63 68 61 72 20 7a 45 6c 65 6d 5b 31 30 30    char zElem[100
8f00: 5d 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ];.  Tcl_DString
8f10: 20 73 74 72 3b 0a 0a 20 20 69 66 28 20 61 72 67   str;..  if( arg
8f20: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
8f30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8f40: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8f50: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8f60: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 22 20 42 54 52 45 45 20 43 55 52 53 4f 52 22   " BTREE CURSOR"
8f90: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8fa0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8fb0: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54    pBt = sqlite3T
8fc0: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
8fd0: 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69  );.  pCur = sqli
8fe0: 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67  te3TextToPtr(arg
8ff0: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 28 2a 28  v[2]);.  if( (*(
9000: 76 6f 69 64 2a 2a 29 70 43 75 72 29 20 21 3d 20  void**)pCur) != 
9010: 28 76 6f 69 64 2a 29 70 42 74 20 29 7b 0a 20 20  (void*)pBt ){.  
9020: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9030: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 75 72 73  lt(interp, "Curs
9040: 6f 72 20 22 2c 20 61 72 67 76 5b 32 5d 2c 20 22  or ", argv[2], "
9050: 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67   does not belong
9060: 20 74 6f 20 62 74 72 65 65 20 22 2c 0a 20 20 20   to btree ",.   
9070: 20 20 20 20 61 72 67 76 5b 31 5d 2c 20 30 29 3b      argv[1], 0);
9080: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9090: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
90a0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
90b0: 42 74 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  Bt);.  pPager = 
90c0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
90d0: 72 28 70 42 74 29 3b 0a 20 20 72 63 20 3d 20 73  r(pBt);.  rc = s
90e0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
90f0: 72 49 6e 66 6f 28 70 43 75 72 2c 20 61 52 65 73  rInfo(pCur, aRes
9100: 75 6c 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ult, 0);.  if( r
9110: 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c ){.    Tcl_App
9120: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9130: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
9140: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
9150: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
9160: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9170: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 61 74  ERROR;.  }.  dat
9180: 61 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 42 74  aSize = pBt->pBt
9190: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
91a0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
91b0: 26 73 74 72 29 3b 0a 20 20 6e 20 3d 20 61 52 65  &str);.  n = aRe
91c0: 73 75 6c 74 5b 36 5d 20 2d 20 61 52 65 73 75 6c  sult[6] - aResul
91d0: 74 5b 38 5d 3b 0a 20 20 6e 20 3d 20 28 6e 20 2b  t[8];.  n = (n +
91e0: 20 64 61 74 61 53 69 7a 65 20 2d 20 31 29 2f 64   dataSize - 1)/d
91f0: 61 74 61 53 69 7a 65 3b 0a 20 20 70 67 6e 6f 20  ataSize;.  pgno 
9200: 3d 20 28 75 33 32 29 61 52 65 73 75 6c 74 5b 31  = (u32)aResult[1
9210: 30 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 67 6e  0];.  while( pgn
9220: 6f 20 26 26 20 6e 2d 2d 20 29 7b 0a 20 20 20 20  o && n-- ){.    
9230: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
9240: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45 6c  .    sprintf(zEl
9250: 65 6d 2c 20 22 25 64 22 2c 20 70 67 6e 6f 29 3b  em, "%d", pgno);
9260: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9270: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73  AppendElement(&s
9280: 74 72 2c 20 7a 45 6c 65 6d 29 3b 0a 20 20 20 20  tr, zElem);.    
9290: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
92a0: 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
92b0: 2c 20 26 70 44 62 50 61 67 65 29 21 3d 53 51 4c  , &pDbPage)!=SQL
92c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
92d0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
92e0: 26 73 74 72 29 3b 0a 20 20 20 20 20 20 54 63 6c  &str);.      Tcl
92f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9300: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
9310: 20 67 65 74 20 70 61 67 65 20 22 2c 20 7a 45 6c   get page ", zEl
9320: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  em, 0);.      sq
9330: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
9340: 70 42 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  pBt);.      retu
9350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9360: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 20 3d 20    }.    pPage = 
9370: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
9380: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
9390: 20 20 70 67 6e 6f 20 3d 20 74 34 47 65 74 34 62    pgno = t4Get4b
93a0: 79 74 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  yte((unsigned ch
93b0: 61 72 2a 29 70 50 61 67 65 29 3b 0a 20 20 20 20  ar*)pPage);.    
93c0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
93d0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  f(pDbPage);.  }.
93e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
93f0: 61 76 65 28 70 42 74 29 3b 0a 20 20 54 63 6c 5f  ave(pBt);.  Tcl_
9400: 44 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  DStringResult(in
9410: 74 65 72 70 2c 20 26 73 74 72 29 3b 0a 20 20 72  terp, &str);.  r
9420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f  .}../*.** The co
9440: 6d 6d 61 6e 64 20 69 73 20 70 72 6f 76 69 64 65  mmand is provide
9450: 64 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  d for the purpos
9460: 65 20 6f 66 20 73 65 74 74 69 6e 67 20 62 72 65  e of setting bre
9470: 61 6b 70 6f 69 6e 74 73 2e 0a 2a 2a 20 69 6e 20  akpoints..** in 
9480: 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 20  regression test 
9490: 73 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 42  scripts..**.** B
94a0: 79 20 73 65 74 74 69 6e 67 20 61 20 47 44 42 20  y setting a GDB 
94b0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 74 68  breakpoint on th
94c0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 6e 64  is procedure and
94d0: 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 0a 2a   executing the.*
94e0: 2a 20 62 74 72 65 65 5f 62 72 65 61 6b 70 6f 69  * btree_breakpoi
94f0: 6e 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61 20  nt command in a 
9500: 74 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20  test script, we 
9510: 63 61 6e 20 73 74 6f 70 20 47 44 42 20 61 74 0a  can stop GDB at.
9520: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 69 6e 20  ** the point in 
9530: 74 68 65 20 73 63 72 69 70 74 20 77 68 65 72 65  the script where
9540: 20 74 68 65 20 62 74 72 65 65 5f 62 72 65 61 6b   the btree_break
9550: 70 6f 69 6e 74 20 63 6f 6d 6d 61 6e 64 20 69 73  point command is
9560: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20 20 54  .** inserted.  T
9570: 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 66 6f  his is useful fo
9580: 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
9590: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
95a0: 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76  _breakpoint(.  v
95b0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
95c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
95d0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
95e0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
95f0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
9600: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
9610: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
9620: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9630: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
9640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
9650: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
9660: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
9670: 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  */.){.  return T
9680: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
9690: 75 73 61 67 65 3a 20 20 20 76 61 72 69 6e 74 5f  usage:   varint_
96a0: 74 65 73 74 20 20 53 54 41 52 54 20 20 4d 55 4c  test  START  MUL
96b0: 54 49 50 4c 49 45 52 20 20 43 4f 55 4e 54 20 20  TIPLIER  COUNT  
96c0: 49 4e 43 52 45 4d 45 4e 54 0a 2a 2a 0a 2a 2a 20  INCREMENT.**.** 
96d0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 74 65 73  This command tes
96e0: 74 73 20 74 68 65 20 70 75 74 56 61 72 69 6e 74  ts the putVarint
96f0: 28 29 20 61 6e 64 20 67 65 74 56 61 72 69 6e 74  () and getVarint
9700: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 2c 20  ().** routines, 
9710: 62 6f 74 68 20 66 6f 72 20 61 63 63 75 72 61 63  both for accurac
9720: 79 20 61 6e 64 20 66 6f 72 20 73 70 65 65 64 2e  y and for speed.
9730: 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
9740: 72 20 69 73 20 77 72 69 74 74 65 6e 20 75 73 69  r is written usi
9750: 6e 67 20 70 75 74 56 61 72 69 6e 74 28 29 20 61  ng putVarint() a
9760: 6e 64 20 72 65 61 64 20 62 61 63 6b 20 77 69 74  nd read back wit
9770: 68 0a 2a 2a 20 67 65 74 56 61 72 69 6e 74 28 29  h.** getVarint()
9780: 20 61 6e 64 20 76 61 72 69 66 69 65 64 20 74 6f   and varified to
9790: 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   be unchanged.  
97a0: 54 68 69 73 20 72 65 70 65 61 74 73 20 43 4f 55  This repeats COU
97b0: 4e 54 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68  NT.** times.  Th
97c0: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
97d0: 69 73 20 53 54 41 52 54 2a 4d 55 4c 54 49 50 4c  is START*MULTIPL
97e0: 49 45 52 2e 20 20 45 61 63 68 20 69 74 65 72 61  IER.  Each itera
97f0: 74 69 6f 6e 0a 2a 2a 20 69 6e 63 72 65 61 73 65  tion.** increase
9800: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 62 79  s the integer by
9810: 20 49 4e 43 52 45 4d 45 4e 54 2e 0a 2a 2a 0a 2a   INCREMENT..**.*
9820: 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72  * This command r
9830: 65 74 75 72 6e 73 20 6e 6f 74 68 69 6e 67 20 69  eturns nothing i
9840: 66 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 74 20  f it works.  It 
9850: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
9860: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 66 20 73   message.** if s
9870: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
9880: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
9890: 6e 74 20 62 74 72 65 65 5f 76 61 72 69 6e 74 5f  nt btree_varint_
98a0: 74 65 73 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  test(.  void *No
98b0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
98c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
98d0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
98e0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
98f0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9900: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9920: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9930: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
9940: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
9950: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9960: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9970: 20 75 33 32 20 73 74 61 72 74 2c 20 6d 75 6c 74   u32 start, mult
9980: 2c 20 63 6f 75 6e 74 2c 20 69 6e 63 72 3b 0a 20  , count, incr;. 
9990: 20 75 36 34 20 69 6e 2c 20 6f 75 74 3b 0a 20 20   u64 in, out;.  
99a0: 69 6e 74 20 6e 31 2c 20 6e 32 2c 20 69 2c 20 6a  int n1, n2, i, j
99b0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
99c0: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69  r zBuf[100];.  i
99d0: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
99e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
99f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
9a00: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
9a10: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
9a20: 2c 0a 20 20 20 20 20 20 20 22 20 53 54 41 52 54  ,.       " START
9a30: 20 4d 55 4c 54 49 50 4c 49 45 52 20 43 4f 55 4e   MULTIPLIER COUN
9a40: 54 20 49 4e 43 52 45 4d 45 4e 54 5c 22 22 2c 20  T INCREMENT\"", 
9a50: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
9a60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9a70: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9a80: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
9a90: 28 69 6e 74 2a 29 26 73 74 61 72 74 29 20 29 20  (int*)&start) ) 
9aa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9ab0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
9ac0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
9ad0: 32 5d 2c 20 28 69 6e 74 2a 29 26 6d 75 6c 74 29  2], (int*)&mult)
9ae0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9af0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
9b00: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9b10: 67 76 5b 33 5d 2c 20 28 69 6e 74 2a 29 26 63 6f  gv[3], (int*)&co
9b20: 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  unt) ) return TC
9b30: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
9b40: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9b50: 2c 20 61 72 67 76 5b 34 5d 2c 20 28 69 6e 74 2a  , argv[4], (int*
9b60: 29 26 69 6e 63 72 29 20 29 20 72 65 74 75 72 6e  )&incr) ) return
9b70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 6e   TCL_ERROR;.  in
9b80: 20 3d 20 73 74 61 72 74 3b 0a 20 20 69 6e 20 2a   = start;.  in *
9b90: 3d 20 6d 75 6c 74 3b 0a 20 20 66 6f 72 28 69 3d  = mult;.  for(i=
9ba0: 30 3b 20 69 3c 63 6f 75 6e 74 3b 20 69 2b 2b 29  0; i<count; i++)
9bb0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 45 72 72 5b  {.    char zErr[
9bc0: 32 30 30 5d 3b 0a 20 20 20 20 6e 31 20 3d 20 70  200];.    n1 = p
9bd0: 75 74 56 61 72 69 6e 74 28 7a 42 75 66 2c 20 69  utVarint(zBuf, i
9be0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 6e 31 3e 39  n);.    if( n1>9
9bf0: 20 7c 7c 20 6e 31 3c 31 20 29 7b 0a 20 20 20 20   || n1<1 ){.    
9c00: 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 20    sprintf(zErr, 
9c10: 22 70 75 74 56 61 72 69 6e 74 20 72 65 74 75 72  "putVarint retur
9c20: 6e 65 64 20 25 64 20 2d 20 73 68 6f 75 6c 64 20  ned %d - should 
9c30: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
9c40: 20 39 22 2c 20 6e 31 29 3b 0a 20 20 20 20 20 20   9", n1);.      
9c50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9c60: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30  (interp, zErr, 0
9c70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9c80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9c90: 0a 20 20 20 20 6e 32 20 3d 20 67 65 74 56 61 72  .    n2 = getVar
9ca0: 69 6e 74 28 7a 42 75 66 2c 20 26 6f 75 74 29 3b  int(zBuf, &out);
9cb0: 0a 20 20 20 20 69 66 28 20 6e 31 21 3d 6e 32 20  .    if( n1!=n2 
9cc0: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
9cd0: 28 7a 45 72 72 2c 20 22 70 75 74 56 61 72 69 6e  (zErr, "putVarin
9ce0: 74 20 72 65 74 75 72 6e 65 64 20 25 64 20 61 6e  t returned %d an
9cf0: 64 20 67 65 74 56 61 72 69 6e 74 20 72 65 74 75  d getVarint retu
9d00: 72 6e 65 64 20 25 64 22 2c 20 6e 31 2c 20 6e 32  rned %d", n1, n2
9d10: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
9d20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9d30: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
9d40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9d50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
9d60: 28 20 69 6e 21 3d 6f 75 74 20 29 7b 0a 20 20 20  ( in!=out ){.   
9d70: 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c     sprintf(zErr,
9d80: 20 22 57 72 6f 74 65 20 30 78 25 30 31 36 6c 6c   "Wrote 0x%016ll
9d90: 78 20 61 6e 64 20 67 6f 74 20 62 61 63 6b 20 30  x and got back 0
9da0: 78 25 30 31 36 6c 6c 78 22 2c 20 69 6e 2c 20 6f  x%016llx", in, o
9db0: 75 74 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ut);.      Tcl_A
9dc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9dd0: 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20  rp, zErr, 0);.  
9de0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9df0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
9e00: 69 66 28 20 28 69 6e 20 26 20 30 78 66 66 66 66  if( (in & 0xffff
9e10: 66 66 66 66 29 3d 3d 69 6e 20 29 7b 0a 20 20 20  ffff)==in ){.   
9e20: 20 20 20 75 33 32 20 6f 75 74 33 32 3b 0a 20 20     u32 out32;.  
9e30: 20 20 20 20 6e 32 20 3d 20 67 65 74 56 61 72 69      n2 = getVari
9e40: 6e 74 33 32 28 7a 42 75 66 2c 20 6f 75 74 33 32  nt32(zBuf, out32
9e50: 29 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d 20 6f  );.      out = o
9e60: 75 74 33 32 3b 0a 20 20 20 20 20 20 69 66 28 20  ut32;.      if( 
9e70: 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20 20 20  n1!=n2 ){.      
9e80: 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c 20    sprintf(zErr, 
9e90: 22 70 75 74 56 61 72 69 6e 74 20 72 65 74 75 72  "putVarint retur
9ea0: 6e 65 64 20 25 64 20 61 6e 64 20 47 65 74 56 61  ned %d and GetVa
9eb0: 72 69 6e 74 33 32 20 72 65 74 75 72 6e 65 64 20  rint32 returned 
9ec0: 25 64 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %d", .          
9ed0: 20 20 20 20 20 20 20 20 6e 31 2c 20 6e 32 29 3b          n1, n2);
9ee0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
9ef0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9f00: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
9f10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9f20: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
9f30: 20 20 20 20 69 66 28 20 69 6e 21 3d 6f 75 74 20      if( in!=out 
9f40: 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e  ){.        sprin
9f50: 74 66 28 7a 45 72 72 2c 20 22 57 72 6f 74 65 20  tf(zErr, "Wrote 
9f60: 30 78 25 30 31 36 6c 6c 78 20 61 6e 64 20 67 6f  0x%016llx and go
9f70: 74 20 62 61 63 6b 20 30 78 25 30 31 36 6c 6c 78  t back 0x%016llx
9f80: 20 66 72 6f 6d 20 47 65 74 56 61 72 69 6e 74 33   from GetVarint3
9f90: 32 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2",.            
9fa0: 69 6e 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  in, out);.      
9fb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9fc0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c  lt(interp, zErr,
9fd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
9fe0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9ff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a000: 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    /* In order to
a010: 20 67 65 74 20 72 65 61 6c 69 73 74 69 63 20 74   get realistic t
a020: 69 6d 69 6e 67 73 2c 20 72 75 6e 20 67 65 74 56  imings, run getV
a030: 61 72 69 6e 74 20 31 39 20 6d 6f 72 65 20 74 69  arint 19 more ti
a040: 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  mes..    ** This
a050: 20 69 73 20 62 65 63 61 75 73 65 20 67 65 74 56   is because getV
a060: 61 72 69 6e 74 20 69 73 20 63 61 6c 6c 65 64 20  arint is called 
a070: 61 62 6f 75 74 20 32 30 20 74 69 6d 65 73 20 6d  about 20 times m
a080: 6f 72 65 20 6f 66 74 65 6e 0a 20 20 20 20 2a 2a  ore often.    **
a090: 20 74 68 61 6e 20 70 75 74 56 61 72 69 6e 74 2e   than putVarint.
a0a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a0b0: 6a 3d 30 3b 20 6a 3c 31 39 3b 20 6a 2b 2b 29 7b  j=0; j<19; j++){
a0c0: 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
a0d0: 28 7a 42 75 66 2c 20 26 6f 75 74 29 3b 0a 20 20  (zBuf, &out);.  
a0e0: 20 20 7d 0a 20 20 20 20 69 6e 20 2b 3d 20 69 6e    }.    in += in
a0f0: 63 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  cr;.  }.  return
a100: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
a110: 2a 20 75 73 61 67 65 3a 20 20 20 62 74 72 65 65  * usage:   btree
a120: 5f 66 72 6f 6d 5f 64 62 20 20 44 42 2d 48 41 4e  _from_db  DB-HAN
a130: 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  DLE.**.** This c
a140: 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ommand returns t
a150: 68 65 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20  he btree handle 
a160: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
a170: 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
a180: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 64 61 74  .** with the dat
a190: 61 62 61 73 65 2d 68 61 6e 64 6c 65 20 70 61 73  abase-handle pas
a1a0: 73 65 64 20 61 73 20 74 68 65 20 61 72 67 75 6d  sed as the argum
a1b0: 65 6e 74 2e 20 45 78 61 6d 70 6c 65 20 75 73 61  ent. Example usa
a1c0: 67 65 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ge:.**.** sqlite
a1d0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 2a 2a 20  3 db test.db.** 
a1e0: 73 65 74 20 62 74 20 5b 62 74 72 65 65 5f 66 72  set bt [btree_fr
a1f0: 6f 6d 5f 64 62 20 64 62 5d 0a 2a 2f 0a 73 74 61  om_db db].*/.sta
a200: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 66 72  tic int btree_fr
a210: 6f 6d 5f 64 62 28 0a 20 20 76 6f 69 64 20 2a 4e  om_db(.  void *N
a220: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
a230: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
a240: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
a250: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
a260: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
a270: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a290: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
a2a0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
a2b0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
a2c0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
a2d0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
a2e0: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
a2f0: 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  ;.  Tcl_CmdInfo 
a300: 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20  info;.  sqlite3 
a310: 2a 64 62 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  *db;.  Btree *pB
a320: 74 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 30  t;.  int iDb = 0
a330: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
a340: 20 26 26 20 61 72 67 63 21 3d 33 20 29 7b 0a 20   && argc!=3 ){. 
a350: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a360: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
a370: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
a380: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
a390: 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42 2d 48  ],.       " DB-H
a3a0: 41 4e 44 4c 45 20 3f 4e 3f 5c 22 22 2c 20 30 29  ANDLE ?N?\"", 0)
a3b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a3c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
a3d0: 66 28 20 31 21 3d 54 63 6c 5f 47 65 74 43 6f 6d  f( 1!=Tcl_GetCom
a3e0: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
a3f0: 20 61 72 67 76 5b 31 5d 2c 20 26 69 6e 66 6f 29   argv[1], &info)
a400: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
a410: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a420: 20 22 4e 6f 20 73 75 63 68 20 64 62 2d 68 61 6e   "No such db-han
a430: 64 6c 65 3a 20 5c 22 22 2c 20 61 72 67 76 5b 31  dle: \"", argv[1
a440: 5d 2c 20 22 5c 22 22 2c 20 30 29 3b 0a 20 20 20  ], "\"", 0);.   
a450: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a460: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  R;.  }.  if( arg
a470: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 69 44 62 20  c==3 ){.    iDb 
a480: 3d 20 61 74 6f 69 28 61 72 67 76 5b 32 5d 29 3b  = atoi(argv[2]);
a490: 0a 20 20 7d 0a 0a 20 20 64 62 20 3d 20 2a 28 28  .  }..  db = *((
a4a0: 73 71 6c 69 74 65 33 20 2a 2a 29 69 6e 66 6f 2e  sqlite3 **)info.
a4b0: 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 3b 0a  objClientData);.
a4c0: 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a    assert( db );.
a4d0: 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
a4e0: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 73 71 6c  [iDb].pBt;.  sql
a4f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
a500: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
a510: 2c 20 22 25 70 22 2c 20 70 42 74 29 3b 0a 20 20  , "%p", pBt);.  
a520: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
a530: 74 65 72 70 2c 20 7a 42 75 66 2c 20 54 43 4c 5f  terp, zBuf, TCL_
a540: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
a550: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
a560: 2f 2a 0a 2a 2a 20 75 73 61 67 65 3a 20 20 20 62  /*.** usage:   b
a570: 74 72 65 65 5f 73 65 74 5f 63 61 63 68 65 5f 73  tree_set_cache_s
a580: 69 7a 65 20 49 44 20 4e 43 41 43 48 45 0a 2a 2a  ize ID NCACHE.**
a590: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 69 7a 65  .** Set the size
a5a0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 75 73   of the cache us
a5b0: 65 64 20 62 79 20 62 74 72 65 65 20 24 49 44 2e  ed by btree $ID.
a5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
a5d0: 74 72 65 65 5f 73 65 74 5f 63 61 63 68 65 5f 73  tree_set_cache_s
a5e0: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ize(.  void *Not
a5f0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a600: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a610: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a620: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a630: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a640: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a660: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a670: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
a680: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
a690: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a6a0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a6b0: 69 6e 74 20 6e 43 61 63 68 65 3b 0a 20 20 42 74  int nCache;.  Bt
a6c0: 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 69 66 28  ree *pBt;..  if(
a6d0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
a6e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a6f0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a700: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a710: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a720: 20 20 20 20 20 20 20 22 20 42 54 20 4e 43 41 43         " BT NCAC
a730: 48 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  HE\"", 0);.    r
a740: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a750: 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c  .  }.  pBt = sql
a760: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
a770: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63  gv[1]);.  if( Tc
a780: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
a790: 20 61 72 67 76 5b 32 5d 2c 20 26 6e 43 61 63 68   argv[2], &nCach
a7a0: 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
a7b0: 45 52 52 4f 52 3b 0a 0a 20 20 73 71 6c 69 74 65  ERROR;..  sqlite
a7c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 42  3_mutex_enter(pB
a7d0: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  t->db->mutex);. 
a7e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
a7f0: 65 72 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  er(pBt);.  sqlit
a800: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
a810: 69 7a 65 28 70 42 74 2c 20 6e 43 61 63 68 65 29  ize(pBt, nCache)
a820: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
a830: 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 73 71  Leave(pBt);.  sq
a840: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a850: 65 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  e(pBt->db->mutex
a860: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
a870: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
a880: 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
a890: 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
a8a0: 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
a8b0: 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e  t Sqlitetest3_In
a8c0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
a8d0: 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
a8e0: 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65   int sqlite3Btre
a8f0: 65 54 72 61 63 65 3b 0a 20 20 73 74 61 74 69 63  eTrace;.  static
a900: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
a910: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
a920: 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50   Tcl_CmdProc *xP
a930: 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20  roc;.  } aCmd[] 
a940: 3d 20 7b 0a 20 20 20 20 20 7b 20 22 62 74 72 65  = {.     { "btre
a950: 65 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20  e_open",        
a960: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
a970: 72 6f 63 2a 29 62 74 72 65 65 5f 6f 70 65 6e 20  roc*)btree_open 
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
a990: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63  .     { "btree_c
a9a0: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
a9b0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
a9c0: 2a 29 62 74 72 65 65 5f 63 6c 6f 73 65 20 20 20  *)btree_close   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a9e0: 20 20 20 7b 20 22 62 74 72 65 65 5f 62 65 67 69     { "btree_begi
a9f0: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20  n_transaction", 
aa00: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
aa10: 74 72 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73  tree_begin_trans
aa20: 61 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  action  },.     
aa30: 7b 20 22 62 74 72 65 65 5f 63 6f 6d 6d 69 74 22  { "btree_commit"
aa40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
aa50: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
aa60: 65 5f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  e_commit        
aa70: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
aa80: 62 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b 22 2c  btree_rollback",
aa90: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
aaa0: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 72  CmdProc*)btree_r
aab0: 6f 6c 6c 62 61 63 6b 20 20 20 20 20 20 20 20 20  ollback         
aac0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
aad0: 65 65 5f 63 72 65 61 74 65 5f 74 61 62 6c 65 22  ee_create_table"
aae0: 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
aaf0: 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 72 65 61  Proc*)btree_crea
ab00: 74 65 5f 74 61 62 6c 65 20 20 20 20 20 20 20 7d  te_table       }
ab10: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
ab20: 64 72 6f 70 5f 74 61 62 6c 65 22 2c 20 20 20 20  drop_table",    
ab30: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
ab40: 63 2a 29 62 74 72 65 65 5f 64 72 6f 70 5f 74 61  c*)btree_drop_ta
ab50: 62 6c 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ble         },. 
ab60: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63 6c 65      { "btree_cle
ab70: 61 72 5f 74 61 62 6c 65 22 2c 20 20 20 20 20 20  ar_table",      
ab80: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
ab90: 62 74 72 65 65 5f 63 6c 65 61 72 5f 74 61 62 6c  btree_clear_tabl
aba0: 65 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  e        },.    
abb0: 20 7b 20 22 62 74 72 65 65 5f 67 65 74 5f 6d 65   { "btree_get_me
abc0: 74 61 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  ta",           (
abd0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
abe0: 65 65 5f 67 65 74 5f 6d 65 74 61 20 20 20 20 20  ee_get_meta     
abf0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
ac00: 22 62 74 72 65 65 5f 75 70 64 61 74 65 5f 6d 65  "btree_update_me
ac10: 74 61 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  ta",        (Tcl
ac20: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
ac30: 75 70 64 61 74 65 5f 6d 65 74 61 20 20 20 20 20  update_meta     
ac40: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
ac50: 72 65 65 5f 70 61 67 65 5f 64 75 6d 70 22 2c 20  ree_page_dump", 
ac60: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
ac70: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 70 61 67  dProc*)btree_pag
ac80: 65 5f 64 75 6d 70 20 20 20 20 20 20 20 20 20 20  e_dump          
ac90: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
aca0: 5f 74 72 65 65 5f 64 75 6d 70 22 2c 20 20 20 20  _tree_dump",    
acb0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
acc0: 6f 63 2a 29 62 74 72 65 65 5f 74 72 65 65 5f 64  oc*)btree_tree_d
acd0: 75 6d 70 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ump          },.
ace0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61       { "btree_pa
acf0: 67 65 72 5f 73 74 61 74 73 22 2c 20 20 20 20 20  ger_stats",     
ad00: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
ad10: 29 62 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61  )btree_pager_sta
ad20: 74 73 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  ts        },.   
ad30: 20 20 7b 20 22 62 74 72 65 65 5f 70 61 67 65 72    { "btree_pager
ad40: 5f 72 65 66 5f 64 75 6d 70 22 2c 20 20 20 20 20  _ref_dump",     
ad50: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
ad60: 72 65 65 5f 70 61 67 65 72 5f 72 65 66 5f 64 75  ree_pager_ref_du
ad70: 6d 70 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  mp     },.     {
ad80: 20 22 62 74 72 65 65 5f 63 75 72 73 6f 72 22 2c   "btree_cursor",
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
ada0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
adb0: 5f 63 75 72 73 6f 72 20 20 20 20 20 20 20 20 20  _cursor         
adc0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
add0: 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f  tree_close_curso
ade0: 72 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  r",       (Tcl_C
adf0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 6c  mdProc*)btree_cl
ae00: 6f 73 65 5f 63 75 72 73 6f 72 20 20 20 20 20 20  ose_cursor      
ae10: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
ae20: 65 5f 6d 6f 76 65 5f 74 6f 22 2c 20 20 20 20 20  e_move_to",     
ae30: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
ae40: 72 6f 63 2a 29 62 74 72 65 65 5f 6d 6f 76 65 5f  roc*)btree_move_
ae50: 74 6f 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  to            },
ae60: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 64  .     { "btree_d
ae70: 65 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20  elete",         
ae80: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
ae90: 2a 29 62 74 72 65 65 5f 64 65 6c 65 74 65 20 20  *)btree_delete  
aea0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
aeb0: 20 20 20 7b 20 22 62 74 72 65 65 5f 6e 65 78 74     { "btree_next
aec0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
aed0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
aee0: 74 72 65 65 5f 6e 65 78 74 20 20 20 20 20 20 20  tree_next       
aef0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
af00: 7b 20 22 62 74 72 65 65 5f 70 72 65 76 22 2c 20  { "btree_prev", 
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
af20: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
af30: 65 5f 70 72 65 76 20 20 20 20 20 20 20 20 20 20  e_prev          
af40: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
af50: 62 74 72 65 65 5f 65 6f 66 22 2c 20 20 20 20 20  btree_eof",     
af60: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
af70: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 65  CmdProc*)btree_e
af80: 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  of              
af90: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
afa0: 65 65 5f 6b 65 79 73 69 7a 65 22 2c 20 20 20 20  ee_keysize",    
afb0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
afc0: 50 72 6f 63 2a 29 62 74 72 65 65 5f 6b 65 79 73  Proc*)btree_keys
afd0: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 7d  ize            }
afe0: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
aff0: 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  key",           
b000: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
b010: 63 2a 29 62 74 72 65 65 5f 6b 65 79 20 20 20 20  c*)btree_key    
b020: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
b030: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 64 61 74      { "btree_dat
b040: 61 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  a",             
b050: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
b060: 62 74 72 65 65 5f 64 61 74 61 20 20 20 20 20 20  btree_data      
b070: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
b080: 20 7b 20 22 62 74 72 65 65 5f 66 65 74 63 68 5f   { "btree_fetch_
b090: 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 28  key",          (
b0a0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
b0b0: 65 65 5f 66 65 74 63 68 5f 6b 65 79 20 20 20 20  ee_fetch_key    
b0c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
b0d0: 22 62 74 72 65 65 5f 66 65 74 63 68 5f 64 61 74  "btree_fetch_dat
b0e0: 61 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c  a",         (Tcl
b0f0: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
b100: 66 65 74 63 68 5f 64 61 74 61 20 20 20 20 20 20  fetch_data      
b110: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
b120: 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 69 7a 65  ree_payload_size
b130: 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
b140: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 70 61 79  dProc*)btree_pay
b150: 6c 6f 61 64 5f 73 69 7a 65 20 20 20 20 20 20 20  load_size       
b160: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
b170: 5f 66 69 72 73 74 22 2c 20 20 20 20 20 20 20 20  _first",        
b180: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
b190: 6f 63 2a 29 62 74 72 65 65 5f 66 69 72 73 74 20  oc*)btree_first 
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
b1b0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 6c 61       { "btree_la
b1c0: 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  st",            
b1d0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
b1e0: 29 62 74 72 65 65 5f 6c 61 73 74 20 20 20 20 20  )btree_last     
b1f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
b200: 20 20 7b 20 22 62 74 72 65 65 5f 69 6e 74 65 67    { "btree_integ
b210: 72 69 74 79 5f 63 68 65 63 6b 22 2c 20 20 20 20  rity_check",    
b220: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
b230: 72 65 65 5f 69 6e 74 65 67 72 69 74 79 5f 63 68  ree_integrity_ch
b240: 65 63 6b 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  eck    },.     {
b250: 20 22 62 74 72 65 65 5f 62 72 65 61 6b 70 6f 69   "btree_breakpoi
b260: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 28 54 63  nt",         (Tc
b270: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
b280: 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20  _breakpoint     
b290: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
b2a0: 74 72 65 65 5f 76 61 72 69 6e 74 5f 74 65 73 74  tree_varint_test
b2b0: 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
b2c0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 76 61  mdProc*)btree_va
b2d0: 72 69 6e 74 5f 74 65 73 74 20 20 20 20 20 20 20  rint_test       
b2e0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
b2f0: 65 5f 62 65 67 69 6e 5f 73 74 61 74 65 6d 65 6e  e_begin_statemen
b300: 74 22 2c 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  t",    (Tcl_CmdP
b310: 72 6f 63 2a 29 62 74 72 65 65 5f 62 65 67 69 6e  roc*)btree_begin
b320: 5f 73 74 61 74 65 6d 65 6e 74 20 20 20 20 7d 2c  _statement    },
b330: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63  .     { "btree_c
b340: 6f 6d 6d 69 74 5f 73 74 61 74 65 6d 65 6e 74 22  ommit_statement"
b350: 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  ,   (Tcl_CmdProc
b360: 2a 29 62 74 72 65 65 5f 63 6f 6d 6d 69 74 5f 73  *)btree_commit_s
b370: 74 61 74 65 6d 65 6e 74 20 20 20 7d 2c 0a 20 20  tatement   },.  
b380: 20 20 20 7b 20 22 62 74 72 65 65 5f 72 6f 6c 6c     { "btree_roll
b390: 62 61 63 6b 5f 73 74 61 74 65 6d 65 6e 74 22 2c  back_statement",
b3a0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
b3b0: 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b 5f 73 74  tree_rollback_st
b3c0: 61 74 65 6d 65 6e 74 20 7d 2c 0a 20 20 20 20 20  atement },.     
b3d0: 7b 20 22 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62  { "btree_from_db
b3e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ",            (T
b3f0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
b400: 65 5f 66 72 6f 6d 5f 64 62 20 20 20 20 20 20 20  e_from_db       
b410: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
b420: 62 74 72 65 65 5f 73 65 74 5f 63 61 63 68 65 5f  btree_set_cache_
b430: 73 69 7a 65 22 2c 20 20 20 20 20 28 54 63 6c 5f  size",     (Tcl_
b440: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 73  CmdProc*)btree_s
b450: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 20 20 20  et_cache_size   
b460: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
b470: 65 65 5f 63 75 72 73 6f 72 5f 69 6e 66 6f 22 2c  ee_cursor_info",
b480: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
b490: 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 75 72 73  Proc*)btree_curs
b4a0: 6f 72 5f 69 6e 66 6f 20 20 20 20 20 20 20 20 7d  or_info        }
b4b0: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
b4c0: 6f 76 66 6c 5f 69 6e 66 6f 22 2c 20 20 20 20 20  ovfl_info",     
b4d0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
b4e0: 63 2a 29 62 74 72 65 65 5f 6f 76 66 6c 5f 69 6e  c*)btree_ovfl_in
b4f0: 66 6f 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  fo          },. 
b500: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63 75 72      { "btree_cur
b510: 73 6f 72 5f 6c 69 73 74 22 2c 20 20 20 20 20 20  sor_list",      
b520: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
b530: 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 6c 69 73  btree_cursor_lis
b540: 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b  t        },.  };
b550: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72  .  int i;..  for
b560: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
b570: 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64  Cmd)/sizeof(aCmd
b580: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
b590: 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
b5a0: 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69  d(interp, aCmd[i
b5b0: 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d  ].zName, aCmd[i]
b5c0: 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20  .xProc, 0, 0);. 
b5d0: 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72   }.  Tcl_LinkVar
b5e0: 28 69 6e 74 65 72 70 2c 20 22 62 74 72 65 65 5f  (interp, "btree_
b5f0: 74 72 61 63 65 22 2c 20 28 63 68 61 72 2a 29 26  trace", (char*)&
b600: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 61 63  sqlite3BtreeTrac
b610: 65 2c 0a 20 20 20 20 20 54 43 4c 5f 4c 49 4e 4b  e,.     TCL_LINK
b620: 5f 49 4e 54 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  _INT);..  /* The
b630: 20 62 74 72 65 65 5f 69 6e 73 65 72 74 20 63 6f   btree_insert co
b640: 6d 6d 61 6e 64 20 69 73 20 69 6d 70 6c 65 6d 65  mmand is impleme
b650: 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 74  nted using the t
b660: 63 6c 20 27 6f 62 6a 65 63 74 27 0a 20 20 2a 2a  cl 'object'.  **
b670: 20 69 6e 74 65 72 66 61 63 65 2c 20 6e 6f 74 20   interface, not 
b680: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 74 65 72  the string inter
b690: 66 61 63 65 20 6c 69 6b 65 20 74 68 65 20 6f 74  face like the ot
b6a0: 68 65 72 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20  her commands in 
b6b0: 74 68 69 73 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  this.  ** file. 
b6c0: 54 68 69 73 20 69 73 20 73 6f 20 62 69 6e 61 72  This is so binar
b6d0: 79 20 64 61 74 61 20 63 61 6e 20 62 65 20 69 6e  y data can be in
b6e0: 73 65 72 74 65 64 20 69 6e 74 6f 20 62 74 72 65  serted into btre
b6f0: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
b700: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
b710: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 62  mmand(interp, "b
b720: 74 72 65 65 5f 69 6e 73 65 72 74 22 2c 20 62 74  tree_insert", bt
b730: 72 65 65 5f 69 6e 73 65 72 74 2c 20 30 2c 20 30  ree_insert, 0, 0
b740: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
b750: 4f 4b 3b 0a 7d 0a                                OK;.}.