/ Hex Artifact Content
Login

Artifact 1df9ea27467e50666e574ebe22d434288beb3050:


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 35 31 20 32 30 30 34 2f 30 39 2f 30 38 20 32  .51 2004/09/08 2
0240: 30 3a 31 33 3a 30 36 20 64 72 68 20 45 78 70 20  0:13:06 drh Exp 
0250: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0260: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0270: 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23  lude "pager.h".#
0280: 69 6e 63 6c 75 64 65 20 22 62 74 72 65 65 2e 68  include "btree.h
0290: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e  ".#include "tcl.
02a0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
02b0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
02c0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a  <string.h>../*.*
02d0: 2a 20 49 6e 74 65 72 70 72 65 74 20 61 6e 20 53  * Interpret an S
02e0: 51 4c 69 74 65 20 65 72 72 6f 72 20 6e 75 6d 62  QLite error numb
02f0: 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  er.*/.static cha
0300: 72 20 2a 65 72 72 6f 72 4e 61 6d 65 28 69 6e 74  r *errorName(int
0310: 20 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e   rc){.  char *zN
0320: 61 6d 65 3b 0a 20 20 73 77 69 74 63 68 28 20 72  ame;.  switch( r
0330: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
0340: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
0350: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0360: 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20 62  _OK";          b
0370: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0380: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
0390: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
03a0: 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20  E_ERROR";       
03b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
03c0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a  SQLITE_INTERNAL:
03d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
03e0: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
03f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0400: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20   SQLITE_PERM:   
0410: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0420: 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20  ITE_PERM";      
0430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0440: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
0450: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0460: 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20  LITE_ABORT";    
0470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0480: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20  se SQLITE_BUSY: 
0490: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
04a0: 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20  QLITE_BUSY";    
04b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
04c0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
04d0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
04e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20  SQLITE_NOMEM";  
04f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0500: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
0510: 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  ONLY:   zName = 
0520: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
0530: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
0540: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
0550: 45 52 52 55 50 54 3a 20 20 7a 4e 61 6d 65 20 3d  ERRUPT:  zName =
0560: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55   "SQLITE_INTERRU
0570: 50 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  PT";   break;.  
0580: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
0590: 45 52 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ERR:      zName 
05a0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22  = "SQLITE_IOERR"
05b0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
05c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
05d0: 4f 52 52 55 50 54 3a 20 20 20 20 7a 4e 61 6d 65  ORRUPT:    zName
05e0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55   = "SQLITE_CORRU
05f0: 50 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  PT";     break;.
0600: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0610: 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 7a 4e 61 6d  NOTFOUND:   zNam
0620: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46  e = "SQLITE_NOTF
0630: 4f 55 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  OUND";    break;
0640: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0650: 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 7a 4e 61  _FULL:       zNa
0660: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c  me = "SQLITE_FUL
0670: 4c 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  L";        break
0680: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0690: 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 4e  E_CANTOPEN:   zN
06a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
06b0: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62 72 65 61  NTOPEN";    brea
06c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
06d0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 7a  TE_PROTOCOL:   z
06e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
06f0: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 62 72 65  ROTOCOL";    bre
0700: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0710: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
0720: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0730: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 62 72  EMPTY";       br
0740: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
0750: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
0760: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0770: 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20 62  _Unknown";     b
0780: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
0790: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
07a0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65  ** Usage:   btre
07b0: 65 5f 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45 20  e_open FILENAME 
07c0: 4e 43 41 43 48 45 20 46 4c 41 47 53 0a 2a 2a 0a  NCACHE FLAGS.**.
07d0: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
07e0: 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63  tabase.*/.static
07f0: 20 69 6e 74 20 62 74 72 65 65 5f 6f 70 65 6e 28   int btree_open(
0800: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
0810: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
0820: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
0830: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0840: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
0850: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
0860: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
0870: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0880: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
0890: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
08a0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
08b0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
08c0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
08d0: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e *pBt;.  int rc
08e0: 2c 20 6e 43 61 63 68 65 2c 20 66 6c 61 67 73 3b  , nCache, flags;
08f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
0900: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
0910: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
0920: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0930: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
0940: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
0950: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
0960: 20 46 49 4c 45 4e 41 4d 45 20 4e 43 41 43 48 45   FILENAME NCACHE
0970: 20 46 4c 41 47 53 5c 22 22 2c 20 30 29 3b 0a 20   FLAGS\"", 0);. 
0980: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0990: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
09a0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
09b0: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6e 43 61 63  , argv[2], &nCac
09c0: 68 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  he) ) return TCL
09d0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
09e0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
09f0: 20 61 72 67 76 5b 33 5d 2c 20 26 66 6c 61 67 73   argv[3], &flags
0a00: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
0a10: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
0a20: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 61 72  ite3BtreeOpen(ar
0a30: 67 76 5b 31 5d 2c 20 26 70 42 74 2c 20 66 6c 61  gv[1], &pBt, fla
0a40: 67 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  gs);.  if( rc!=S
0a50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0a60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0a70: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
0a80: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
0a90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0aa0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
0ab0: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
0ac0: 28 70 42 74 2c 20 6e 43 61 63 68 65 29 3b 0a 20  (pBt, nCache);. 
0ad0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
0ae0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
0af0: 7a 42 75 66 2c 22 25 70 22 2c 20 70 42 74 29 3b  zBuf,"%p", pBt);
0b00: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
0b10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
0b20: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
0b30: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
0b40: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63  Usage:   btree_c
0b50: 6c 6f 73 65 20 49 44 0a 2a 2a 0a 2a 2a 20 43 6c  lose ID.**.** Cl
0b60: 6f 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ose the given da
0b70: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
0b80: 63 20 69 6e 74 20 62 74 72 65 65 5f 63 6c 6f 73  c int btree_clos
0b90: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
0ba0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
0bb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
0bc0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
0bd0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
0be0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
0bf0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
0c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0c10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
0c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0c30: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
0c40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
0c50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
0c60: 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
0c70: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
0c80: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
0c90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0ca0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
0cb0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
0cc0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
0cd0: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
0ce0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0cf0: 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73  R;.  }.  pBt = s
0d00: 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28  qlite3TextToPtr(
0d10: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d  argv[1]);.  rc =
0d20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
0d30: 73 65 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72  se(pBt);.  if( r
0d40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
0d50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
0d60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
0d70: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
0d80: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
0d90: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
0da0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0db0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
0dc0: 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ee_begin_transac
0dd0: 74 69 6f 6e 20 49 44 0a 2a 2a 0a 2a 2a 20 53 74  tion ID.**.** St
0de0: 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
0df0: 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ction.*/.static 
0e00: 69 6e 74 20 62 74 72 65 65 5f 62 65 67 69 6e 5f  int btree_begin_
0e10: 74 72 61 6e 73 61 63 74 69 6f 6e 28 0a 20 20 76  transaction(.  v
0e20: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
0e30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0e40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
0e50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
0e60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
0e70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
0e80: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
0e90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0ea0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
0eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
0ec0: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
0ed0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
0ee0: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
0ef0: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
0f00: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
0f10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
0f20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
0f30: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
0f40: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
0f50: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22  ],.       " ID\"
0f60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
0f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0f80: 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
0f90: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31  TextToPtr(argv[1
0fa0: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
0fb0: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
0fc0: 73 28 70 42 74 2c 20 31 29 3b 0a 20 20 69 66 28  s(pBt, 1);.  if(
0fd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
0fe0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
0ff0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65  Result(interp, e
1000: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
1010: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1020: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1030: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1040: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
1050: 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b 20 49 44  tree_rollback ID
1060: 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  .**.** Rollback 
1070: 63 68 61 6e 67 65 73 0a 2a 2f 0a 73 74 61 74 69  changes.*/.stati
1080: 63 20 69 6e 74 20 62 74 72 65 65 5f 72 6f 6c 6c  c int btree_roll
1090: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  back(.  void *No
10a0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
10b0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
10c0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
10d0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
10e0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
10f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1110: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1120: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
1130: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
1140: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
1150: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
1160: 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69   Btree *pBt;.  i
1170: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67  nt rc;.  if( arg
1180: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1190: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11a0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
11b0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
11c0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
11d0: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
11e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20  RROR;.  }.  pBt 
1200: 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  = sqlite3TextToP
1210: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72  tr(argv[1]);.  r
1220: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1230: 52 6f 6c 6c 62 61 63 6b 28 70 42 74 29 3b 0a 20  Rollback(pBt);. 
1240: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1250: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
1260: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1270: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
1280: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1290: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
12b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
12c0: 20 20 20 62 74 72 65 65 5f 63 6f 6d 6d 69 74 20     btree_commit 
12d0: 49 44 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  ID.**.** Commit 
12e0: 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2f 0a 73  all changes.*/.s
12f0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
1300: 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a  commit(.  void *
1310: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
1320: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
1330: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1340: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1350: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1360: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
1370: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1390: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
13a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
13b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
13c0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
13d0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
13e0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
13f0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1400: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1410: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1420: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1430: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1440: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
1450: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1460: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
1470: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
1480: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
1490: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14a0: 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
14b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14c0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
14d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14e0: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
14f0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1500: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1510: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1530: 20 20 20 62 74 72 65 65 5f 62 65 67 69 6e 5f 73     btree_begin_s
1540: 74 61 74 65 6d 65 6e 74 20 49 44 0a 2a 2a 0a 2a  tatement ID.**.*
1550: 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20 73 74  * Start a new st
1560: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
1570: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
1580: 74 20 62 74 72 65 65 5f 62 65 67 69 6e 5f 73 74  t btree_begin_st
1590: 61 74 65 6d 65 6e 74 28 0a 20 20 76 6f 69 64 20  atement(.  void 
15a0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
15b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
15c0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
15d0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
15e0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
15f0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
1600: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1610: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1620: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
1630: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
1640: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
1650: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1660: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
1670: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1680: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1690: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
16a0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
16b0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
16c0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
16d0: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30        " ID\"", 0
16e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1700: 42 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74  Bt = sqlite3Text
1710: 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a  ToPtr(argv[1]);.
1720: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1730: 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42 74  reeBeginStmt(pBt
1740: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1750: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
1760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1770: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
1780: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
1790: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
17b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
17c0: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 72 6f 6c  age:   btree_rol
17d0: 6c 62 61 63 6b 5f 73 74 61 74 65 6d 65 6e 74 20  lback_statement 
17e0: 49 44 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  ID.**.** Rollbac
17f0: 6b 20 63 68 61 6e 67 65 73 0a 2a 2f 0a 73 74 61  k changes.*/.sta
1800: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 72 6f  tic int btree_ro
1810: 6c 6c 62 61 63 6b 5f 73 74 61 74 65 6d 65 6e 74  llback_statement
1820: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1830: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1840: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1850: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1860: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1870: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1880: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
18b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18c0: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
18d0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
18e0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72  ment */.){.  Btr
18f0: 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72  ee *pBt;.  int r
1900: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
1910: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1920: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1930: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1940: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1950: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
1960: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
1970: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1980: 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71  ;.  }.  pBt = sq
1990: 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61  lite3TextToPtr(a
19a0: 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20  rgv[1]);.  rc = 
19b0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
19c0: 62 61 63 6b 53 74 6d 74 28 70 42 74 29 3b 0a 20  backStmt(pBt);. 
19d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19e0: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
19f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a00: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
1a10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a30: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1a50: 20 20 20 62 74 72 65 65 5f 63 6f 6d 6d 69 74 5f     btree_commit_
1a60: 73 74 61 74 65 6d 65 6e 74 20 49 44 0a 2a 2a 0a  statement ID.**.
1a70: 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1a80: 61 6e 67 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  anges.*/.static 
1a90: 69 6e 74 20 62 74 72 65 65 5f 63 6f 6d 6d 69 74  int btree_commit
1aa0: 5f 73 74 61 74 65 6d 65 6e 74 28 0a 20 20 76 6f  _statement(.  vo
1ab0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
1ac0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ad0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
1ae0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
1af0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
1b00: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
1b10: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
1b20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b30: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
1b40: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
1b50: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
1b60: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
1b70: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
1b80: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
1b90: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1ba0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1bb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1bc0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1bd0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1be0: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
1bf0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c10: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54    pBt = sqlite3T
1c20: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
1c30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c40: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
1c50: 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21  (pBt);.  if( rc!
1c60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c80: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
1c90: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1ca0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1cb0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
1cc0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1cd0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
1ce0: 5f 63 72 65 61 74 65 5f 74 61 62 6c 65 20 49 44  _create_table ID
1cf0: 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 43 72 65   FLAGS.**.** Cre
1d00: 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ate a new table 
1d10: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
1d20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
1d30: 72 65 65 5f 63 72 65 61 74 65 5f 74 61 62 6c 65  ree_create_table
1d40: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1d50: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1d60: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1d70: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1d80: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1d90: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1da0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1dc0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1dd0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1de0: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
1df0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1e00: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72  ment */.){.  Btr
1e10: 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72  ee *pBt;.  int r
1e20: 63 2c 20 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  c, iTable, flags
1e30: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1e40: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
1e50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e70: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1e80: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1e90: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
1ea0: 20 49 44 20 46 4c 41 47 53 5c 22 22 2c 20 30 29   ID FLAGS\"", 0)
1eb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ec0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
1ed0: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
1ee0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
1ef0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
1f00: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
1f10: 20 26 66 6c 61 67 73 29 20 29 20 72 65 74 75 72   &flags) ) retur
1f20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1f30: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1f40: 43 72 65 61 74 65 54 61 62 6c 65 28 70 42 74 2c  CreateTable(pBt,
1f50: 20 26 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   &iTable, flags)
1f60: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1f70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
1f80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1f90: 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28  terp, errorName(
1fa0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
1fb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fc0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
1fd0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1fe0: 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20  f), zBuf, "%d", 
1ff0: 69 54 61 62 6c 65 29 3b 0a 20 20 54 63 6c 5f 41  iTable);.  Tcl_A
2000: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2010: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
2020: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2030: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
2040: 20 62 74 72 65 65 5f 64 72 6f 70 5f 74 61 62 6c   btree_drop_tabl
2050: 65 20 49 44 20 54 41 42 4c 45 4e 55 4d 0a 2a 2a  e ID TABLENUM.**
2060: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
2070: 74 69 72 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  tire table from 
2080: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  the database.*/.
2090: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
20a0: 5f 64 72 6f 70 5f 74 61 62 6c 65 28 0a 20 20 76  _drop_table(.  v
20b0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
20c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20d0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
20e0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
20f0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2100: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2110: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2130: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
2150: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
2160: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2170: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
2180: 42 74 3b 0a 20 20 69 6e 74 20 69 54 61 62 6c 65  Bt;.  int iTable
2190: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
21a0: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
21b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
21c0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
21d0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
21e0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
21f0: 0a 20 20 20 20 20 20 20 22 20 49 44 20 54 41 42  .       " ID TAB
2200: 4c 45 4e 55 4d 5c 22 22 2c 20 30 29 3b 0a 20 20  LENUM\"", 0);.  
2210: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2220: 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20  OR;.  }.  pBt = 
2230: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
2240: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
2250: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
2260: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 54  rp, argv[2], &iT
2270: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54  able) ) return T
2280: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
2290: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
22a0: 70 54 61 62 6c 65 28 70 42 74 2c 20 69 54 61 62  pTable(pBt, iTab
22b0: 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  le);.  if( rc!=S
22c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
22e0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
22f0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
2300: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2310: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
2320: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2330: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63  Usage:   btree_c
2340: 6c 65 61 72 5f 74 61 62 6c 65 20 49 44 20 54 41  lear_table ID TA
2350: 42 4c 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 52 65 6d  BLENUM.**.** Rem
2360: 6f 76 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ove all entries 
2370: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 74  from the given t
2380: 61 62 6c 65 20 62 75 74 20 6b 65 65 70 20 74 68  able but keep th
2390: 65 20 74 61 62 6c 65 20 61 72 6f 75 6e 64 2e 0a  e table around..
23a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
23b0: 72 65 65 5f 63 6c 65 61 72 5f 74 61 62 6c 65 28  ree_clear_table(
23c0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
23d0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
23e0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
23f0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2400: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2410: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2420: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
2430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2440: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2450: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2460: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
2470: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
2480: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
2490: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 54  e *pBt;.  int iT
24a0: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  able;.  int rc;.
24b0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
24c0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
24d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
24e0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
24f0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2500: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
2510: 20 54 41 42 4c 45 4e 55 4d 5c 22 22 2c 20 30 29   TABLENUM\"", 0)
2520: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2530: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42  _ERROR;.  }.  pB
2540: 74 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  t = sqlite3TextT
2550: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
2560: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
2570: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
2580: 20 26 69 54 61 62 6c 65 29 20 29 20 72 65 74 75   &iTable) ) retu
2590: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25b0: 65 43 6c 65 61 72 54 61 62 6c 65 28 70 42 74 2c  eClearTable(pBt,
25c0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20   iTable);.  if( 
25d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25e0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
25f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
2600: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
2610: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2620: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2630: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2640: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
2650: 72 65 65 5f 67 65 74 5f 6d 65 74 61 20 49 44 0a  ree_get_meta ID.
2660: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74  **.** Return met
2670: 61 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  a data.*/.static
2680: 20 69 6e 74 20 62 74 72 65 65 5f 67 65 74 5f 6d   int btree_get_m
2690: 65 74 61 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  eta(.  void *Not
26a0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
26b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
26c0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
26d0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26e0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26f0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2710: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2720: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
2730: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
2740: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2750: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2760: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
2770: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t rc;.  int i;. 
2780: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
2790: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
27a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
27b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
27c0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
27d0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
27e0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
27f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2800: 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  }.  pBt = sqlite
2810: 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b  3TextToPtr(argv[
2820: 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1]);.  for(i=0; 
2830: 69 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  i<SQLITE_N_BTREE
2840: 5f 4d 45 54 41 3b 20 69 2b 2b 29 7b 0a 20 20 20  _META; i++){.   
2850: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
2860: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
2870: 20 76 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   v;.    rc = sql
2880: 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2890: 28 70 42 74 2c 20 69 2c 20 26 76 29 3b 0a 20 20  (pBt, i, &v);.  
28a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
28c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
28d0: 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28  terp, errorName(
28e0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  rc), 0);.      r
28f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2900: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2910: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2920: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 22  of(zBuf), zBuf,"
2930: 25 64 22 2c 76 29 3b 0a 20 20 20 20 54 63 6c 5f  %d",v);.    Tcl_
2940: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2950: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  terp, zBuf);.  }
2960: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
2980: 3a 20 20 20 62 74 72 65 65 5f 75 70 64 61 74 65  :   btree_update
2990: 5f 6d 65 74 61 20 49 44 20 4d 45 54 41 44 41 54  _meta ID METADAT
29a0: 41 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  A....**.** Retur
29b0: 6e 20 6d 65 74 61 20 64 61 74 61 0a 2a 2f 0a 73  n meta data.*/.s
29c0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
29d0: 75 70 64 61 74 65 5f 6d 65 74 61 28 0a 20 20 76  update_meta(.  v
29e0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
29f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a00: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2a10: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2a20: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2a30: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2a40: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2a50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a60: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
2a80: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
2a90: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2aa0: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
2ab0: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
2ac0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 61 4d 65  int i;.  int aMe
2ad0: 74 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  ta[SQLITE_N_BTRE
2ae0: 45 5f 4d 45 54 41 5d 3b 0a 0a 20 20 69 66 28 20  E_META];..  if( 
2af0: 61 72 67 63 21 3d 32 2b 53 51 4c 49 54 45 5f 4e  argc!=2+SQLITE_N
2b00: 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 7b 0a 20  _BTREE_META ){. 
2b10: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
2b20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
2b30: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2b40: 75 66 29 2c 20 7a 42 75 66 2c 22 25 64 22 2c 53  uf), zBuf,"%d",S
2b50: 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45  QLITE_N_BTREE_ME
2b60: 54 41 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  TA);.    Tcl_App
2b70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b80: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2b90: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2ba0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
2bb0: 22 20 49 44 20 4d 45 54 41 44 41 54 41 2e 2e 2e  " ID METADATA...
2bc0: 5c 22 20 28 4d 45 54 41 44 41 54 41 20 69 73 20  \" (METADATA is 
2bd0: 22 2c 20 7a 42 75 66 2c 20 22 20 69 6e 74 65 67  ", zBuf, " integ
2be0: 65 72 73 29 22 2c 20 30 29 3b 0a 20 20 20 20 72  ers)", 0);.    r
2bf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c00: 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c  .  }.  pBt = sql
2c10: 69 74 65 33 54 65 78 74 54 6f 50 74 72 28 61 72  ite3TextToPtr(ar
2c20: 67 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  gv[1]);.  for(i=
2c30: 31 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 42 54  1; i<SQLITE_N_BT
2c40: 52 45 45 5f 4d 45 54 41 3b 20 69 2b 2b 29 7b 0a  REE_META; i++){.
2c50: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
2c60: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
2c70: 69 2b 32 5d 2c 20 26 61 4d 65 74 61 5b 69 5d 29  i+2], &aMeta[i])
2c80: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2c90: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
2ca0: 3d 31 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 42  =1; i<SQLITE_N_B
2cb0: 54 52 45 45 5f 4d 45 54 41 3b 20 69 2b 2b 29 7b  TREE_META; i++){
2cc0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2cd0: 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2ce0: 28 70 42 74 2c 20 69 2c 20 61 4d 65 74 61 5b 69  (pBt, i, aMeta[i
2cf0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
2d00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2d20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
2d30: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
2d40: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2d50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
2d60: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
2d80: 3a 20 20 20 62 74 72 65 65 5f 70 61 67 65 5f 64  :   btree_page_d
2d90: 75 6d 70 20 49 44 20 50 41 47 45 4e 55 4d 0a 2a  ump ID PAGENUM.*
2da0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 64 69 73  *.** Print a dis
2db0: 61 73 73 65 6d 62 6c 79 20 6f 66 20 61 20 70 61  assembly of a pa
2dc0: 67 65 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f  ge on standard o
2dd0: 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  utput.*/.static 
2de0: 69 6e 74 20 62 74 72 65 65 5f 70 61 67 65 5f 64  int btree_page_d
2df0: 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ump(.  void *Not
2e00: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2e10: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2e20: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2e30: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2e40: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2e50: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2e80: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
2e90: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
2ea0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2eb0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2ec0: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
2ed0: 74 20 69 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  t iPage;.  int r
2ee0: 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  c;..  if( argc!=
2ef0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
2f00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2f10: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2f20: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2f30: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
2f40: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
2f50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f60: 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73  R;.  }.  pBt = s
2f70: 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28  qlite3TextToPtr(
2f80: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
2f90: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
2fa0: 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 50 61  p, argv[2], &iPa
2fb0: 67 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ge) ) return TCL
2fc0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
2fd0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44  qlite3BtreePageD
2fe0: 75 6d 70 28 70 42 74 2c 20 69 50 61 67 65 2c 20  ump(pBt, iPage, 
2ff0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
3000: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
3010: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3020: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
3030: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
3040: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
3060: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3070: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 74 72  sage:   btree_tr
3080: 65 65 5f 64 75 6d 70 20 49 44 20 50 41 47 45 4e  ee_dump ID PAGEN
3090: 55 4d 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UM.**.** Print a
30a0: 20 64 69 73 61 73 73 65 6d 62 6c 79 20 6f 66 20   disassembly of 
30b0: 61 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69  a page and all i
30c0: 74 73 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ts child pages o
30d0: 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  n standard outpu
30e0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
30f0: 62 74 72 65 65 5f 74 72 65 65 5f 64 75 6d 70 28  btree_tree_dump(
3100: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3110: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3120: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3130: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3140: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3150: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3160: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3170: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3180: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3190: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
31a0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
31b0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
31c0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
31d0: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 50  e *pBt;.  int iP
31e0: 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
31f0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
3200: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3210: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3220: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3230: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3240: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
3250: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
3260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3270: 20 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74   }.  pBt = sqlit
3280: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
3290: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [1]);.  if( Tcl_
32a0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
32b0: 72 67 76 5b 32 5d 2c 20 26 69 50 61 67 65 29 20  rgv[2], &iPage) 
32c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
32d0: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
32e0: 65 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28  e3BtreePageDump(
32f0: 70 42 74 2c 20 69 50 61 67 65 2c 20 31 29 3b 0a  pBt, iPage, 1);.
3300: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63  rp, errorName(rc
3340: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
3350: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3360: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3380: 3a 20 20 20 62 74 72 65 65 5f 70 61 67 65 72 5f  :   btree_pager_
3390: 73 74 61 74 73 20 49 44 0a 2a 2a 0a 2a 2a 20 52  stats ID.**.** R
33a0: 65 74 75 72 6e 73 20 70 61 67 65 72 20 73 74 61  eturns pager sta
33b0: 74 69 73 74 69 63 73 0a 2a 2f 0a 73 74 61 74 69  tistics.*/.stati
33c0: 63 20 69 6e 74 20 62 74 72 65 65 5f 70 61 67 65  c int btree_page
33d0: 72 5f 73 74 61 74 73 28 0a 20 20 76 6f 69 64 20  r_stats(.  void 
33e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
33f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3400: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3410: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3420: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3430: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3440: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3450: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3460: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
3470: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
3480: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3490: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
34a0: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
34b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 2a    int i;.  int *
34c0: 61 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  a;..  if( argc!=
34d0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
34e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
34f0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3500: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3510: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
3520: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
3530: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3540: 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20 73  R;.  }.  pBt = s
3550: 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28  qlite3TextToPtr(
3560: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 20 3d 20  argv[1]);.  a = 
3570: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
3580: 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ts(sqlite3BtreeP
3590: 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 66 6f  ager(pBt));.  fo
35a0: 72 28 69 3d 30 3b 20 69 3c 39 3b 20 69 2b 2b 29  r(i=0; i<9; i++)
35b0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  {.    static cha
35c0: 72 20 2a 7a 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20  r *zName[] = {. 
35d0: 20 20 20 20 20 22 72 65 66 22 2c 20 22 70 61 67       "ref", "pag
35e0: 65 22 2c 20 22 6d 61 78 22 2c 20 22 73 69 7a 65  e", "max", "size
35f0: 22 2c 20 22 73 74 61 74 65 22 2c 20 22 65 72 72  ", "state", "err
3600: 22 2c 0a 20 20 20 20 20 20 22 68 69 74 22 2c 20  ",.      "hit", 
3610: 22 6d 69 73 73 22 2c 20 22 6f 76 66 6c 22 2c 0a  "miss", "ovfl",.
3620: 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20      };.    char 
3630: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 54  zBuf[100];.    T
3640: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
3650: 28 69 6e 74 65 72 70 2c 20 7a 4e 61 6d 65 5b 69  (interp, zName[i
3660: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
3670: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3680: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 22 25 64 22  zBuf), zBuf,"%d"
3690: 2c 61 5b 69 5d 29 3b 0a 20 20 20 20 54 63 6c 5f  ,a[i]);.    Tcl_
36a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
36b0: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  terp, zBuf);.  }
36c0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
36d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
36e0: 3a 20 20 20 62 74 72 65 65 5f 70 61 67 65 72 5f  :   btree_pager_
36f0: 72 65 66 5f 64 75 6d 70 20 49 44 0a 2a 2a 0a 2a  ref_dump ID.**.*
3700: 2a 20 50 72 69 6e 74 20 6f 75 74 20 61 6c 6c 20  * Print out all 
3710: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
3720: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
3730: 20 62 74 72 65 65 5f 70 61 67 65 72 5f 72 65 66   btree_pager_ref
3740: 5f 64 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a 4e  _dump(.  void *N
3750: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3760: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3770: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
3780: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
3790: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
37a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37c0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
37d0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
37e0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
37f0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3800: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3810: 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20    Btree *pBt;.. 
3820: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
3830: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3840: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3850: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
3860: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
3870: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
3880: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
3890: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
38a0: 7d 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  }.  pBt = sqlite
38b0: 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b  3TextToPtr(argv[
38c0: 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  1]);.  sqlite3pa
38d0: 67 65 72 5f 72 65 66 64 75 6d 70 28 73 71 6c 69  ger_refdump(sqli
38e0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
38f0: 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  t));.  return TC
3900: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3910: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 69 6e  sage:   btree_in
3920: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 49 44  tegrity_check ID
3930: 20 52 4f 4f 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   ROOT ....**.** 
3940: 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 65 76 65  Look through eve
3950: 72 79 20 70 61 67 65 20 6f 66 20 74 68 65 20 67  ry page of the g
3960: 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c 65 20  iven BTree file 
3970: 74 6f 20 76 65 72 69 66 79 20 63 6f 72 72 65 63  to verify correc
3980: 74 0a 2a 2a 20 66 6f 72 6d 61 74 74 69 6e 67 20  t.** formatting 
3990: 61 6e 64 20 6c 69 6e 6b 61 67 65 2e 20 20 52 65  and linkage.  Re
39a0: 74 75 72 6e 20 61 20 6c 69 6e 65 20 6f 66 20 74  turn a line of t
39b0: 65 78 74 20 66 6f 72 20 65 61 63 68 20 70 72 6f  ext for each pro
39c0: 62 6c 65 6d 20 66 6f 75 6e 64 2e 0a 2a 2a 20 52  blem found..** R
39d0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
39e0: 74 72 69 6e 67 20 69 66 20 65 76 65 72 79 74 68  tring if everyth
39f0: 69 6e 67 20 77 6f 72 6b 65 64 2e 0a 2a 2f 0a 73  ing worked..*/.s
3a00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
3a10: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
3a20: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3a30: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3a40: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3a50: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3a60: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3a70: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3a80: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3a90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3aa0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3ab0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3ac0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
3ad0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3ae0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
3af0: 65 20 2a 70 42 74 3b 0a 20 20 63 68 61 72 20 2a  e *pBt;.  char *
3b00: 7a 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e  zResult;.  int n
3b10: 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 2a 61 52 6f  Root;.  int *aRo
3b20: 6f 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ot;.  int i;..  
3b30: 69 66 28 20 61 72 67 63 3c 33 20 29 7b 0a 20 20  if( argc<3 ){.  
3b40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3b50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3b60: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
3b70: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
3b80: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 20 52 4f  ,.       " ID RO
3b90: 4f 54 20 2e 2e 2e 5c 22 22 2c 20 30 29 3b 0a 20  OT ...\"", 0);. 
3ba0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3bb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d  ROR;.  }.  pBt =
3bc0: 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74   sqlite3TextToPt
3bd0: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 6e 52  r(argv[1]);.  nR
3be0: 6f 6f 74 20 3d 20 61 72 67 63 2d 32 3b 0a 20 20  oot = argc-2;.  
3bf0: 61 52 6f 6f 74 20 3d 20 6d 61 6c 6c 6f 63 28 20  aRoot = malloc( 
3c00: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 61 72 67  sizeof(int)*(arg
3c10: 63 2d 32 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  c-2) );.  for(i=
3c20: 30 3b 20 69 3c 61 72 67 63 2d 32 3b 20 69 2b 2b  0; i<argc-2; i++
3c30: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
3c40: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
3c50: 67 76 5b 69 2b 32 5d 2c 20 26 61 52 6f 6f 74 5b  gv[i+2], &aRoot[
3c60: 69 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  i]) ) return TCL
3c70: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 52  _ERROR;.  }.  zR
3c80: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 42  esult = sqlite3B
3c90: 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65  treeIntegrityChe
3ca0: 63 6b 28 70 42 74 2c 20 61 52 6f 6f 74 2c 20 6e  ck(pBt, aRoot, n
3cb0: 52 6f 6f 74 29 3b 0a 20 20 69 66 28 20 7a 52 65  Root);.  if( zRe
3cc0: 73 75 6c 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  sult ){.    Tcl_
3cd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3ce0: 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29  erp, zResult, 0)
3cf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3d00: 28 7a 52 65 73 75 6c 74 29 3b 20 0a 20 20 7d 0a  (zResult); .  }.
3d10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
3d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
3d30: 20 20 20 62 74 72 65 65 5f 63 75 72 73 6f 72 5f     btree_cursor_
3d40: 6c 69 73 74 20 49 44 0a 2a 2a 0a 2a 2a 20 50 72  list ID.**.** Pr
3d50: 69 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  int information 
3d60: 61 62 6f 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  about all cursor
3d70: 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
3d80: 74 70 75 74 20 66 6f 72 20 64 65 62 75 67 67 69  tput for debuggi
3d90: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
3da0: 74 20 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 6c  t btree_cursor_l
3db0: 69 73 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ist(.  void *Not
3dc0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
3dd0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
3de0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
3df0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
3e00: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
3e10: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3e30: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3e40: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
3e50: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
3e60: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
3e70: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
3e80: 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 69  Btree *pBt;..  i
3e90: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
3ea0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3eb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3ec0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
3ed0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
3ee0: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
3ef0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
3f00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3f10: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 54    pBt = sqlite3T
3f20: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
3f30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
3f40: 65 43 75 72 73 6f 72 4c 69 73 74 28 70 42 74 29  eCursorList(pBt)
3f50: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3f60: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
3f70: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63 75  sage:   btree_cu
3f80: 72 73 6f 72 20 49 44 20 54 41 42 4c 45 4e 55 4d  rsor ID TABLENUM
3f90: 20 57 52 49 54 45 41 42 4c 45 0a 2a 2a 0a 2a 2a   WRITEABLE.**.**
3fa0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
3fb0: 72 73 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  rsor.  Return th
3fc0: 65 20 49 44 20 66 6f 72 20 74 68 65 20 63 75 72  e ID for the cur
3fd0: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sor..*/.static i
3fe0: 6e 74 20 62 74 72 65 65 5f 63 75 72 73 6f 72 28  nt btree_cursor(
3ff0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4000: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4010: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4020: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4030: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4040: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4050: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4060: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4070: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4080: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4090: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
40a0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
40b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
40c0: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 54  e *pBt;.  int iT
40d0: 61 62 6c 65 3b 0a 20 20 42 74 43 75 72 73 6f 72  able;.  BtCursor
40e0: 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63   *pCur;.  int rc
40f0: 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a  ;.  int wrFlag;.
4100: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4110: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ..  if( argc!=4 
4120: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4130: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4140: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4150: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4160: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
4170: 49 44 20 54 41 42 4c 45 4e 55 4d 20 57 52 49 54  ID TABLENUM WRIT
4180: 45 41 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20  EABLE\"", 0);.  
4190: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
41a0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 74 20 3d 20  OR;.  }.  pBt = 
41b0: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
41c0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
41d0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
41e0: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 54  rp, argv[2], &iT
41f0: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54  able) ) return T
4200: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
4210: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 28 69  Tcl_GetBoolean(i
4220: 6e 74 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20  nterp, argv[3], 
4230: 26 77 72 46 6c 61 67 29 20 29 20 72 65 74 75 72  &wrFlag) ) retur
4240: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
4250: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
4260: 43 75 72 73 6f 72 28 70 42 74 2c 20 69 54 61 62  Cursor(pBt, iTab
4270: 6c 65 2c 20 77 72 46 6c 61 67 2c 20 30 2c 20 30  le, wrFlag, 0, 0
4280: 2c 20 26 70 43 75 72 29 3b 0a 20 20 69 66 28 20  , &pCur);.  if( 
4290: 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  rc ){.    Tcl_Ap
42a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
42b0: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
42c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
42d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
42e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
42f0: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
4300: 20 7a 42 75 66 2c 22 25 70 22 2c 20 70 43 75 72   zBuf,"%p", pCur
4310: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
4320: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
4330: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
4340: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4350: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
4360: 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72  ree_close_cursor
4370: 20 49 44 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20   ID.**.** Close 
4380: 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
4390: 75 73 69 6e 67 20 62 74 72 65 65 5f 63 75 72 73  using btree_curs
43a0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
43b0: 74 20 62 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75  t btree_close_cu
43c0: 72 73 6f 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  rsor(.  void *No
43d0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
43e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
43f0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4400: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4410: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4420: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4440: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4450: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
4460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4470: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4480: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
44a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
44b0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
44c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
44d0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
44e0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
44f0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
4500: 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c  .       " ID\"",
4510: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4520: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4530: 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54   pCur = sqlite3T
4540: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
4550: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
4560: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
4570: 72 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  r(pCur);.  if( r
4580: 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c ){.    Tcl_App
4590: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
45a0: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
45b0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
45c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
45d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
45e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
45f0: 65 3a 20 20 20 62 74 72 65 65 5f 6d 6f 76 65 5f  e:   btree_move_
4600: 74 6f 20 49 44 20 4b 45 59 0a 2a 2a 0a 2a 2a 20  to ID KEY.**.** 
4610: 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
4620: 74 6f 20 74 68 65 20 65 6e 74 72 79 20 77 69 74  to the entry wit
4630: 68 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  h the given key.
4640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4650: 74 72 65 65 5f 6d 6f 76 65 5f 74 6f 28 0a 20 20  tree_move_to(.  
4660: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4670: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4680: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4690: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
46a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
46b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
46c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
46d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
46e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
46f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
4700: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
4710: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4720: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
4730: 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
4740: 63 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  c;.  int res;.  
4750: 63 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 0a  char zBuf[20];..
4760: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
4770: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
4780: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
4790: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
47a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
47b0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
47c0: 20 4b 45 59 5c 22 22 2c 20 30 29 3b 0a 20 20 20   KEY\"", 0);.   
47d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
47e0: 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20  R;.  }.  pCur = 
47f0: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
4800: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
4810: 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
4820: 67 73 28 70 43 75 72 29 20 26 20 42 54 52 45 45  gs(pCur) & BTREE
4830: 5f 49 4e 54 4b 45 59 20 29 7b 0a 20 20 20 20 69  _INTKEY ){.    i
4840: 6e 74 20 69 4b 65 79 3b 0a 20 20 20 20 69 66 28  nt iKey;.    if(
4850: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
4860: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 4b  rp, argv[2], &iK
4870: 65 79 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ey) ) return TCL
4880: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d  _ERROR;.    rc =
4890: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
48a0: 65 74 6f 28 70 43 75 72 2c 20 30 2c 20 69 4b 65  eto(pCur, 0, iKe
48b0: 79 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73  y, &res);.  }els
48c0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
48d0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
48e0: 43 75 72 2c 20 61 72 67 76 5b 32 5d 2c 20 73 74  Cur, argv[2], st
48f0: 72 6c 65 6e 28 61 72 67 76 5b 32 5d 29 2c 20 26  rlen(argv[2]), &
4900: 72 65 73 29 3b 20 20 0a 20 20 7d 0a 20 20 69 66  res);  .  }.  if
4910: 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
4920: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4930: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
4940: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
4950: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4960: 7d 0a 20 20 69 66 28 20 72 65 73 3c 30 20 29 20  }.  if( res<0 ) 
4970: 72 65 73 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  res = -1;.  if( 
4980: 72 65 73 3e 30 20 29 20 72 65 73 20 3d 20 31 3b  res>0 ) res = 1;
4990: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
49a0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
49b0: 2c 20 7a 42 75 66 2c 22 25 64 22 2c 72 65 73 29  , zBuf,"%d",res)
49c0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
49d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
49e0: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
49f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4a00: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
4a10: 65 65 5f 64 65 6c 65 74 65 20 49 44 0a 2a 2a 0a  ee_delete ID.**.
4a20: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e  ** Delete the en
4a30: 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72  try that the cur
4a40: 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
4a50: 74 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  to.*/.static int
4a60: 20 62 74 72 65 65 5f 64 65 6c 65 74 65 28 0a 20   btree_delete(. 
4a70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4a80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4a90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4aa0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4ab0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4ac0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4ad0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4ae0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4af0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4b00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
4b10: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
4b20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4b30: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  t */.){.  BtCurs
4b40: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
4b50: 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  rc;..  if( argc!
4b60: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
4b70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4b80: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4b90: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4ba0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
4bb0: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
4bc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4bd0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d  OR;.  }.  pCur =
4be0: 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74   sqlite3TextToPt
4bf0: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63  r(argv[1]);.  rc
4c00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
4c10: 65 6c 65 74 65 28 70 43 75 72 29 3b 0a 20 20 69  elete(pCur);.  i
4c20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c  f( rc ){.    Tcl
4c30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4c40: 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28  terp, errorName(
4c50: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
4c60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4c80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4c90: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 69  Usage:   btree_i
4ca0: 6e 73 65 72 74 20 49 44 20 4b 45 59 20 44 41 54  nsert ID KEY DAT
4cb0: 41 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  A.**.** Create a
4cc0: 20 6e 65 77 20 65 6e 74 72 79 20 77 69 74 68 20   new entry with 
4cd0: 74 68 65 20 67 69 76 65 6e 20 6b 65 79 20 61 6e  the given key an
4ce0: 64 20 64 61 74 61 2e 20 20 49 66 20 61 6e 20 65  d data.  If an e
4cf0: 6e 74 72 79 20 61 6c 72 65 61 64 79 0a 2a 2a 20  ntry already.** 
4d00: 65 78 69 73 74 73 20 77 69 74 68 20 74 68 65 20  exists with the 
4d10: 73 61 6d 65 20 6b 65 79 20 74 68 65 20 6f 6c 64  same key the old
4d20: 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72   entry is overwr
4d30: 69 74 74 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  itten..*/.static
4d40: 20 69 6e 74 20 62 74 72 65 65 5f 69 6e 73 65 72   int btree_inser
4d50: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
4d60: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
4d70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
4d80: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
4d90: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
4da0: 5d 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ].){.  BtCursor 
4db0: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
4dc0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
4dd0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
4de0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
4df0: 31 2c 20 6f 62 6a 76 2c 20 22 49 44 20 4b 45 59  1, objv, "ID KEY
4e00: 20 44 41 54 41 22 29 3b 0a 20 20 20 20 72 65 74   DATA");.    ret
4e10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4e20: 20 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69   }.  pCur = sqli
4e30: 74 65 33 54 65 78 74 54 6f 50 74 72 28 54 63 6c  te3TextToPtr(Tcl
4e40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
4e50: 31 5d 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  1]));.  if( sqli
4e60: 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 70 43  te3BtreeFlags(pC
4e70: 75 72 29 20 26 20 42 54 52 45 45 5f 49 4e 54 4b  ur) & BTREE_INTK
4e80: 45 59 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4b  EY ){.    i64 iK
4e90: 65 79 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b  ey;.    int len;
4ea0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
4eb0: 61 72 20 2a 70 42 75 66 3b 0a 20 20 20 20 69 66  ar *pBuf;.    if
4ec0: 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
4ed0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
4ee0: 6f 62 6a 76 5b 32 5d 2c 20 26 69 4b 65 79 29 20  objv[2], &iKey) 
4ef0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
4f00: 4f 52 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 54  OR;.    pBuf = T
4f10: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
4f20: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
4f30: 26 6c 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d 20  &len);.    rc = 
4f40: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
4f50: 72 74 28 70 43 75 72 2c 20 30 2c 20 69 4b 65 79  rt(pCur, 0, iKey
4f60: 2c 20 70 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  , pBuf, len);.  
4f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6b  }else{.    int k
4f80: 65 79 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 64  eylen;.    int d
4f90: 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  len;.    unsigne
4fa0: 64 20 63 68 61 72 20 2a 70 4b 42 75 66 3b 0a 20  d char *pKBuf;. 
4fb0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
4fc0: 20 2a 70 44 42 75 66 3b 0a 20 20 20 20 70 4b 42   *pDBuf;.    pKB
4fd0: 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  uf = Tcl_GetByte
4fe0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
4ff0: 76 5b 32 5d 2c 20 26 6b 65 79 6c 65 6e 29 3b 0a  v[2], &keylen);.
5000: 20 20 20 20 70 44 42 75 66 20 3d 20 54 63 6c 5f      pDBuf = Tcl_
5010: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
5020: 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 64 6c  Obj(objv[3], &dl
5030: 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  en);.    rc = sq
5040: 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
5050: 28 70 43 75 72 2c 20 70 4b 42 75 66 2c 20 6b 65  (pCur, pKBuf, ke
5060: 79 6c 65 6e 2c 20 70 44 42 75 66 2c 20 64 6c 65  ylen, pDBuf, dle
5070: 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  n);.  }.  if( rc
5080: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5090: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
50a0: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
50b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
50c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
50d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
50e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
50f0: 3a 20 20 20 62 74 72 65 65 5f 6e 65 78 74 20 49  :   btree_next I
5100: 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  D.**.** Move the
5110: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
5120: 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
5130: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
5140: 30 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  0 on success.** 
5150: 6f 72 20 31 20 69 66 20 74 68 65 20 63 75 72 73  or 1 if the curs
5160: 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
5170: 6e 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  n the last entry
5180: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
5190: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
51a0: 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74   is empty..*/.st
51b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 6e  atic int btree_n
51c0: 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ext(.  void *Not
51d0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
51e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
51f0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
5200: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
5210: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
5220: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
5230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5240: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
5250: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
5260: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
5270: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
5280: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
5290: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
52a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
52b0: 72 65 73 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  res = 0;.  char 
52c0: 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
52d0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
52e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
52f0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
5300: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
5310: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
5320: 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c  .       " ID\"",
5330: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5340: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5350: 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54   pCur = sqlite3T
5360: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
5370: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
5380: 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
5390: 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
53a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
53b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
53c0: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
53d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
53e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
53f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
5400: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42  (sizeof(zBuf),zB
5410: 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20  uf,"%d",res);.  
5420: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5430: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
5440: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5450: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5460: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 70  Usage:   btree_p
5470: 72 65 76 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76  rev ID.**.** Mov
5480: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
5490: 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
54a0: 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
54b0: 20 20 52 65 74 75 72 6e 20 30 20 6f 6e 0a 2a 2a    Return 0 on.**
54c0: 20 73 75 63 63 65 73 73 20 61 6e 64 20 31 20 69   success and 1 i
54d0: 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  f the cursor was
54e0: 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20   already on the 
54f0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 0a 2a  first entry in.*
5500: 2a 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  * the table or i
5510: 66 20 74 68 65 20 74 61 62 6c 65 20 77 61 73 20  f the table was 
5520: 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  empty..*/.static
5530: 20 69 6e 74 20 62 74 72 65 65 5f 70 72 65 76 28   int btree_prev(
5540: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
5550: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5560: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
5570: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
5580: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
5590: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
55a0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
55b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
55c0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
55d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
55e0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
55f0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5600: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ent */.){.  BtCu
5610: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
5620: 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65 73 20  t rc;.  int res 
5630: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
5640: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  [100];..  if( ar
5650: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
5660: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5670: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
5680: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
5690: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
56a0: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
56b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
56c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75  ERROR;.  }.  pCu
56d0: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  r = sqlite3TextT
56e0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
56f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5700: 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
5710: 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
5720: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5730: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5740: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
5750: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5760: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5770: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
5780: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42  (sizeof(zBuf),zB
5790: 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20  uf,"%d",res);.  
57a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
57b0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
57c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
57d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
57e0: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 66  Usage:   btree_f
57f0: 69 72 73 74 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f  irst ID.**.** Mo
5800: 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
5810: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
5820: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
5830: 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 0a  Return 0 if the.
5840: 2a 2a 20 63 75 72 73 6f 72 20 77 61 73 20 6c 65  ** cursor was le
5850: 66 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ft point to some
5860: 74 68 69 6e 67 20 61 6e 64 20 31 20 69 66 20 74  thing and 1 if t
5870: 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
5880: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
5890: 20 62 74 72 65 65 5f 66 69 72 73 74 28 0a 20 20   btree_first(.  
58a0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
58b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
58c0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
58d0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
58e0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
58f0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
5900: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5910: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5920: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
5940: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
5950: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5960: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
5970: 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
5980: 63 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  c;.  int res = 0
5990: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
59a0: 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
59b0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
59c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
59d0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
59e0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
59f0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
5a00: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
5a10: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5a20: 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d  OR;.  }.  pCur =
5a30: 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74   sqlite3TextToPt
5a40: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63  r(argv[1]);.  rc
5a50: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
5a60: 69 72 73 74 28 70 43 75 72 2c 20 26 72 65 73 29  irst(pCur, &res)
5a70: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
5a80: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5a90: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
5aa0: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
5ab0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5ac0: 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
5ad0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
5ae0: 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 64  f(zBuf),zBuf,"%d
5af0: 22 2c 72 65 73 29 3b 0a 20 20 54 63 6c 5f 41 70  ",res);.  Tcl_Ap
5b00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5b10: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
5b20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
5b40: 20 20 20 62 74 72 65 65 5f 6c 61 73 74 20 49 44     btree_last ID
5b50: 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  .**.** Move the 
5b60: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
5b70: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5b80: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 30  table.  Return 0
5b90: 20 69 66 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f   if the.** curso
5ba0: 72 20 77 61 73 20 6c 65 66 74 20 70 6f 69 6e 74  r was left point
5bb0: 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 61 6e   to something an
5bc0: 64 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  d 1 if the table
5bd0: 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74   is empty..*/.st
5be0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 6c  atic int btree_l
5bf0: 61 73 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ast(.  void *Not
5c00: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
5c10: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
5c20: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
5c30: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
5c40: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
5c50: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5c70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
5c80: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
5c90: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
5ca0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
5cb0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
5cc0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
5cd0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
5ce0: 72 65 73 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  res = 0;.  char 
5cf0: 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
5d00: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
5d10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
5d20: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
5d30: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
5d40: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
5d50: 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c  .       " ID\"",
5d60: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5d70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5d80: 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 54   pCur = sqlite3T
5d90: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
5da0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
5db0: 33 42 74 72 65 65 4c 61 73 74 28 70 43 75 72 2c  3BtreeLast(pCur,
5dc0: 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
5dd0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5de0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5df0: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
5e00: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5e10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5e20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
5e30: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42  (sizeof(zBuf),zB
5e40: 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20  uf,"%d",res);.  
5e50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5e60: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
5e70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5e80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5e90: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 65  Usage:   btree_e
5ea0: 6f 66 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75  of ID.**.** Retu
5eb0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
5ec0: 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73 20 6e  iven cursor is n
5ed0: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
5ee0: 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 0a 2a 2a   valid entry..**
5ef0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
5f00: 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 65 73   the cursor does
5f10: 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69   point to a vali
5f20: 64 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  d entry..*/.stat
5f30: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 65 6f 66  ic int btree_eof
5f40: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
5f50: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
5f60: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
5f70: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
5f80: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
5f90: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
5fa0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
5fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5fc0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5fd0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5fe0: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
5ff0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
6000: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
6010: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 63  ursor *pCur;.  c
6020: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20  har zBuf[50];.. 
6030: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
6040: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
6050: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
6060: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
6070: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
6080: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
6090: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
60a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
60b0: 7d 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  }.  pCur = sqlit
60c0: 65 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  e3TextToPtr(argv
60d0: 5b 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [1]);.  sqlite3_
60e0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
60f0: 7a 42 75 66 29 2c 7a 42 75 66 2c 20 22 25 64 22  zBuf),zBuf, "%d"
6100: 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  , sqlite3BtreeEo
6110: 66 28 70 43 75 72 29 29 3b 0a 20 20 54 63 6c 5f  f(pCur));.  Tcl_
6120: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6130: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
6140: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6150: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
6160: 65 3a 20 20 20 62 74 72 65 65 5f 6b 65 79 73 69  e:   btree_keysi
6170: 7a 65 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ze ID.**.** Retu
6180: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
6190: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 2e 20 20   bytes of key.  
61a0: 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
61b0: 62 6c 65 2c 20 74 68 69 73 0a 2a 2a 20 72 65 74  ble, this.** ret
61c0: 75 72 6e 73 20 74 68 65 20 6b 65 79 20 69 74 73  urns the key its
61d0: 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  elf..*/.static i
61e0: 6e 74 20 62 74 72 65 65 5f 6b 65 79 73 69 7a 65  nt btree_keysize
61f0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
6200: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
6210: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
6220: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
6230: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
6240: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
6250: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
6260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6270: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
6280: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6290: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
62a0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
62b0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
62c0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 75  ursor *pCur;.  u
62d0: 36 34 20 6e 3b 0a 20 20 63 68 61 72 20 7a 42 75  64 n;.  char zBu
62e0: 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[50];..  if( ar
62f0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
6300: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6310: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
6320: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
6330: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
6340: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
6350: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6360: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75  ERROR;.  }.  pCu
6370: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54  r = sqlite3TextT
6380: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
6390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
63a0: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 29 3b 0a  Size(pCur, &n);.
63b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
63c0: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
63d0: 7a 42 75 66 2c 20 22 25 6c 6c 75 22 2c 20 6e 29  zBuf, "%llu", n)
63e0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
63f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
6400: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
6410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6420: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
6430: 65 65 5f 6b 65 79 20 49 44 0a 2a 2a 0a 2a 2a 20  ee_key ID.**.** 
6440: 52 65 74 75 72 6e 20 74 68 65 20 6b 65 79 20 66  Return the key f
6450: 6f 72 20 74 68 65 20 65 6e 74 72 79 20 61 74 20  or the entry at 
6460: 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
6470: 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f   is pointing..*/
6480: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6490: 65 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  e_key(.  void *N
64a0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
64b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
64c0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
64d0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
64e0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
64f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6510: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
6520: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
6530: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6540: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
6550: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
6560: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6570: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 36  ;.  int rc;.  u6
6580: 34 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75  4 n;.  char *zBu
6590: 66 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  f;..  if( argc!=
65a0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
65b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
65c0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
65d0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
65e0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
65f0: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
6600: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6610: 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20  R;.  }.  pCur = 
6620: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
6630: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c  (argv[1]);.  sql
6640: 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
6650: 28 70 43 75 72 2c 20 26 6e 29 3b 0a 20 20 69 66  (pCur, &n);.  if
6660: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c  ( sqlite3BtreeFl
6670: 61 67 73 28 70 43 75 72 29 20 26 20 42 54 52 45  ags(pCur) & BTRE
6680: 45 5f 49 4e 54 4b 45 59 20 29 7b 0a 20 20 20 20  E_INTKEY ){.    
6690: 63 68 61 72 20 7a 42 75 66 32 5b 36 30 5d 3b 0a  char zBuf2[60];.
66a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
66b0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
66c0: 29 2c 7a 42 75 66 32 2c 20 22 25 6c 6c 75 22 2c  ),zBuf2, "%llu",
66d0: 20 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70   n);.    Tcl_App
66e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
66f0: 2c 20 7a 42 75 66 32 2c 20 30 29 3b 0a 20 20 7d  , zBuf2, 0);.  }
6700: 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75 66 20 3d  else{.    zBuf =
6710: 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a   malloc( n+1 );.
6720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6730: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
6740: 2c 20 6e 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  , n, zBuf);.    
6750: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
6760: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6770: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
6780: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
6790: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
67a0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42  OR;.    }.    zB
67b0: 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 54  uf[n] = 0;.    T
67c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
67d0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
67e0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 42 75 66 29  ;.    free(zBuf)
67f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
6800: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6810: 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65  ** Usage:   btre
6820: 65 5f 64 61 74 61 20 49 44 0a 2a 2a 0a 2a 2a 20  e_data ID.**.** 
6830: 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
6840: 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 61 74  for the entry at
6850: 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
6860: 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  r is pointing..*
6870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6880: 65 65 5f 64 61 74 61 28 0a 20 20 76 6f 69 64 20  ee_data(.  void 
6890: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
68a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
68b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
68c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
68d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
68e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
68f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
6900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
6910: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
6920: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
6930: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
6940: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
6950: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
6960: 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ur;.  int rc;.  
6970: 75 33 32 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a  u32 n;.  char *z
6980: 42 75 66 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  Buf;..  if( argc
6990: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
69a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
69b0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
69c0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
69d0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
69e0: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
69f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6a00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20  ROR;.  }.  pCur 
6a10: 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  = sqlite3TextToP
6a20: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73  tr(argv[1]);.  s
6a30: 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
6a40: 69 7a 65 28 70 43 75 72 2c 20 26 6e 29 3b 0a 20  ize(pCur, &n);. 
6a50: 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 20   zBuf = malloc( 
6a60: 6e 2b 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  n+1 );.  rc = sq
6a70: 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 70  lite3BtreeData(p
6a80: 43 75 72 2c 20 30 2c 20 6e 2c 20 7a 42 75 66 29  Cur, 0, n, zBuf)
6a90: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
6aa0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6ab0: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
6ac0: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
6ad0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6ae0: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6e  OR;.  }.  zBuf[n
6af0: 5d 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 41 70 70  ] = 0;.  Tcl_App
6b00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6b10: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 66 72  , zBuf, 0);.  fr
6b20: 65 65 28 7a 42 75 66 29 3b 0a 20 20 72 65 74 75  ee(zBuf);.  retu
6b30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b40: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
6b50: 62 74 72 65 65 5f 66 65 74 63 68 5f 6b 65 79 20  btree_fetch_key 
6b60: 49 44 20 41 4d 54 0a 2a 2a 0a 2a 2a 20 55 73 65  ID AMT.**.** Use
6b70: 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
6b80: 65 4b 65 79 46 65 74 63 68 28 29 20 72 6f 75 74  eKeyFetch() rout
6b90: 69 6e 65 20 74 6f 20 67 65 74 20 41 4d 54 20 62  ine to get AMT b
6ba0: 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 2e  ytes of the key.
6bb0: 0a 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74  .** If sqlite3Bt
6bc0: 72 65 65 4b 65 79 46 65 74 63 68 28 29 20 66 61  reeKeyFetch() fa
6bd0: 69 6c 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ils, return an e
6be0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
6bf0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6c00: 5f 66 65 74 63 68 5f 6b 65 79 28 0a 20 20 76 6f  _fetch_key(.  vo
6c10: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
6c20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6c30: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
6c40: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
6c50: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
6c60: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
6c70: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
6c80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6c90: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
6ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
6cb0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
6cc0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
6cd0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
6ce0: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 6e 3b 0a  *pCur;.  int n;.
6cf0: 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 75 36 34    int amt;.  u64
6d00: 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e 73 74 20 63   nKey;.  const c
6d10: 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 63 68 61  har *zBuf;.  cha
6d20: 72 20 7a 53 74 61 74 69 63 5b 31 30 30 30 5d 3b  r zStatic[1000];
6d30: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ..  if( argc!=3 
6d40: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
6d50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6d60: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
6d70: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
6d80: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
6d90: 49 44 20 41 4d 54 5c 22 22 2c 20 30 29 3b 0a 20  ID AMT\"", 0);. 
6da0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6db0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20  ROR;.  }.  pCur 
6dc0: 3d 20 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50  = sqlite3TextToP
6dd0: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  tr(argv[1]);.  i
6de0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
6df0: 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
6e00: 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  n) ) return TCL_
6e10: 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
6e20: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
6e30: 72 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 7a 42 75  r, &nKey);.  zBu
6e40: 66 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  f = sqlite3Btree
6e50: 4b 65 79 46 65 74 63 68 28 70 43 75 72 2c 20 26  KeyFetch(pCur, &
6e60: 61 6d 74 29 3b 0a 20 20 69 66 28 20 7a 42 75 66  amt);.  if( zBuf
6e70: 20 26 26 20 61 6d 74 3e 3d 6e 20 29 7b 0a 20 20   && amt>=n ){.  
6e80: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 73    assert( nKey<s
6e90: 69 7a 65 6f 66 28 7a 53 74 61 74 69 63 29 20 29  izeof(zStatic) )
6ea0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29 20  ;.    if( n>0 ) 
6eb0: 6e 4b 65 79 20 3d 20 6e 3b 0a 20 20 20 20 6d 65  nKey = n;.    me
6ec0: 6d 63 70 79 28 7a 53 74 61 74 69 63 2c 20 7a 42  mcpy(zStatic, zB
6ed0: 75 66 2c 20 28 69 6e 74 29 6e 4b 65 79 29 3b 20  uf, (int)nKey); 
6ee0: 0a 20 20 20 20 7a 53 74 61 74 69 63 5b 6e 4b 65  .    zStatic[nKe
6ef0: 79 5d 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f  y] = 0;.    Tcl_
6f00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6f10: 65 72 70 2c 20 7a 53 74 61 74 69 63 2c 20 30 29  erp, zStatic, 0)
6f20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
6f30: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
6f40: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 66  Usage:   btree_f
6f50: 65 74 63 68 5f 64 61 74 61 20 49 44 20 41 4d 54  etch_data ID AMT
6f60: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
6f70: 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
6f80: 65 74 63 68 28 29 20 72 6f 75 74 69 6e 65 20 74  etch() routine t
6f90: 6f 20 67 65 74 20 41 4d 54 20 62 79 74 65 73 20  o get AMT bytes 
6fa0: 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 20 49  of the key..** I
6fb0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  f sqlite3BtreeDa
6fc0: 74 61 46 65 74 63 68 28 29 20 66 61 69 6c 73 2c  taFetch() fails,
6fd0: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
6fe0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
6ff0: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 66 65 74  ic int btree_fet
7000: 63 68 5f 64 61 74 61 28 0a 20 20 76 6f 69 64 20  ch_data(.  void 
7010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
7020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
7040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
7050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
7060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
7070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
70a0: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
70b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
70c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
70d0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
70e0: 75 72 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  ur;.  int n;.  i
70f0: 6e 74 20 61 6d 74 3b 0a 20 20 75 33 32 20 6e 44  nt amt;.  u32 nD
7100: 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ata;.  const cha
7110: 72 20 2a 7a 42 75 66 3b 0a 20 20 63 68 61 72 20  r *zBuf;.  char 
7120: 7a 53 74 61 74 69 63 5b 31 30 30 30 5d 3b 0a 0a  zStatic[1000];..
7130: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
7140: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7150: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
7160: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
7170: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7180: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44  [0],.       " ID
7190: 20 41 4d 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20   AMT\"", 0);.   
71a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
71b0: 52 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20  R;.  }.  pCur = 
71c0: 73 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72  sqlite3TextToPtr
71d0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
71e0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
71f0: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6e 29  rp, argv[2], &n)
7200: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7210: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ROR;.  sqlite3Bt
7220: 72 65 65 44 61 74 61 53 69 7a 65 28 70 43 75 72  reeDataSize(pCur
7230: 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 7a 42 75  , &nData);.  zBu
7240: 66 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  f = sqlite3Btree
7250: 44 61 74 61 46 65 74 63 68 28 70 43 75 72 2c 20  DataFetch(pCur, 
7260: 26 61 6d 74 29 3b 0a 20 20 69 66 28 20 7a 42 75  &amt);.  if( zBu
7270: 66 20 26 26 20 61 6d 74 3e 3d 6e 20 29 7b 0a 20  f && amt>=n ){. 
7280: 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61     assert( nData
7290: 3c 73 69 7a 65 6f 66 28 7a 53 74 61 74 69 63 29  <sizeof(zStatic)
72a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20   );.    if( n>0 
72b0: 29 20 6e 44 61 74 61 20 3d 20 6e 3b 0a 20 20 20  ) nData = n;.   
72c0: 20 6d 65 6d 63 70 79 28 7a 53 74 61 74 69 63 2c   memcpy(zStatic,
72d0: 20 7a 42 75 66 2c 20 28 69 6e 74 29 6e 44 61 74   zBuf, (int)nDat
72e0: 61 29 3b 20 0a 20 20 20 20 7a 53 74 61 74 69 63  a); .    zStatic
72f0: 5b 6e 44 61 74 61 5d 20 3d 20 30 3b 0a 20 20 20  [nData] = 0;.   
7300: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7310: 74 28 69 6e 74 65 72 70 2c 20 7a 53 74 61 74 69  t(interp, zStati
7320: 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  c, 0);.  }.  ret
7330: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
7340: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
7350: 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 69 7a 65  ree_payload_size
7360: 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   ID.**.** Return
7370: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7380: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 0a  ytes of payload.
7390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
73a0: 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 69 7a 65  ree_payload_size
73b0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
73c0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
73d0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
73e0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
73f0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7400: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7410: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
7420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7430: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7440: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7450: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
7460: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
7470: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
7480: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
7490: 6e 74 20 6e 32 3b 0a 20 20 75 36 34 20 6e 31 3b  nt n2;.  u64 n1;
74a0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
74b0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
74c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
74d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
74e0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
74f0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
7500: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
7510: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
7520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7530: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 20 3d 20 73  ;.  }.  pCur = s
7540: 71 6c 69 74 65 33 54 65 78 74 54 6f 50 74 72 28  qlite3TextToPtr(
7550: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  argv[1]);.  if( 
7560: 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67  sqlite3BtreeFlag
7570: 73 28 70 43 75 72 29 20 26 20 42 54 52 45 45 5f  s(pCur) & BTREE_
7580: 49 4e 54 4b 45 59 20 29 7b 0a 20 20 20 20 6e 31  INTKEY ){.    n1
7590: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
75a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b     sqlite3BtreeK
75b0: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 31  eySize(pCur, &n1
75c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
75d0: 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
75e0: 75 72 2c 20 26 6e 32 29 3b 0a 20 20 73 71 6c 69  ur, &n2);.  sqli
75f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
7600: 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 20  eof(zBuf),zBuf, 
7610: 22 25 64 22 2c 20 28 69 6e 74 29 28 6e 31 2b 6e  "%d", (int)(n1+n
7620: 32 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2));.  Tcl_Appen
7630: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7640: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
7650: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7660: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
7670: 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 69 6e 66  btree_cursor_inf
7680: 6f 20 49 44 20 3f 55 50 2d 43 4e 54 3f 0a 2a 2a  o ID ?UP-CNT?.**
7690: 0a 2a 2a 20 52 65 74 75 72 6e 20 69 6e 74 65 67  .** Return integ
76a0: 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69  ers containing i
76b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
76c0: 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
76d0: 2a 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  * cursor is poin
76e0: 74 69 6e 67 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ting to:.**.**  
76f0: 20 61 52 65 73 75 6c 74 5b 30 5d 20 3d 20 20 54   aResult[0] =  T
7700: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a  he page number.*
7710: 2a 20 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d  *   aResult[1] =
7720: 20 20 54 68 65 20 65 6e 74 72 79 20 6e 75 6d 62    The entry numb
7730: 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  er.**   aResult[
7740: 32 5d 20 3d 20 20 54 6f 74 61 6c 20 6e 75 6d 62  2] =  Total numb
7750: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
7760: 20 74 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20   this page.**   
7770: 61 52 65 73 75 6c 74 5b 33 5d 20 3d 20 20 43 65  aResult[3] =  Ce
7780: 6c 6c 20 73 69 7a 65 20 28 6c 6f 63 61 6c 20 70  ll size (local p
7790: 61 79 6c 6f 61 64 20 2b 20 68 65 61 64 65 72 29  ayload + header)
77a0: 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 34 5d  .**   aResult[4]
77b0: 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   =  Number of fr
77c0: 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68 69 73  ee bytes on this
77d0: 20 70 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75   page.**   aResu
77e0: 6c 74 5b 35 5d 20 3d 20 20 4e 75 6d 62 65 72 20  lt[5] =  Number 
77f0: 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f  of free blocks o
7800: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20  n the page.**   
7810: 61 52 65 73 75 6c 74 5b 36 5d 20 3d 20 20 54 6f  aResult[6] =  To
7820: 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  tal payload size
7830: 20 28 6c 6f 63 61 6c 20 2b 20 6f 76 65 72 66 6c   (local + overfl
7840: 6f 77 29 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  ow).**   aResult
7850: 5b 37 5d 20 3d 20 20 48 65 61 64 65 72 20 73 69  [7] =  Header si
7860: 7a 65 20 69 6e 20 62 79 74 65 73 0a 2a 2a 20 20  ze in bytes.**  
7870: 20 61 52 65 73 75 6c 74 5b 38 5d 20 3d 20 20 4c   aResult[8] =  L
7880: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  ocal payload siz
7890: 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 39  e.**   aResult[9
78a0: 5d 20 3d 20 20 50 61 72 65 6e 74 20 70 61 67 65  ] =  Parent page
78b0: 20 6e 75 6d 62 65 72 0a 2a 2f 0a 73 74 61 74 69   number.*/.stati
78c0: 63 20 69 6e 74 20 62 74 72 65 65 5f 63 75 72 73  c int btree_curs
78d0: 6f 72 5f 69 6e 66 6f 28 0a 20 20 76 6f 69 64 20  or_info(.  void 
78e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
78f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7900: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
7910: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
7920: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
7930: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
7940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7950: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7960: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
7970: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
7980: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
7990: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
79a0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
79b0: 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ur;.  int rc;.  
79c0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
79d0: 75 70 3b 0a 20 20 69 6e 74 20 61 52 65 73 75 6c  up;.  int aResul
79e0: 74 5b 31 30 5d 3b 0a 20 20 63 68 61 72 20 7a 42  t[10];.  char zB
79f0: 75 66 5b 34 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[400];..  if( 
7a00: 61 72 67 63 21 3d 32 20 26 26 20 61 72 67 63 21  argc!=2 && argc!
7a10: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
7a20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7a30: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7a40: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7a50: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7a60: 20 22 20 49 44 20 3f 55 50 2d 43 4e 54 3f 5c 22   " ID ?UP-CNT?\"
7a70: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
7a80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7a90: 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
7aa0: 33 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b  3TextToPtr(argv[
7ab0: 31 5d 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  1]);.  if( argc=
7ac0: 3d 33 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =3 ){.    if( Tc
7ad0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
7ae0: 20 61 72 67 76 5b 32 5d 2c 20 26 75 70 29 20 29   argv[2], &up) )
7af0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7b00: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
7b10: 75 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  up = 0;.  }.  rc
7b20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
7b30: 75 72 73 6f 72 49 6e 66 6f 28 70 43 75 72 2c 20  ursorInfo(pCur, 
7b40: 61 52 65 73 75 6c 74 2c 20 75 70 29 3b 0a 20 20  aResult, up);.  
7b50: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
7b60: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7b70: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
7b80: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
7b90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7ba0: 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66    }.  j = 0;.  f
7bb0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7bc0: 28 61 52 65 73 75 6c 74 29 2f 73 69 7a 65 6f 66  (aResult)/sizeof
7bd0: 28 61 52 65 73 75 6c 74 5b 30 5d 29 3b 20 69 2b  (aResult[0]); i+
7be0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
7bf0: 73 6e 70 72 69 6e 74 66 28 34 30 2c 26 7a 42 75  snprintf(40,&zBu
7c00: 66 5b 6a 5d 2c 22 20 25 64 22 2c 20 61 52 65 73  f[j]," %d", aRes
7c10: 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 6a 20 2b  ult[i]);.    j +
7c20: 3d 20 73 74 72 6c 65 6e 28 26 7a 42 75 66 5b 6a  = strlen(&zBuf[j
7c30: 5d 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  ]);.  }.  Tcl_Ap
7c40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7c50: 70 2c 20 26 7a 42 75 66 5b 31 5d 2c 20 30 29 3b  p, &zBuf[1], 0);
7c60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7c70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
7c80: 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 70 72 6f  e command is pro
7c90: 76 69 64 65 64 20 66 6f 72 20 74 68 65 20 70 75  vided for the pu
7ca0: 72 70 6f 73 65 20 6f 66 20 73 65 74 74 69 6e 67  rpose of setting
7cb0: 20 62 72 65 61 6b 70 6f 69 6e 74 73 2e 0a 2a 2a   breakpoints..**
7cc0: 20 69 6e 20 72 65 67 72 65 73 73 69 6f 6e 20 74   in regression t
7cd0: 65 73 74 20 73 63 72 69 70 74 73 2e 0a 2a 2a 0a  est scripts..**.
7ce0: 2a 2a 20 42 79 20 73 65 74 74 69 6e 67 20 61 20  ** By setting a 
7cf0: 47 44 42 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  GDB breakpoint o
7d00: 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  n this procedure
7d10: 20 61 6e 64 20 65 78 65 63 75 74 69 6e 67 20 74   and executing t
7d20: 68 65 0a 2a 2a 20 62 74 72 65 65 5f 62 72 65 61  he.** btree_brea
7d30: 6b 70 6f 69 6e 74 20 63 6f 6d 6d 61 6e 64 20 69  kpoint command i
7d40: 6e 20 61 20 74 65 73 74 20 73 63 72 69 70 74 2c  n a test script,
7d50: 20 77 65 20 63 61 6e 20 73 74 6f 70 20 47 44 42   we can stop GDB
7d60: 20 61 74 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74   at.** the point
7d70: 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 20 77   in the script w
7d80: 68 65 72 65 20 74 68 65 20 62 74 72 65 65 5f 62  here the btree_b
7d90: 72 65 61 6b 70 6f 69 6e 74 20 63 6f 6d 6d 61 6e  reakpoint comman
7da0: 64 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64  d is.** inserted
7db0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
7dc0: 6c 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  l for debugging.
7dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
7de0: 74 72 65 65 5f 62 72 65 61 6b 70 6f 69 6e 74 28  tree_breakpoint(
7df0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
7e00: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
7e10: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
7e20: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
7e30: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
7e40: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
7e50: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
7e60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7e70: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
7e80: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7e90: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
7ea0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
7eb0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  ent */.){.  retu
7ec0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
7ed0: 0a 2a 2a 20 75 73 61 67 65 3a 20 20 20 76 61 72  .** usage:   var
7ee0: 69 6e 74 5f 74 65 73 74 20 20 53 54 41 52 54 20  int_test  START 
7ef0: 20 4d 55 4c 54 49 50 4c 49 45 52 20 20 43 4f 55   MULTIPLIER  COU
7f00: 4e 54 20 20 49 4e 43 52 45 4d 45 4e 54 0a 2a 2a  NT  INCREMENT.**
7f10: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
7f20: 20 74 65 73 74 73 20 74 68 65 20 73 71 6c 69 74   tests the sqlit
7f30: 65 33 50 75 74 56 61 72 69 6e 74 28 29 20 61 6e  e3PutVarint() an
7f40: 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
7f50: 6e 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  nt().** routines
7f60: 2c 20 62 6f 74 68 20 66 6f 72 20 61 63 63 75 72  , both for accur
7f70: 61 63 79 20 61 6e 64 20 66 6f 72 20 73 70 65 65  acy and for spee
7f80: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  d..**.** An inte
7f90: 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 75  ger is written u
7fa0: 73 69 6e 67 20 50 75 74 56 61 72 69 6e 74 28 29  sing PutVarint()
7fb0: 20 61 6e 64 20 72 65 61 64 20 62 61 63 6b 20 77   and read back w
7fc0: 69 74 68 0a 2a 2a 20 47 65 74 56 61 72 69 6e 74  ith.** GetVarint
7fd0: 28 29 20 61 6e 64 20 76 61 72 69 66 69 65 64 20  () and varified 
7fe0: 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  to be unchanged.
7ff0: 20 20 54 68 69 73 20 72 65 70 65 61 74 73 20 43    This repeats C
8000: 4f 55 4e 54 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  OUNT.** times.  
8010: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
8020: 72 20 69 73 20 53 54 41 52 54 2a 4d 55 4c 54 49  r is START*MULTI
8030: 50 4c 49 45 52 2e 20 20 45 61 63 68 20 69 74 65  PLIER.  Each ite
8040: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 72 65 61  ration.** increa
8050: 73 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  ses the integer 
8060: 62 79 20 49 4e 43 52 45 4d 45 4e 54 2e 0a 2a 2a  by INCREMENT..**
8070: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
8080: 20 72 65 74 75 72 6e 73 20 6e 6f 74 68 69 6e 67   returns nothing
8090: 20 69 66 20 69 74 20 77 6f 72 6b 73 2e 20 20 49   if it works.  I
80a0: 74 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  t returns an err
80b0: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 66  or message.** if
80c0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
80d0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
80e0: 20 69 6e 74 20 62 74 72 65 65 5f 76 61 72 69 6e   int btree_varin
80f0: 74 5f 74 65 73 74 28 0a 20 20 76 6f 69 64 20 2a  t_test(.  void *
8100: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8110: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8120: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8130: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8140: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
8150: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
8160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8180: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
8190: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
81a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
81b0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
81c0: 0a 20 20 75 33 32 20 73 74 61 72 74 2c 20 6d 75  .  u32 start, mu
81d0: 6c 74 2c 20 63 6f 75 6e 74 2c 20 69 6e 63 72 3b  lt, count, incr;
81e0: 0a 20 20 75 36 34 20 69 6e 2c 20 6f 75 74 3b 0a  .  u64 in, out;.
81f0: 20 20 69 6e 74 20 6e 31 2c 20 6e 32 2c 20 69 2c    int n1, n2, i,
8200: 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   j;.  unsigned c
8210: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
8220: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
8230: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8240: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
8250: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
8260: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
8270: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 53 54 41  0],.       " STA
8280: 52 54 20 4d 55 4c 54 49 50 4c 49 45 52 20 43 4f  RT MULTIPLIER CO
8290: 55 4e 54 20 49 4e 43 52 45 4d 45 4e 54 5c 22 22  UNT INCREMENT\""
82a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
82b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
82c0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
82d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
82e0: 2c 20 28 69 6e 74 2a 29 26 73 74 61 72 74 29 20  , (int*)&start) 
82f0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8300: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
8310: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
8320: 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 6d 75 6c  v[2], (int*)&mul
8330: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
8340: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
8350: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
8360: 61 72 67 76 5b 33 5d 2c 20 28 69 6e 74 2a 29 26  argv[3], (int*)&
8370: 63 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20  count) ) return 
8380: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
8390: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
83a0: 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 28 69 6e  rp, argv[4], (in
83b0: 74 2a 29 26 69 6e 63 72 29 20 29 20 72 65 74 75  t*)&incr) ) retu
83c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
83d0: 69 6e 20 3d 20 73 74 61 72 74 3b 0a 20 20 69 6e  in = start;.  in
83e0: 20 2a 3d 20 6d 75 6c 74 3b 0a 20 20 66 6f 72 28   *= mult;.  for(
83f0: 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 3b 20 69 2b  i=0; i<count; i+
8400: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 45 72  +){.    char zEr
8410: 72 5b 32 30 30 5d 3b 0a 20 20 20 20 6e 31 20 3d  r[200];.    n1 =
8420: 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e   sqlite3PutVarin
8430: 74 28 7a 42 75 66 2c 20 69 6e 29 3b 0a 20 20 20  t(zBuf, in);.   
8440: 20 69 66 28 20 6e 31 3e 39 20 7c 7c 20 6e 31 3c   if( n1>9 || n1<
8450: 31 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  1 ){.      sprin
8460: 74 66 28 7a 45 72 72 2c 20 22 50 75 74 56 61 72  tf(zErr, "PutVar
8470: 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64 20  int returned %d 
8480: 2d 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77  - should be betw
8490: 65 65 6e 20 31 20 61 6e 64 20 39 22 2c 20 6e 31  een 1 and 9", n1
84a0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
84b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
84c0: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
84d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
84e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 32  OR;.    }.    n2
84f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72   = sqlite3GetVar
8500: 69 6e 74 28 7a 42 75 66 2c 20 26 6f 75 74 29 3b  int(zBuf, &out);
8510: 0a 20 20 20 20 69 66 28 20 6e 31 21 3d 6e 32 20  .    if( n1!=n2 
8520: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
8530: 28 7a 45 72 72 2c 20 22 50 75 74 56 61 72 69 6e  (zErr, "PutVarin
8540: 74 20 72 65 74 75 72 6e 65 64 20 25 64 20 61 6e  t returned %d an
8550: 64 20 47 65 74 56 61 72 69 6e 74 20 72 65 74 75  d GetVarint retu
8560: 72 6e 65 64 20 25 64 22 2c 20 6e 31 2c 20 6e 32  rned %d", n1, n2
8570: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  );.      Tcl_App
8580: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8590: 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20  , zErr, 0);.    
85a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
85b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
85c0: 28 20 69 6e 21 3d 6f 75 74 20 29 7b 0a 20 20 20  ( in!=out ){.   
85d0: 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c     sprintf(zErr,
85e0: 20 22 57 72 6f 74 65 20 30 78 25 30 31 36 6c 6c   "Wrote 0x%016ll
85f0: 78 20 61 6e 64 20 67 6f 74 20 62 61 63 6b 20 30  x and got back 0
8600: 78 25 30 31 36 6c 6c 78 22 2c 20 69 6e 2c 20 6f  x%016llx", in, o
8610: 75 74 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ut);.      Tcl_A
8620: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8630: 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20  rp, zErr, 0);.  
8640: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8650: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8660: 69 66 28 20 28 69 6e 20 26 20 30 78 66 66 66 66  if( (in & 0xffff
8670: 66 66 66 66 29 3d 3d 69 6e 20 29 7b 0a 20 20 20  ffff)==in ){.   
8680: 20 20 20 75 33 32 20 6f 75 74 33 32 3b 0a 20 20     u32 out32;.  
8690: 20 20 20 20 6e 32 20 3d 20 73 71 6c 69 74 65 33      n2 = sqlite3
86a0: 47 65 74 56 61 72 69 6e 74 33 32 28 7a 42 75 66  GetVarint32(zBuf
86b0: 2c 20 26 6f 75 74 33 32 29 3b 0a 20 20 20 20 20  , &out32);.     
86c0: 20 6f 75 74 20 3d 20 6f 75 74 33 32 3b 0a 20 20   out = out32;.  
86d0: 20 20 20 20 69 66 28 20 6e 31 21 3d 6e 32 20 29      if( n1!=n2 )
86e0: 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74  {.        sprint
86f0: 66 28 7a 45 72 72 2c 20 22 50 75 74 56 61 72 69  f(zErr, "PutVari
8700: 6e 74 20 72 65 74 75 72 6e 65 64 20 25 64 20 61  nt returned %d a
8710: 6e 64 20 47 65 74 56 61 72 69 6e 74 33 32 20 72  nd GetVarint32 r
8720: 65 74 75 72 6e 65 64 20 25 64 22 2c 20 0a 20 20  eturned %d", .  
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 6e 31 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20 20  n1, n2);.       
8750: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8760: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20  t(interp, zErr, 
8770: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
8780: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8790: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
87a0: 69 6e 21 3d 6f 75 74 20 29 7b 0a 20 20 20 20 20  in!=out ){.     
87b0: 20 20 20 73 70 72 69 6e 74 66 28 7a 45 72 72 2c     sprintf(zErr,
87c0: 20 22 57 72 6f 74 65 20 30 78 25 30 31 36 6c 6c   "Wrote 0x%016ll
87d0: 78 20 61 6e 64 20 67 6f 74 20 62 61 63 6b 20 30  x and got back 0
87e0: 78 25 30 31 36 6c 6c 78 20 66 72 6f 6d 20 47 65  x%016llx from Ge
87f0: 74 56 61 72 69 6e 74 33 32 22 2c 0a 20 20 20 20  tVarint32",.    
8800: 20 20 20 20 20 20 20 20 69 6e 2c 20 6f 75 74 29          in, out)
8810: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70  ;.        Tcl_Ap
8820: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8830: 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20  p, zErr, 0);.   
8840: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8850: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
8860: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 20     }..    /* In 
8870: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 72 65 61  order to get rea
8880: 6c 69 73 74 69 63 20 74 69 6d 69 6e 67 73 2c 20  listic timings, 
8890: 72 75 6e 20 67 65 74 56 61 72 69 6e 74 20 31 39  run getVarint 19
88a0: 20 6d 6f 72 65 20 74 69 6d 65 73 2e 0a 20 20 20   more times..   
88b0: 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
88c0: 75 73 65 20 67 65 74 56 61 72 69 6e 74 20 69 73  use getVarint is
88d0: 20 63 61 6c 6c 65 64 20 61 62 6f 75 74 20 32 30   called about 20
88e0: 20 74 69 6d 65 73 20 6d 6f 72 65 20 6f 66 74 65   times more ofte
88f0: 6e 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 75  n.    ** than pu
8900: 74 56 61 72 69 6e 74 2e 0a 20 20 20 20 2a 2f 0a  tVarint..    */.
8910: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31      for(j=0; j<1
8920: 39 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  9; j++){.      s
8930: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
8940: 7a 42 75 66 2c 20 26 6f 75 74 29 3b 0a 20 20 20  zBuf, &out);.   
8950: 20 7d 0a 20 20 20 20 69 6e 20 2b 3d 20 69 6e 63   }.    in += inc
8960: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
8970: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8980: 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e   Register comman
8990: 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ds with the TCL 
89a0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
89b0: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 33 5f  int Sqlitetest3_
89c0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
89d0: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65  *interp){.  exte
89e0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  rn int sqlite3_b
89f0: 74 72 65 65 5f 74 72 61 63 65 3b 0a 20 20 73 74  tree_trace;.  st
8a00: 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
8a10: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
8a20: 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63       Tcl_CmdProc
8a30: 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d   *xProc;.  } aCm
8a40: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
8a50: 62 74 72 65 65 5f 6f 70 65 6e 22 2c 20 20 20 20  btree_open",    
8a60: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
8a70: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6f  CmdProc*)btree_o
8a80: 70 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  pen             
8a90: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
8aa0: 65 65 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20  ee_close",      
8ab0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
8ac0: 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 6c 6f 73  Proc*)btree_clos
8ad0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  e              }
8ae0: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
8af0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8b00: 6e 22 2c 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f  n",  (Tcl_CmdPro
8b10: 63 2a 29 62 74 72 65 65 5f 62 65 67 69 6e 5f 74  c*)btree_begin_t
8b20: 72 61 6e 73 61 63 74 69 6f 6e 20 20 7d 2c 0a 20  ransaction  },. 
8b30: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63 6f 6d      { "btree_com
8b40: 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  mit",           
8b50: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
8b60: 62 74 72 65 65 5f 63 6f 6d 6d 69 74 20 20 20 20  btree_commit    
8b70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8b80: 20 7b 20 22 62 74 72 65 65 5f 72 6f 6c 6c 62 61   { "btree_rollba
8b90: 63 6b 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  ck",           (
8ba0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
8bb0: 65 65 5f 72 6f 6c 6c 62 61 63 6b 20 20 20 20 20  ee_rollback     
8bc0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
8bd0: 22 62 74 72 65 65 5f 63 72 65 61 74 65 5f 74 61  "btree_create_ta
8be0: 62 6c 65 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ble",       (Tcl
8bf0: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
8c00: 63 72 65 61 74 65 5f 74 61 62 6c 65 20 20 20 20  create_table    
8c10: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
8c20: 72 65 65 5f 64 72 6f 70 5f 74 61 62 6c 65 22 2c  ree_drop_table",
8c30: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
8c40: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 64 72 6f  dProc*)btree_dro
8c50: 70 5f 74 61 62 6c 65 20 20 20 20 20 20 20 20 20  p_table         
8c60: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
8c70: 5f 63 6c 65 61 72 5f 74 61 62 6c 65 22 2c 20 20  _clear_table",  
8c80: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
8c90: 6f 63 2a 29 62 74 72 65 65 5f 63 6c 65 61 72 5f  oc*)btree_clear_
8ca0: 74 61 62 6c 65 20 20 20 20 20 20 20 20 7d 2c 0a  table        },.
8cb0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 67 65       { "btree_ge
8cc0: 74 5f 6d 65 74 61 22 2c 20 20 20 20 20 20 20 20  t_meta",        
8cd0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
8ce0: 29 62 74 72 65 65 5f 67 65 74 5f 6d 65 74 61 20  )btree_get_meta 
8cf0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8d00: 20 20 7b 20 22 62 74 72 65 65 5f 75 70 64 61 74    { "btree_updat
8d10: 65 5f 6d 65 74 61 22 2c 20 20 20 20 20 20 20 20  e_meta",        
8d20: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
8d30: 72 65 65 5f 75 70 64 61 74 65 5f 6d 65 74 61 20  ree_update_meta 
8d40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
8d50: 20 22 62 74 72 65 65 5f 70 61 67 65 5f 64 75 6d   "btree_page_dum
8d60: 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  p",          (Tc
8d70: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
8d80: 5f 70 61 67 65 5f 64 75 6d 70 20 20 20 20 20 20  _page_dump      
8d90: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
8da0: 74 72 65 65 5f 74 72 65 65 5f 64 75 6d 70 22 2c  tree_tree_dump",
8db0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
8dc0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 74 72  mdProc*)btree_tr
8dd0: 65 65 5f 64 75 6d 70 20 20 20 20 20 20 20 20 20  ee_dump         
8de0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
8df0: 65 5f 70 61 67 65 72 5f 73 74 61 74 73 22 2c 20  e_pager_stats", 
8e00: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
8e10: 72 6f 63 2a 29 62 74 72 65 65 5f 70 61 67 65 72  roc*)btree_pager
8e20: 5f 73 74 61 74 73 20 20 20 20 20 20 20 20 7d 2c  _stats        },
8e30: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70  .     { "btree_p
8e40: 61 67 65 72 5f 72 65 66 5f 64 75 6d 70 22 2c 20  ager_ref_dump", 
8e50: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
8e60: 2a 29 62 74 72 65 65 5f 70 61 67 65 72 5f 72 65  *)btree_pager_re
8e70: 66 5f 64 75 6d 70 20 20 20 20 20 7d 2c 0a 20 20  f_dump     },.  
8e80: 20 20 20 7b 20 22 62 74 72 65 65 5f 63 75 72 73     { "btree_curs
8e90: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
8ea0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
8eb0: 74 72 65 65 5f 63 75 72 73 6f 72 20 20 20 20 20  tree_cursor     
8ec0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
8ed0: 7b 20 22 62 74 72 65 65 5f 63 6c 6f 73 65 5f 63  { "btree_close_c
8ee0: 75 72 73 6f 72 22 2c 20 20 20 20 20 20 20 28 54  ursor",       (T
8ef0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
8f00: 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72 20 20  e_close_cursor  
8f10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
8f20: 62 74 72 65 65 5f 6d 6f 76 65 5f 74 6f 22 2c 20  btree_move_to", 
8f30: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
8f40: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6d  CmdProc*)btree_m
8f50: 6f 76 65 5f 74 6f 20 20 20 20 20 20 20 20 20 20  ove_to          
8f60: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
8f70: 65 65 5f 64 65 6c 65 74 65 22 2c 20 20 20 20 20  ee_delete",     
8f80: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
8f90: 50 72 6f 63 2a 29 62 74 72 65 65 5f 64 65 6c 65  Proc*)btree_dele
8fa0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  te             }
8fb0: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
8fc0: 6e 65 78 74 22 2c 20 20 20 20 20 20 20 20 20 20  next",          
8fd0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
8fe0: 63 2a 29 62 74 72 65 65 5f 6e 65 78 74 20 20 20  c*)btree_next   
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9000: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70 72 65      { "btree_pre
9010: 76 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  v",             
9020: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
9030: 62 74 72 65 65 5f 70 72 65 76 20 20 20 20 20 20  btree_prev      
9040: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9050: 20 7b 20 22 62 74 72 65 65 5f 65 6f 66 22 2c 20   { "btree_eof", 
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9070: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
9080: 65 65 5f 65 6f 66 20 20 20 20 20 20 20 20 20 20  ee_eof          
9090: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
90a0: 22 62 74 72 65 65 5f 6b 65 79 73 69 7a 65 22 2c  "btree_keysize",
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
90c0: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
90d0: 6b 65 79 73 69 7a 65 20 20 20 20 20 20 20 20 20  keysize         
90e0: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
90f0: 72 65 65 5f 6b 65 79 22 2c 20 20 20 20 20 20 20  ree_key",       
9100: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
9110: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6b 65 79  dProc*)btree_key
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
9140: 5f 64 61 74 61 22 2c 20 20 20 20 20 20 20 20 20  _data",         
9150: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
9160: 6f 63 2a 29 62 74 72 65 65 5f 64 61 74 61 20 20  oc*)btree_data  
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9180: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 66 65       { "btree_fe
9190: 74 63 68 5f 6b 65 79 22 2c 20 20 20 20 20 20 20  tch_key",       
91a0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
91b0: 29 62 74 72 65 65 5f 66 65 74 63 68 5f 6b 65 79  )btree_fetch_key
91c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
91d0: 20 20 7b 20 22 62 74 72 65 65 5f 66 65 74 63 68    { "btree_fetch
91e0: 5f 64 61 74 61 22 2c 20 20 20 20 20 20 20 20 20  _data",         
91f0: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
9200: 72 65 65 5f 66 65 74 63 68 5f 64 61 74 61 20 20  ree_fetch_data  
9210: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
9220: 20 22 62 74 72 65 65 5f 70 61 79 6c 6f 61 64 5f   "btree_payload_
9230: 73 69 7a 65 22 2c 20 20 20 20 20 20 20 28 54 63  size",       (Tc
9240: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
9250: 5f 70 61 79 6c 6f 61 64 5f 73 69 7a 65 20 20 20  _payload_size   
9260: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
9270: 74 72 65 65 5f 66 69 72 73 74 22 2c 20 20 20 20  tree_first",    
9280: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
9290: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 66 69  mdProc*)btree_fi
92a0: 72 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  rst             
92b0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
92c0: 65 5f 6c 61 73 74 22 2c 20 20 20 20 20 20 20 20  e_last",        
92d0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
92e0: 72 6f 63 2a 29 62 74 72 65 65 5f 6c 61 73 74 20  roc*)btree_last 
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9300: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63  .     { "btree_c
9310: 75 72 73 6f 72 5f 69 6e 66 6f 22 2c 20 20 20 20  ursor_info",    
9320: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
9330: 2a 29 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 69  *)btree_cursor_i
9340: 6e 66 6f 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  nfo        },.  
9350: 20 20 20 7b 20 22 62 74 72 65 65 5f 63 75 72 73     { "btree_curs
9360: 6f 72 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20  or_list",       
9370: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
9380: 74 72 65 65 5f 63 75 72 73 6f 72 5f 6c 69 73 74  tree_cursor_list
9390: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
93a0: 7b 20 22 62 74 72 65 65 5f 69 6e 74 65 67 72 69  { "btree_integri
93b0: 74 79 5f 63 68 65 63 6b 22 2c 20 20 20 20 28 54  ty_check",    (T
93c0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
93d0: 65 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e_integrity_chec
93e0: 6b 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  k    },.     { "
93f0: 62 74 72 65 65 5f 62 72 65 61 6b 70 6f 69 6e 74  btree_breakpoint
9400: 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
9410: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 62  CmdProc*)btree_b
9420: 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20  reakpoint       
9430: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
9440: 65 65 5f 76 61 72 69 6e 74 5f 74 65 73 74 22 2c  ee_varint_test",
9450: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
9460: 50 72 6f 63 2a 29 62 74 72 65 65 5f 76 61 72 69  Proc*)btree_vari
9470: 6e 74 5f 74 65 73 74 20 20 20 20 20 20 20 20 7d  nt_test        }
9480: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
9490: 62 65 67 69 6e 5f 73 74 61 74 65 6d 65 6e 74 22  begin_statement"
94a0: 2c 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f  ,    (Tcl_CmdPro
94b0: 63 2a 29 62 74 72 65 65 5f 62 65 67 69 6e 5f 73  c*)btree_begin_s
94c0: 74 61 74 65 6d 65 6e 74 20 20 20 20 7d 2c 0a 20  tatement    },. 
94d0: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63 6f 6d      { "btree_com
94e0: 6d 69 74 5f 73 74 61 74 65 6d 65 6e 74 22 2c 20  mit_statement", 
94f0: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
9500: 62 74 72 65 65 5f 63 6f 6d 6d 69 74 5f 73 74 61  btree_commit_sta
9510: 74 65 6d 65 6e 74 20 20 20 7d 2c 0a 20 20 20 20  tement   },.    
9520: 20 7b 20 22 62 74 72 65 65 5f 72 6f 6c 6c 62 61   { "btree_rollba
9530: 63 6b 5f 73 74 61 74 65 6d 65 6e 74 22 2c 20 28  ck_statement", (
9540: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
9550: 65 65 5f 72 6f 6c 6c 62 61 63 6b 5f 73 74 61 74  ee_rollback_stat
9560: 65 6d 65 6e 74 20 7d 2c 0a 20 20 7d 3b 0a 20 20  ement },.  };.  
9570: 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d  int i;..  for(i=
9580: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64  0; i<sizeof(aCmd
9590: 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d  )/sizeof(aCmd[0]
95a0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
95b0: 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
95c0: 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a  nterp, aCmd[i].z
95d0: 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50  Name, aCmd[i].xP
95e0: 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  roc, 0, 0);.  }.
95f0: 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
9600: 74 65 72 70 2c 20 22 70 61 67 65 72 5f 72 65 66  terp, "pager_ref
9610: 69 6e 66 6f 5f 65 6e 61 62 6c 65 22 2c 20 28 63  info_enable", (c
9620: 68 61 72 2a 29 26 70 61 67 65 72 33 5f 72 65 66  har*)&pager3_ref
9630: 69 6e 66 6f 5f 65 6e 61 62 6c 65 2c 0a 20 20 20  info_enable,.   
9640: 20 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b    TCL_LINK_INT);
9650: 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
9660: 6e 74 65 72 70 2c 20 22 62 74 72 65 65 5f 74 72  nterp, "btree_tr
9670: 61 63 65 22 2c 20 28 63 68 61 72 2a 29 26 73 71  ace", (char*)&sq
9680: 6c 69 74 65 33 5f 62 74 72 65 65 5f 74 72 61 63  lite3_btree_trac
9690: 65 2c 0a 20 20 20 20 20 54 43 4c 5f 4c 49 4e 4b  e,.     TCL_LINK
96a0: 5f 49 4e 54 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  _INT);..  /* The
96b0: 20 62 74 72 65 65 5f 69 6e 73 65 72 74 20 63 6f   btree_insert co
96c0: 6d 6d 61 6e 64 20 69 73 20 69 6d 70 6c 65 6d 65  mmand is impleme
96d0: 6e 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 74  nted using the t
96e0: 63 6c 20 27 6f 62 6a 65 63 74 27 0a 20 20 2a 2a  cl 'object'.  **
96f0: 20 69 6e 74 65 72 66 61 63 65 2c 20 6e 6f 74 20   interface, not 
9700: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 74 65 72  the string inter
9710: 66 61 63 65 20 6c 69 6b 65 20 74 68 65 20 6f 74  face like the ot
9720: 68 65 72 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20  her commands in 
9730: 74 68 69 73 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  this.  ** file. 
9740: 54 68 69 73 20 69 73 20 73 6f 20 62 69 6e 61 72  This is so binar
9750: 79 20 64 61 74 61 20 63 61 6e 20 62 65 20 69 6e  y data can be in
9760: 73 65 72 74 65 64 20 69 6e 74 6f 20 62 74 72 65  serted into btre
9770: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
9780: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
9790: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 62  mmand(interp, "b
97a0: 74 72 65 65 5f 69 6e 73 65 72 74 22 2c 20 62 74  tree_insert", bt
97b0: 72 65 65 5f 69 6e 73 65 72 74 2c 20 30 2c 20 30  ree_insert, 0, 0
97c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97d0: 4f 4b 3b 0a 7d 0a                                OK;.}.