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

Artifact 7247090d15a5a43823079b6fd8dad1ed3cccdedf:


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 34 34 20 32 30 30 34 2f 30 36 2f 31 37 20 30  .44 2004/06/17 0
0240: 30 3a 30 31 3a 32 31 20 64 61 6e 69 65 6c 6b 31  0:01:21 danielk1
0250: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0260: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0270: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61  .h".#include "pa
0280: 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ger.h".#include 
0290: 22 62 74 72 65 65 2e 68 22 0a 23 69 6e 63 6c 75  "btree.h".#inclu
02a0: 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c  de "tcl.h".#incl
02b0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
02c0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
02d0: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  h>../*.** Interp
02e0: 72 65 74 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ret an SQLite er
02f0: 72 6f 72 20 6e 75 6d 62 65 72 0a 2a 2f 0a 73 74  ror number.*/.st
0300: 61 74 69 63 20 63 68 61 72 20 2a 65 72 72 6f 72  atic char *error
0310: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
0320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
0330: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
0340: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
0350: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
0360: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20   "SQLITE_OK";   
0370: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0380: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
0390: 52 4f 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ROR:      zName 
03a0: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  = "SQLITE_ERROR"
03b0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
03c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
03d0: 4e 54 45 52 4e 41 4c 3a 20 20 20 7a 4e 61 6d 65  NTERNAL:   zName
03e0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
03f0: 4e 41 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  NAL";    break;.
0400: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0410: 50 45 52 4d 3a 20 20 20 20 20 20 20 7a 4e 61 6d  PERM:       zNam
0420: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d  e = "SQLITE_PERM
0430: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
0440: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0450: 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 7a 4e 61  _ABORT:      zNa
0460: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
0470: 52 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  RT";       break
0480: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0490: 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 7a 4e  E_BUSY:       zN
04a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
04b0: 53 59 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  SY";        brea
04c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
04d0: 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 7a  TE_NOMEM:      z
04e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
04f0: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65  OMEM";       bre
0500: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0510: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20  ITE_READONLY:   
0520: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0530: 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 62 72  READONLY";    br
0540: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0550: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20  LITE_INTERRUPT: 
0560: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0570: 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 62  _INTERRUPT";   b
0580: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0590: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20  QLITE_IOERR:    
05a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
05b0: 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20  E_IOERR";       
05c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
05d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20  SQLITE_CORRUPT: 
05e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
05f0: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
0600: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0610: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
0620: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
0630: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20  ITE_NOTFOUND";  
0640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0650: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
0660: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0670: 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20  LITE_FULL";     
0680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0690: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
06a0: 45 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  EN:   zName = "S
06b0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b  QLITE_CANTOPEN";
06c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
06d0: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
06e0: 43 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  COL:   zName = "
06f0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22  SQLITE_PROTOCOL"
0700: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
0710: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
0720: 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Y:      zName = 
0730: 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20  "SQLITE_EMPTY"; 
0740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0750: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
0760: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
0770: 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e   "SQLITE_Unknown
0780: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
0790: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
07a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
07b0: 3a 20 20 20 62 74 72 65 65 5f 6f 70 65 6e 20 46  :   btree_open F
07c0: 49 4c 45 4e 41 4d 45 20 4e 43 41 43 48 45 20 46  ILENAME NCACHE F
07d0: 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  LAGS.**.** Open 
07e0: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 0a 2a  a new database.*
07f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
0800: 65 65 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20  ee_open(.  void 
0810: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
0820: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0830: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
0840: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
0850: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
0860: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
0870: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
0880: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
0890: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
08a0: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
08b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
08c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
08d0: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
08e0: 20 20 69 6e 74 20 72 63 2c 20 6e 43 61 63 68 65    int rc, nCache
08f0: 2c 20 66 6c 61 67 73 3b 0a 20 20 63 68 61 72 20  , flags;.  char 
0900: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28  zBuf[100];.  if(
0910: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
0920: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0930: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
0940: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
0950: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
0960: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
0970: 45 20 4e 43 41 43 48 45 20 46 4c 41 47 53 5c 22  E NCACHE FLAGS\"
0980: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
0990: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
09a0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
09b0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
09c0: 5d 2c 20 26 6e 43 61 63 68 65 29 20 29 20 72 65  ], &nCache) ) re
09d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
09e0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
09f0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 33 5d  (interp, argv[3]
0a00: 2c 20 26 66 6c 61 67 73 29 20 29 20 72 65 74 75  , &flags) ) retu
0a10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0a20: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
0a30: 65 4f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20 26  eOpen(argv[1], &
0a40: 70 42 74 2c 20 6e 43 61 63 68 65 2c 20 66 6c 61  pBt, nCache, fla
0a50: 67 73 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  gs, 0);.  if( rc
0a60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0a70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
0a80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
0a90: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
0aa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0ab0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 70 72 69 6e  ROR;.  }.  sprin
0ac0: 74 66 28 7a 42 75 66 2c 22 25 70 22 2c 20 70 42  tf(zBuf,"%p", pB
0ad0: 74 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d  t);.  if( strncm
0ae0: 70 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29  p(zBuf,"0x",2) )
0af0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
0b00: 75 66 2c 20 22 30 78 25 70 22 2c 20 70 42 74 29  uf, "0x%p", pBt)
0b10: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
0b20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0b30: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
0b40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0b50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
0b60: 72 65 65 5f 63 6c 6f 73 65 20 49 44 0a 2a 2a 0a  ree_close ID.**.
0b70: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 67 69 76  ** Close the giv
0b80: 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  en database..*/.
0b90: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
0ba0: 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a  _close(.  void *
0bb0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
0bc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
0bd0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
0be0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
0bf0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
0c00: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
0c10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
0c20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
0c30: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
0c40: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
0c50: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
0c60: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
0c70: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
0c80: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
0c90: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
0ca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0cb0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
0cc0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
0cd0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
0ce0: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
0cf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0d00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0d10: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
0d20: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69  erp, argv[1], (i
0d30: 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65 74 75  nt*)&pBt) ) retu
0d40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0d50: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
0d60: 65 43 6c 6f 73 65 28 70 42 74 29 3b 0a 20 20 69  eClose(pBt);.  i
0d70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
0d80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
0d90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0da0: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
0db0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
0dc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
0dd0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
0de0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
0df0: 20 62 74 72 65 65 5f 62 65 67 69 6e 5f 74 72 61   btree_begin_tra
0e00: 6e 73 61 63 74 69 6f 6e 20 49 44 0a 2a 2a 0a 2a  nsaction ID.**.*
0e10: 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20 74 72  * Start a new tr
0e20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61  ansaction.*/.sta
0e30: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 62 65  tic int btree_be
0e40: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
0e50: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
0e60: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
0e70: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
0e80: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0e90: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
0ea0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
0eb0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
0ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0ed0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
0ee0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0ef0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
0f00: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
0f10: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65  ent */.){.  Btre
0f20: 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  e *pBt;.  int rc
0f30: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
0f40: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
0f50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0f60: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
0f70: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
0f80: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
0f90: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
0fa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0fb0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
0fc0: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
0fd0: 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 42  gv[1], (int*)&pB
0fe0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
0ff0: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1000: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1010: 72 61 6e 73 28 70 42 74 2c 20 31 2c 20 30 29 3b  rans(pBt, 1, 0);
1020: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1030: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
1040: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1050: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
1060: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
1070: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1080: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1090: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
10a0: 65 3a 20 20 20 62 74 72 65 65 5f 72 6f 6c 6c 62  e:   btree_rollb
10b0: 61 63 6b 20 49 44 0a 2a 2a 0a 2a 2a 20 52 6f 6c  ack ID.**.** Rol
10c0: 6c 62 61 63 6b 20 63 68 61 6e 67 65 73 0a 2a 2f  lback changes.*/
10d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
10e0: 65 5f 72 6f 6c 6c 62 61 63 6b 28 0a 20 20 76 6f  e_rollback(.  vo
10f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
1100: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1110: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
1120: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
1130: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
1140: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
1150: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
1160: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1170: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
1180: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
1190: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
11a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
11b0: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
11c0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
11d0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
11e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1200: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1210: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1220: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
1230: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1240: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1250: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1260: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1270: 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20  , (int*)&pBt) ) 
1280: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1290: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12a0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 42  BtreeRollback(pB
12b0: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
12c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
12d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12e0: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
12f0: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
1300: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1320: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1330: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63 6f  sage:   btree_co
1340: 6d 6d 69 74 20 49 44 0a 2a 2a 0a 2a 2a 20 43 6f  mmit ID.**.** Co
1350: 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
1360: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1370: 74 72 65 65 5f 63 6f 6d 6d 69 74 28 0a 20 20 76  tree_commit(.  v
1380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
13b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
13c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
13d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
13e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
13f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
1420: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
1430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1440: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
1450: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
1460: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1470: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1480: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1490: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
14a0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
14b0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22  ],.       " ID\"
14c0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
14d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
14e0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
14f0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
1500: 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29  ], (int*)&pBt) )
1510: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1520: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1530: 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74  3BtreeCommit(pBt
1540: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1550: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
1560: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1570: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
1580: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
1590: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
15b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
15c0: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 62 65 67  age:   btree_beg
15d0: 69 6e 5f 73 74 61 74 65 6d 65 6e 74 20 49 44 0a  in_statement ID.
15e0: 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 6e 65  **.** Start a ne
15f0: 77 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  w statement tran
1600: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  saction.*/.stati
1610: 63 20 69 6e 74 20 62 74 72 65 65 5f 62 65 67 69  c int btree_begi
1620: 6e 5f 73 74 61 74 65 6d 65 6e 74 28 0a 20 20 76  n_statement(.  v
1630: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1640: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1650: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1660: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1670: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1680: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1690: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
16a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16b0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
16c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
16d0: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
16e0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
16f0: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
1700: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
1710: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1720: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1730: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1740: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1750: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1760: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22  ],.       " ID\"
1770: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1790: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17a0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
17b0: 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29  ], (int*)&pBt) )
17c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17d0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
17e0: 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
17f0: 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pBt);.  if( rc!=
1800: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1810: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1820: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
1830: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
1840: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1850: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1860: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1870: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
1880: 72 6f 6c 6c 62 61 63 6b 5f 73 74 61 74 65 6d 65  rollback_stateme
1890: 6e 74 20 49 44 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c  nt ID.**.** Roll
18a0: 62 61 63 6b 20 63 68 61 6e 67 65 73 0a 2a 2f 0a  back changes.*/.
18b0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
18c0: 5f 72 6f 6c 6c 62 61 63 6b 5f 73 74 61 74 65 6d  _rollback_statem
18d0: 65 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ent(.  void *Not
18e0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
18f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1900: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1910: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1920: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1930: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1950: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1960: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
1970: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
1980: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
1990: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
19a0: 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e  Btree *pBt;.  in
19b0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
19c0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
19d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19e0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19f0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a00: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
1a10: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
1a20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
1a40: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
1a50: 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a  , argv[1], (int*
1a60: 29 26 70 42 74 29 20 29 20 72 65 74 75 72 6e 20  )&pBt) ) return 
1a70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1a80: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
1a90: 6c 6c 62 61 63 6b 53 74 6d 74 28 70 42 74 29 3b  llbackStmt(pBt);
1aa0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ab0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
1ac0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ad0: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
1ae0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
1af0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b00: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1b10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1b20: 65 3a 20 20 20 62 74 72 65 65 5f 63 6f 6d 6d 69  e:   btree_commi
1b30: 74 5f 73 74 61 74 65 6d 65 6e 74 20 49 44 0a 2a  t_statement ID.*
1b40: 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
1b50: 63 68 61 6e 67 65 73 0a 2a 2f 0a 73 74 61 74 69  changes.*/.stati
1b60: 63 20 69 6e 74 20 62 74 72 65 65 5f 63 6f 6d 6d  c int btree_comm
1b70: 69 74 5f 73 74 61 74 65 6d 65 6e 74 28 0a 20 20  it_statement(.  
1b80: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
1b90: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ba0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1bb0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1bc0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1bd0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1be0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
1bf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c00: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1c10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
1c20: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
1c30: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
1c40: 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a   */.){.  Btree *
1c50: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
1c60: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1c70: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1c90: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ca0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1cb0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
1cc0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
1cd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ce0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
1cf0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1d00: 31 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20  1], (int*)&pBt) 
1d10: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d20: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1d30: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
1d40: 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63  t(pBt);.  if( rc
1d50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
1d80: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1d90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1da0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1db0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1dc0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65  ** Usage:   btre
1dd0: 65 5f 63 72 65 61 74 65 5f 74 61 62 6c 65 20 49  e_create_table I
1de0: 44 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 43 72  D FLAGS.**.** Cr
1df0: 65 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65  eate a new table
1e00: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1e20: 74 72 65 65 5f 63 72 65 61 74 65 5f 74 61 62 6c  tree_create_tabl
1e30: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
1e40: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
1e50: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1e60: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1e70: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1e80: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1e90: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
1ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1eb0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1ec0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1ed0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
1ee0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
1ef0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
1f00: 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
1f10: 72 63 2c 20 69 54 61 62 6c 65 2c 20 66 6c 61 67  rc, iTable, flag
1f20: 73 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  s;.  char zBuf[3
1f30: 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  0];.  if( argc!=
1f40: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1f50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1f60: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1f70: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1f80: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1f90: 22 20 49 44 20 46 4c 41 47 53 5c 22 22 2c 20 30  " ID FLAGS\"", 0
1fa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1fb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1fc0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
1fd0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28  terp, argv[1], (
1fe0: 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65 74  int*)&pBt) ) ret
1ff0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2000: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
2010: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
2020: 20 26 66 6c 61 67 73 29 20 29 20 72 65 74 75 72   &flags) ) retur
2030: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
2040: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2050: 43 72 65 61 74 65 54 61 62 6c 65 28 70 42 74 2c  CreateTable(pBt,
2060: 20 26 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   &iTable, flags)
2070: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2080: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
2090: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
20a0: 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28  terp, errorName(
20b0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
20c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20d0: 20 7d 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75   }.  sprintf(zBu
20e0: 66 2c 20 22 25 64 22 2c 20 69 54 61 62 6c 65 29  f, "%d", iTable)
20f0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
2100: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
2110: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
2120: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2130: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
2140: 64 72 6f 70 5f 74 61 62 6c 65 20 49 44 20 54 41  drop_table ID TA
2150: 42 4c 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 44 65 6c  BLENUM.**.** Del
2160: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 74 61  ete an entire ta
2170: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ble from the dat
2180: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
2190: 69 6e 74 20 62 74 72 65 65 5f 64 72 6f 70 5f 74  int btree_drop_t
21a0: 61 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  able(.  void *No
21b0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
21c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
21d0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21e0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21f0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2200: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2220: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2230: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
2240: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2250: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
2260: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
2270: 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69   Btree *pBt;.  i
2280: 6e 74 20 69 54 61 62 6c 65 3b 0a 20 20 69 6e 74  nt iTable;.  int
2290: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
22a0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
22b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
22c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
22d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
22e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
22f0: 20 22 20 49 44 20 54 41 42 4c 45 4e 55 4d 5c 22   " ID TABLENUM\"
2300: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2310: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2320: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
2330: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
2340: 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29  ], (int*)&pBt) )
2350: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2360: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
2370: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
2380: 5b 32 5d 2c 20 26 69 54 61 62 6c 65 29 20 29 20  [2], &iTable) ) 
2390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
23b0: 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70  BtreeDropTable(p
23c0: 42 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69  Bt, iTable);.  i
23d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
23f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2400: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
2410: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2420: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2430: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2440: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
2450: 20 62 74 72 65 65 5f 63 6c 65 61 72 5f 74 61 62   btree_clear_tab
2460: 6c 65 20 49 44 20 54 41 42 4c 45 4e 55 4d 0a 2a  le ID TABLENUM.*
2470: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
2480: 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
2490: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 62 75 74   given table but
24a0: 20 6b 65 65 70 20 74 68 65 20 74 61 62 6c 65 20   keep the table 
24b0: 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  around..*/.stati
24c0: 63 20 69 6e 74 20 62 74 72 65 65 5f 63 6c 65 61  c int btree_clea
24d0: 72 5f 74 61 62 6c 65 28 0a 20 20 76 6f 69 64 20  r_table(.  void 
24e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
24f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2500: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2510: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2520: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2530: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
2540: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2550: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2560: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
2570: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
2580: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
2590: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
25a0: 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
25b0: 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 0a 20 20    int iTable;.  
25c0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
25d0: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
25e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
25f0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2600: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2610: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
2620: 20 20 20 20 22 20 49 44 20 54 41 42 4c 45 4e 55      " ID TABLENU
2630: 4d 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  M\"", 0);.    re
2640: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2650: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
2660: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
2670: 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74  v[1], (int*)&pBt
2680: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2690: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
26a0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
26b0: 72 67 76 5b 32 5d 2c 20 26 69 54 61 62 6c 65 29  rgv[2], &iTable)
26c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
26d0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
26e0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
26f0: 6c 65 28 70 42 74 2c 20 69 54 61 62 6c 65 29 3b  le(pBt, iTable);
2700: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2710: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
2720: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2730: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
2740: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
2750: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2760: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
2770: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2780: 65 3a 20 20 20 62 74 72 65 65 5f 67 65 74 5f 6d  e:   btree_get_m
2790: 65 74 61 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74  eta ID.**.** Ret
27a0: 75 72 6e 20 6d 65 74 61 20 64 61 74 61 0a 2a 2f  urn meta data.*/
27b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
27c0: 65 5f 67 65 74 5f 6d 65 74 61 28 0a 20 20 76 6f  e_get_meta(.  vo
27d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
27e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
27f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2800: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2810: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2820: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2830: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2840: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2850: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2860: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
2870: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2880: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2890: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
28a0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
28b0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63  nt i;.  if( argc
28c0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
28d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28e0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
28f0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2900: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
2910: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
2920: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2930: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
2940: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
2950: 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a  , argv[1], (int*
2960: 29 26 70 42 74 29 20 29 20 72 65 74 75 72 6e 20  )&pBt) ) return 
2970: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  TCL_ERROR;.  for
2980: 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  (i=0; i<SQLITE_N
2990: 5f 42 54 52 45 45 5f 4d 45 54 41 3b 20 69 2b 2b  _BTREE_META; i++
29a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
29b0: 5b 33 30 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e  [30];.    unsign
29c0: 65 64 20 69 6e 74 20 76 3b 0a 20 20 20 20 72 63  ed int v;.    rc
29d0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
29e0: 65 74 4d 65 74 61 28 70 42 74 2c 20 69 2c 20 26  etMeta(pBt, i, &
29f0: 76 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  v);.    if( rc!=
2a00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2a20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
2a30: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
2a40: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2a50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
2a60: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
2a70: 64 22 2c 76 29 3b 0a 20 20 20 20 54 63 6c 5f 41  d",v);.    Tcl_A
2a80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2a90: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  erp, zBuf);.  }.
2aa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2ac0: 20 20 20 62 74 72 65 65 5f 75 70 64 61 74 65 5f     btree_update_
2ad0: 6d 65 74 61 20 49 44 20 4d 45 54 41 44 41 54 41  meta ID METADATA
2ae0: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ....**.** Return
2af0: 20 6d 65 74 61 20 64 61 74 61 0a 2a 2f 0a 73 74   meta data.*/.st
2b00: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 75  atic int btree_u
2b10: 70 64 61 74 65 5f 6d 65 74 61 28 0a 20 20 76 6f  pdate_meta(.  vo
2b20: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2b30: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2b40: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2b50: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2b60: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2b70: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2b80: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ba0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
2bc0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2bd0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2be0: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
2bf0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
2c00: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 61 4d 65 74  nt i;.  int aMet
2c10: 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  a[SQLITE_N_BTREE
2c20: 5f 4d 45 54 41 5d 3b 0a 0a 20 20 69 66 28 20 61  _META];..  if( a
2c30: 72 67 63 21 3d 32 2b 53 51 4c 49 54 45 5f 4e 5f  rgc!=2+SQLITE_N_
2c40: 42 54 52 45 45 5f 4d 45 54 41 20 29 7b 0a 20 20  BTREE_META ){.  
2c50: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
2c60: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
2c70: 66 2c 22 25 64 22 2c 53 51 4c 49 54 45 5f 4e 5f  f,"%d",SQLITE_N_
2c80: 42 54 52 45 45 5f 4d 45 54 41 29 3b 0a 20 20 20  BTREE_META);.   
2c90: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2ca0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2cb0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2cc0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
2cd0: 0a 20 20 20 20 20 20 20 22 20 49 44 20 4d 45 54  .       " ID MET
2ce0: 41 44 41 54 41 2e 2e 2e 5c 22 20 28 4d 45 54 41  ADATA...\" (META
2cf0: 44 41 54 41 20 69 73 20 22 2c 20 7a 42 75 66 2c  DATA is ", zBuf,
2d00: 20 22 20 69 6e 74 65 67 65 72 73 29 22 2c 20 30   " integers)", 0
2d10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2d20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2d30: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
2d40: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28  terp, argv[1], (
2d50: 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65 74  int*)&pBt) ) ret
2d60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2d70: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 53 51 4c 49   for(i=1; i<SQLI
2d80: 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 3b  TE_N_BTREE_META;
2d90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
2da0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
2db0: 2c 20 61 72 67 76 5b 69 2b 31 5d 2c 20 26 61 4d  , argv[i+1], &aM
2dc0: 65 74 61 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  eta[i]) ) return
2dd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2de0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 53 51 4c    for(i=1; i<SQL
2df0: 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41  ITE_N_BTREE_META
2e00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
2e10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2e20: 61 74 65 4d 65 74 61 28 70 42 74 2c 20 69 2c 20  ateMeta(pBt, i, 
2e30: 61 4d 65 74 61 5b 69 5d 29 3b 0a 20 20 20 20 69  aMeta[i]);.    i
2e40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e50: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
2e60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2e70: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
2e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
2e90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2ea0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2eb0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2ec0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
2ed0: 5f 70 61 67 65 5f 64 75 6d 70 20 49 44 20 50 41  _page_dump ID PA
2ee0: 47 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 50 72 69 6e  GENUM.**.** Prin
2ef0: 74 20 61 20 64 69 73 61 73 73 65 6d 62 6c 79 20  t a disassembly 
2f00: 6f 66 20 61 20 70 61 67 65 20 6f 6e 20 73 74 61  of a page on sta
2f10: 6e 64 61 72 64 20 6f 75 74 70 75 74 0a 2a 2f 0a  ndard output.*/.
2f20: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2f30: 5f 70 61 67 65 5f 64 75 6d 70 28 0a 20 20 76 6f  _page_dump(.  vo
2f40: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2f50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2f60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2f70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2f80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2f90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2fa0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2fb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fc0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
2fe0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2ff0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3000: 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  /.){.  Btree *pB
3010: 74 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 3b 0a  t;.  int iPage;.
3020: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
3030: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
3040: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3050: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3060: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3070: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
3080: 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20         " ID\"", 
3090: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
30a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
30b0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
30c0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
30d0: 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65  (int*)&pBt) ) re
30e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30f0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
3100: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
3110: 2c 20 26 69 50 61 67 65 29 20 29 20 72 65 74 75  , &iPage) ) retu
3120: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3130: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
3140: 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20 69  ePageDump(pBt, i
3150: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
3160: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
3170: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3180: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
3190: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
31a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
31b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
31c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
31d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
31e0: 72 65 65 5f 74 72 65 65 5f 64 75 6d 70 20 49 44  ree_tree_dump ID
31f0: 20 50 41 47 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 50   PAGENUM.**.** P
3200: 72 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d 62  rint a disassemb
3210: 6c 79 20 6f 66 20 61 20 70 61 67 65 20 61 6e 64  ly of a page and
3220: 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 20 70   all its child p
3230: 61 67 65 73 20 6f 6e 20 73 74 61 6e 64 61 72 64  ages on standard
3240: 20 6f 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69   output.*/.stati
3250: 63 20 69 6e 74 20 62 74 72 65 65 5f 74 72 65 65  c int btree_tree
3260: 5f 64 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a 4e  _dump(.  void *N
3270: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3280: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3290: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
32a0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
32b0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
32c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32e0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
32f0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
3300: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3310: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3320: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3330: 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
3340: 69 6e 74 20 69 50 61 67 65 3b 0a 20 20 69 6e 74  int iPage;.  int
3350: 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63   rc;..  if( argc
3360: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3370: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3380: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3390: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
33a0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
33b0: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
33c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
33d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
33e0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
33f0: 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a  , argv[1], (int*
3400: 29 26 70 42 74 29 20 29 20 72 65 74 75 72 6e 20  )&pBt) ) return 
3410: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
3420: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
3430: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 50  rp, argv[2], &iP
3440: 61 67 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  age) ) return TC
3450: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
3460: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
3470: 44 75 6d 70 28 70 42 74 2c 20 69 50 61 67 65 2c  Dump(pBt, iPage,
3480: 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   1);.  if( rc!=S
3490: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
34b0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
34c0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
34d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
34e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
34f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3500: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 70  Usage:   btree_p
3510: 61 67 65 72 5f 73 74 61 74 73 20 49 44 0a 2a 2a  ager_stats ID.**
3520: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 70 61 67 65  .** Returns page
3530: 72 20 73 74 61 74 69 73 74 69 63 73 0a 2a 2f 0a  r statistics.*/.
3540: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
3550: 5f 70 61 67 65 72 5f 73 74 61 74 73 28 0a 20 20  _pager_stats(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
3600: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a   */.){.  Btree *
3630: 70 42 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pBt;.  int i;.  
3640: 69 6e 74 20 2a 61 3b 0a 0a 20 20 69 66 28 20 61  int *a;..  if( a
3650: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
3660: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3670: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3680: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3690: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
36a0: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
36b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
36c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
36d0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
36e0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69  erp, argv[1], (i
36f0: 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65 74 75  nt*)&pBt) ) retu
3700: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3710: 61 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  a = sqlite3pager
3720: 5f 73 74 61 74 73 28 73 71 6c 69 74 65 33 42 74  _stats(sqlite3Bt
3730: 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a  reePager(pBt));.
3740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 39 3b 20    for(i=0; i<9; 
3750: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63  i++){.    static
3760: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 5b 5d 20 3d   char *zName[] =
3770: 20 7b 0a 20 20 20 20 20 20 22 72 65 66 22 2c 20   {.      "ref", 
3780: 22 70 61 67 65 22 2c 20 22 6d 61 78 22 2c 20 22  "page", "max", "
3790: 73 69 7a 65 22 2c 20 22 73 74 61 74 65 22 2c 20  size", "state", 
37a0: 22 65 72 72 22 2c 0a 20 20 20 20 20 20 22 68 69  "err",.      "hi
37b0: 74 22 2c 20 22 6d 69 73 73 22 2c 20 22 6f 76 66  t", "miss", "ovf
37c0: 6c 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  l",.    };.    c
37d0: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
37e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65     Tcl_AppendEle
37f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 4e 61  ment(interp, zNa
3800: 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 73 70 72 69  me[i]);.    spri
3810: 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 61 5b  ntf(zBuf,"%d",a[
3820: 69 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  i]);.    Tcl_App
3830: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3840: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20  p, zBuf);.  }.  
3850: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3860: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
3870: 20 62 74 72 65 65 5f 70 61 67 65 72 5f 72 65 66   btree_pager_ref
3880: 5f 64 75 6d 70 20 49 44 0a 2a 2a 0a 2a 2a 20 50  _dump ID.**.** P
3890: 72 69 6e 74 20 6f 75 74 20 61 6c 6c 20 6f 75 74  rint out all out
38a0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 0a  standing pages..
38b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
38c0: 72 65 65 5f 70 61 67 65 72 5f 72 65 66 5f 64 75  ree_pager_ref_du
38d0: 6d 70 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  mp(.  void *NotU
38e0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
38f0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3900: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3910: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3920: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3930: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3950: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3960: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
3970: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a  r **argv      /*
3980: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3990: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42  gument */.){.  B
39a0: 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 69 66  tree *pBt;..  if
39b0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
39c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
39d0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
39e0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
39f0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
3a00: 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c  .       " ID\"",
3a10: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
3a20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
3a30: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
3a40: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
3a50: 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72   (int*)&pBt) ) r
3a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3a70: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
3a80: 72 65 66 64 75 6d 70 28 73 71 6c 69 74 65 33 42  refdump(sqlite3B
3a90: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
3aa0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3ac0: 3a 20 20 20 62 74 72 65 65 5f 69 6e 74 65 67 72  :   btree_integr
3ad0: 69 74 79 5f 63 68 65 63 6b 20 49 44 20 52 4f 4f  ity_check ID ROO
3ae0: 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 6f 6b  T ....**.** Look
3af0: 20 74 68 72 6f 75 67 68 20 65 76 65 72 79 20 70   through every p
3b00: 61 67 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  age of the given
3b10: 20 42 54 72 65 65 20 66 69 6c 65 20 74 6f 20 76   BTree file to v
3b20: 65 72 69 66 79 20 63 6f 72 72 65 63 74 0a 2a 2a  erify correct.**
3b30: 20 66 6f 72 6d 61 74 74 69 6e 67 20 61 6e 64 20   formatting and 
3b40: 6c 69 6e 6b 61 67 65 2e 20 20 52 65 74 75 72 6e  linkage.  Return
3b50: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
3b60: 66 6f 72 20 65 61 63 68 20 70 72 6f 62 6c 65 6d  for each problem
3b70: 20 66 6f 75 6e 64 2e 0a 2a 2a 20 52 65 74 75 72   found..** Retur
3b80: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
3b90: 67 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  g if everything 
3ba0: 77 6f 72 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  worked..*/.stati
3bb0: 63 20 69 6e 74 20 62 74 72 65 65 5f 69 6e 74 65  c int btree_inte
3bc0: 67 72 69 74 79 5f 63 68 65 63 6b 28 0a 20 20 76  grity_check(.  v
3bd0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
3be0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3bf0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
3c00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
3c10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
3c20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
3c30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3c40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3c50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3c60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
3c70: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
3c80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3c90: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
3ca0: 42 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73  Bt;.  char *zRes
3cb0: 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  ult;.  int nRoot
3cc0: 3b 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 0a  ;.  int *aRoot;.
3cd0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
3ce0: 61 72 67 63 3c 33 20 29 7b 0a 20 20 20 20 54 63  argc<3 ){.    Tc
3cf0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3d00: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3d10: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3d20: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
3d30: 20 20 20 20 20 22 20 49 44 20 52 4f 4f 54 20 2e       " ID ROOT .
3d40: 2e 2e 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ..\"", 0);.    r
3d50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3d60: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
3d70: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
3d80: 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 42  gv[1], (int*)&pB
3d90: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
3da0: 45 52 52 4f 52 3b 0a 20 20 6e 52 6f 6f 74 20 3d  ERROR;.  nRoot =
3db0: 20 61 72 67 63 2d 32 3b 0a 20 20 61 52 6f 6f 74   argc-2;.  aRoot
3dc0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
3dd0: 66 28 69 6e 74 29 2a 28 61 72 67 63 2d 32 29 20  f(int)*(argc-2) 
3de0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
3df0: 61 72 67 63 2d 32 3b 20 69 2b 2b 29 7b 0a 20 20  argc-2; i++){.  
3e00: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
3e10: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 2b  (interp, argv[i+
3e20: 32 5d 2c 20 26 61 52 6f 6f 74 5b 69 5d 29 20 29  2], &aRoot[i]) )
3e30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3e40: 52 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 75 6c 74  R;.  }.  zResult
3e50: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
3e60: 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 70 42  ntegrityCheck(pB
3e70: 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29  t, aRoot, nRoot)
3e80: 3b 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20  ;.  if( zResult 
3e90: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3ea0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3eb0: 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20  zResult, 0);.   
3ec0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 65 73   sqliteFree(zRes
3ed0: 75 6c 74 29 3b 20 0a 20 20 7d 0a 20 20 72 65 74  ult); .  }.  ret
3ee0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
3ef0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
3f00: 72 65 65 5f 63 75 72 73 6f 72 5f 6c 69 73 74 20  ree_cursor_list 
3f10: 49 44 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 69  ID.**.** Print i
3f20: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
3f30: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 6f 20   all cursors to 
3f40: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20  standard output 
3f50: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a  for debugging..*
3f60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
3f70: 65 65 5f 63 75 72 73 6f 72 5f 6c 69 73 74 28 0a  ee_cursor_list(.
3f80: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3f90: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3fa0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3fb0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3fc0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3fd0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3fe0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3ff0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4000: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
4010: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
4020: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
4030: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
4040: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65  nt */.){.  Btree
4050: 20 2a 70 42 74 3b 0a 0a 20 20 69 66 28 20 61 72   *pBt;..  if( ar
4060: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4070: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4080: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4090: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
40a0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
40b0: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
40c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
40d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
40e0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
40f0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e  rp, argv[1], (in
4100: 74 2a 29 26 70 42 74 29 20 29 20 72 65 74 75 72  t*)&pBt) ) retur
4110: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
4120: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
4130: 72 4c 69 73 74 28 70 42 74 29 3b 0a 20 20 72 65  rList(pBt);.  re
4140: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4150: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4160: 20 20 62 74 72 65 65 5f 63 75 72 73 6f 72 20 49    btree_cursor I
4170: 44 20 54 41 42 4c 45 4e 55 4d 20 57 52 49 54 45  D TABLENUM WRITE
4180: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74  ABLE.**.** Creat
4190: 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 2e 20  e a new cursor. 
41a0: 20 52 65 74 75 72 6e 20 74 68 65 20 49 44 20 66   Return the ID f
41b0: 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  or the cursor..*
41c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
41d0: 65 65 5f 63 75 72 73 6f 72 28 0a 20 20 76 6f 69  ee_cursor(.  voi
41e0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
41f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4200: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4210: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4220: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4230: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4240: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4250: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4260: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
4270: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20  nst char **argv 
4280: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4290: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
42a0: 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  .){.  Btree *pBt
42b0: 3b 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 0a  ;.  int iTable;.
42c0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
42d0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
42e0: 74 20 77 72 46 6c 61 67 3b 0a 20 20 63 68 61 72  t wrFlag;.  char
42f0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66   zBuf[30];..  if
4300: 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  ( argc!=4 ){.   
4310: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4320: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
4330: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
4340: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
4350: 0a 20 20 20 20 20 20 20 22 20 49 44 20 54 41 42  .       " ID TAB
4360: 4c 45 4e 55 4d 20 57 52 49 54 45 41 42 4c 45 5c  LENUM WRITEABLE\
4370: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4380: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4390: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
43a0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
43b0: 31 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20  1], (int*)&pBt) 
43c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
43d0: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
43e0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
43f0: 76 5b 32 5d 2c 20 26 69 54 61 62 6c 65 29 20 29  v[2], &iTable) )
4400: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4410: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
4420: 42 6f 6f 6c 65 61 6e 28 69 6e 74 65 72 70 2c 20  Boolean(interp, 
4430: 61 72 67 76 5b 33 5d 2c 20 26 77 72 46 6c 61 67  argv[3], &wrFlag
4440: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4450: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
4460: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
4470: 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  pBt, iTable, wrF
4480: 6c 61 67 2c 20 30 2c 20 30 2c 20 26 70 43 75 72  lag, 0, 0, &pCur
4490: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
44a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
44b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
44c0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
44d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
44e0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 70 72 69 6e  ROR;.  }.  sprin
44f0: 74 66 28 7a 42 75 66 2c 22 30 78 25 78 22 2c 20  tf(zBuf,"0x%x", 
4500: 28 69 6e 74 29 70 43 75 72 29 3b 0a 20 20 54 63  (int)pCur);.  Tc
4510: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4520: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
4530: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4540: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4550: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63 6c 6f  age:   btree_clo
4560: 73 65 5f 63 75 72 73 6f 72 20 49 44 0a 2a 2a 0a  se_cursor ID.**.
4570: 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
4580: 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 62  r opened using b
4590: 74 72 65 65 5f 63 75 72 73 6f 72 2e 0a 2a 2f 0a  tree_cursor..*/.
45a0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
45b0: 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72 28 0a 20  _close_cursor(. 
45c0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
45d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
45e0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
45f0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4600: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4610: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4620: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4640: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
4660: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
4670: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4680: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  t */.){.  BtCurs
4690: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
46a0: 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  rc;..  if( argc!
46b0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
46c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
46d0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
46e0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
46f0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
4700: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
4710: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4720: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
4730: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
4740: 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29   argv[1], (int*)
4750: 26 70 43 75 72 29 20 29 20 72 65 74 75 72 6e 20  &pCur) ) return 
4760: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
4770: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
4780: 6f 73 65 43 75 72 73 6f 72 28 70 43 75 72 29 3b  oseCursor(pCur);
4790: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
47a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
47b0: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
47c0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 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 72 65 74 75 72 6e 20  R;.  }.  return 
47f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4800: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
4810: 65 65 5f 6d 6f 76 65 5f 74 6f 20 49 44 20 4b 45  ee_move_to ID KE
4820: 59 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  Y.**.** Move the
4830: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 65   cursor to the e
4840: 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 67 69  ntry with the gi
4850: 76 65 6e 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74  ven key..*/.stat
4860: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 6d 6f 76  ic int btree_mov
4870: 65 5f 74 6f 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  e_to(.  void *No
4880: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4890: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
48a0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
48b0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
48c0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
48d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
48f0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4900: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
4910: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4920: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4930: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4940: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
4950: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
4960: 20 72 65 73 3b 0a 20 20 63 68 61 72 20 7a 42 75   res;.  char zBu
4970: 66 5b 32 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[20];..  if( ar
4980: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
4990: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
49a0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
49b0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
49c0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
49d0: 20 20 20 20 22 20 49 44 20 4b 45 59 5c 22 22 2c      " ID KEY\"",
49e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
49f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4a00: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
4a10: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4a20: 20 28 69 6e 74 2a 29 26 70 43 75 72 29 20 29 20   (int*)&pCur) ) 
4a30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4a40: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  ;.  if( sqlite3B
4a50: 74 72 65 65 46 6c 61 67 73 28 70 43 75 72 29 20  treeFlags(pCur) 
4a60: 26 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29  & BTREE_INTKEY )
4a70: 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 3b 0a  {.    int iKey;.
4a80: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
4a90: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
4aa0: 32 5d 2c 20 26 69 4b 65 79 29 20 29 20 72 65 74  2], &iKey) ) ret
4ab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4ac0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4ad0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
4ae0: 20 30 2c 20 69 4b 65 79 2c 20 26 72 65 73 29 3b   0, iKey, &res);
4af0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
4b00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
4b10: 6f 76 65 74 6f 28 70 43 75 72 2c 20 61 72 67 76  oveto(pCur, argv
4b20: 5b 32 5d 2c 20 73 74 72 6c 65 6e 28 61 72 67 76  [2], strlen(argv
4b30: 5b 32 5d 29 2c 20 26 72 65 73 29 3b 20 20 0a 20  [2]), &res);  . 
4b40: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
4b50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4b60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
4b70: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
4b80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4b90: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ROR;.  }.  if( r
4ba0: 65 73 3c 30 20 29 20 72 65 73 20 3d 20 2d 31 3b  es<0 ) res = -1;
4bb0: 0a 20 20 69 66 28 20 72 65 73 3e 30 20 29 20 72  .  if( res>0 ) r
4bc0: 65 73 20 3d 20 31 3b 0a 20 20 73 70 72 69 6e 74  es = 1;.  sprint
4bd0: 66 28 7a 42 75 66 2c 22 25 64 22 2c 72 65 73 29  f(zBuf,"%d",res)
4be0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
4bf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
4c00: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
4c10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4c20: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
4c30: 65 65 5f 64 65 6c 65 74 65 20 49 44 0a 2a 2a 0a  ee_delete ID.**.
4c40: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e  ** Delete the en
4c50: 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72  try that the cur
4c60: 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
4c70: 74 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  to.*/.static int
4c80: 20 62 74 72 65 65 5f 64 65 6c 65 74 65 28 0a 20   btree_delete(. 
4c90: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4ca0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4cb0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4cc0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4cd0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4ce0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4cf0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4d10: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4d20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
4d30: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
4d40: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4d50: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  t */.){.  BtCurs
4d60: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
4d70: 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  rc;..  if( argc!
4d80: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
4d90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4da0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4db0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4dc0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
4dd0: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
4de0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4df0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
4e00: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
4e10: 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29   argv[1], (int*)
4e20: 26 70 43 75 72 29 20 29 20 72 65 74 75 72 6e 20  &pCur) ) return 
4e30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
4e40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  = sqlite3BtreeDe
4e50: 6c 65 74 65 28 70 43 75 72 29 3b 0a 20 20 69 66  lete(pCur);.  if
4e60: 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
4e70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4e80: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
4e90: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
4ea0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4ec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
4ed0: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 69 6e  sage:   btree_in
4ee0: 73 65 72 74 20 49 44 20 4b 45 59 20 44 41 54 41  sert ID KEY DATA
4ef0: 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  .**.** Create a 
4f00: 6e 65 77 20 65 6e 74 72 79 20 77 69 74 68 20 74  new entry with t
4f10: 68 65 20 67 69 76 65 6e 20 6b 65 79 20 61 6e 64  he given key and
4f20: 20 64 61 74 61 2e 20 20 49 66 20 61 6e 20 65 6e   data.  If an en
4f30: 74 72 79 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65  try already.** e
4f40: 78 69 73 74 73 20 77 69 74 68 20 74 68 65 20 73  xists with the s
4f50: 61 6d 65 20 6b 65 79 20 74 68 65 20 6f 6c 64 20  ame key the old 
4f60: 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77 72 69  entry is overwri
4f70: 74 74 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tten..*/.static 
4f80: 69 6e 74 20 62 74 72 65 65 5f 69 6e 73 65 72 74  int btree_insert
4f90: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4fa0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4fb0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4fc0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4fd0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4fe0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4ff0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
5000: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5010: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5020: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5030: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
5040: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
5050: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
5060: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
5070: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72  nt rc;..  if( ar
5080: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
5090: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
50a0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
50b0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
50c0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
50d0: 20 20 20 20 22 20 49 44 20 4b 45 59 20 44 41 54      " ID KEY DAT
50e0: 41 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  A\"", 0);.    re
50f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5100: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
5110: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
5120: 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 43 75  v[1], (int*)&pCu
5130: 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  r) ) return TCL_
5140: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 71 6c  ERROR;.  if( sql
5150: 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 70  ite3BtreeFlags(p
5160: 43 75 72 29 20 26 20 42 54 52 45 45 5f 49 4e 54  Cur) & BTREE_INT
5170: 4b 45 59 20 29 7b 0a 2f 2a 0a 20 20 20 20 69 6e  KEY ){./*.    in
5180: 74 20 69 4b 65 79 3b 0a 20 20 20 20 69 66 28 20  t iKey;.    if( 
5190: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
51a0: 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 4b 65  p, argv[2], &iKe
51b0: 79 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  y) ) return TCL_
51c0: 45 52 52 4f 52 3b 0a 2a 2f 0a 20 20 20 20 69 36  ERROR;.*/.    i6
51d0: 34 20 69 4b 65 79 3b 0a 20 20 20 20 54 63 6c 5f  4 iKey;.    Tcl_
51e0: 4f 62 6a 20 2a 6f 62 6a 20 3d 20 54 63 6c 5f 4e  Obj *obj = Tcl_N
51f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 72 67 76  ewStringObj(argv
5200: 5b 32 5d 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63  [2], -1);.    Tc
5210: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
5220: 62 6a 29 3b 0a 20 20 20 20 69 66 28 20 54 63 6c  bj);.    if( Tcl
5230: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
5240: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 2c 20  bj(interp, obj, 
5250: 26 69 4b 65 79 29 20 29 20 72 65 74 75 72 6e 20  &iKey) ) return 
5260: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
5270: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
5280: 6f 62 6a 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  obj);..    rc = 
5290: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
52a0: 72 74 28 70 43 75 72 2c 20 30 2c 20 69 4b 65 79  rt(pCur, 0, iKey
52b0: 2c 20 61 72 67 76 5b 33 5d 2c 20 73 74 72 6c 65  , argv[3], strle
52c0: 6e 28 61 72 67 76 5b 33 5d 29 29 3b 0a 20 20 7d  n(argv[3]));.  }
52d0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
52e0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
52f0: 74 28 70 43 75 72 2c 20 61 72 67 76 5b 32 5d 2c  t(pCur, argv[2],
5300: 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d 29   strlen(argv[2])
5310: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5320: 20 20 20 20 20 20 20 20 20 20 20 61 72 67 76 5b             argv[
5330: 33 5d 2c 20 73 74 72 6c 65 6e 28 61 72 67 76 5b  3], strlen(argv[
5340: 33 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  3]));.  }.  if( 
5350: 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  rc ){.    Tcl_Ap
5360: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5370: 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29  p, errorName(rc)
5380: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
5390: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
53a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
53b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
53c0: 67 65 3a 20 20 20 62 74 72 65 65 5f 6e 65 78 74  ge:   btree_next
53d0: 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74   ID.**.** Move t
53e0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
53f0: 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
5400: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
5410: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  n 0 on success.*
5420: 2a 20 6f 72 20 31 20 69 66 20 74 68 65 20 63 75  * or 1 if the cu
5430: 72 73 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79  rsor was already
5440: 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 65 6e 74   on the last ent
5450: 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
5460: 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  or if.** the tab
5470: 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
5480: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5490: 5f 6e 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 4e  _next(.  void *N
54a0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
54b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
54c0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
54d0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
54e0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
54f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5510: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
5520: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
5530: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5540: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
5550: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
5560: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
5570: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
5580: 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 63 68 61  t res = 0;.  cha
5590: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
55a0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
55b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
55c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
55d0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
55e0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
55f0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22  ],.       " ID\"
5600: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
5610: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
5620: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
5630: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
5640: 5d 2c 20 28 69 6e 74 2a 29 26 70 43 75 72 29 20  ], (int*)&pCur) 
5650: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5660: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
5670: 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
5680: 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
5690: 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c ){.    Tcl_App
56a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
56b0: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
56c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
56d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
56e0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
56f0: 64 22 2c 72 65 73 29 3b 0a 20 20 54 63 6c 5f 41  d",res);.  Tcl_A
5700: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
5710: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
5720: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
5740: 3a 20 20 20 62 74 72 65 65 5f 70 72 65 76 20 49  :   btree_prev I
5750: 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  D.**.** Move the
5760: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
5770: 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
5780: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
5790: 75 72 6e 20 30 20 6f 6e 0a 2a 2a 20 73 75 63 63  urn 0 on.** succ
57a0: 65 73 73 20 61 6e 64 20 31 20 69 66 20 74 68 65  ess and 1 if the
57b0: 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 72 65   cursor was alre
57c0: 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ady on the first
57d0: 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 65   entry in.** the
57e0: 20 74 61 62 6c 65 20 6f 72 20 69 66 20 74 68 65   table or if the
57f0: 20 74 61 62 6c 65 20 77 61 73 20 65 6d 70 74 79   table was empty
5800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5810: 62 74 72 65 65 5f 70 72 65 76 28 0a 20 20 76 6f  btree_prev(.  vo
5820: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
5830: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5840: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5850: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
5860: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
5870: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
5880: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
5890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
58a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
58b0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
58c0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
58d0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
58e0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
58f0: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
5900: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
5910: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
5920: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
5930: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5940: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5950: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
5960: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
5970: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
5980: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
5990: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
59a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
59b0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
59c0: 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70  rgv[1], (int*)&p
59d0: 43 75 72 29 20 29 20 72 65 74 75 72 6e 20 54 43  Cur) ) return TC
59e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
59f0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
5a00: 69 6f 75 73 28 70 43 75 72 2c 20 26 72 65 73 29  ious(pCur, &res)
5a10: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
5a20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5a30: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
5a40: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
5a50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
5a60: 4f 52 3b 0a 20 20 7d 0a 20 20 73 70 72 69 6e 74  OR;.  }.  sprint
5a70: 66 28 7a 42 75 66 2c 22 25 64 22 2c 72 65 73 29  f(zBuf,"%d",res)
5a80: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
5a90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
5aa0: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
5ab0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5ac0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
5ad0: 65 65 5f 66 69 72 73 74 20 49 44 0a 2a 2a 0a 2a  ee_first ID.**.*
5ae0: 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
5af0: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
5b00: 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
5b10: 65 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  e.  Return 0 if 
5b20: 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77 61  the.** cursor wa
5b30: 73 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  s left point to 
5b40: 73 6f 6d 65 74 68 69 6e 67 20 61 6e 64 20 31 20  something and 1 
5b50: 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
5b60: 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  empty..*/.static
5b70: 20 69 6e 74 20 62 74 72 65 65 5f 66 69 72 73 74   int btree_first
5b80: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
5b90: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
5ba0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
5bb0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
5bc0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
5bd0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
5be0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
5bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5c00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5c10: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5c20: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
5c30: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
5c40: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
5c60: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65 73  nt rc;.  int res
5c70: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
5c80: 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 61  f[100];..  if( a
5c90: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
5ca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5cb0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
5cc0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
5cd0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
5ce0: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
5cf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
5d00: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
5d10: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
5d20: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69  erp, argv[1], (i
5d30: 6e 74 2a 29 26 70 43 75 72 29 20 29 20 72 65 74  nt*)&pCur) ) ret
5d40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5d50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5d60: 65 65 46 69 72 73 74 28 70 43 75 72 2c 20 26 72  eeFirst(pCur, &r
5d70: 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  es);.  if( rc ){
5d80: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5d90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
5da0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
5db0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
5dc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 70 72  ERROR;.  }.  spr
5dd0: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 72  intf(zBuf,"%d",r
5de0: 65 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  es);.  Tcl_Appen
5df0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5e00: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
5e10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5e20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
5e30: 62 74 72 65 65 5f 6c 61 73 74 20 49 44 0a 2a 2a  btree_last ID.**
5e40: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
5e50: 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
5e60: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
5e70: 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  le.  Return 0 if
5e80: 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77   the.** cursor w
5e90: 61 73 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  as left point to
5ea0: 20 73 6f 6d 65 74 68 69 6e 67 20 61 6e 64 20 31   something and 1
5eb0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
5ec0: 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74 69   empty..*/.stati
5ed0: 63 20 69 6e 74 20 62 74 72 65 65 5f 6c 61 73 74  c int btree_last
5ee0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
5ef0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
5f00: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
5f10: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
5f20: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
5f30: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
5f40: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
5f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5f60: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5f70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5f80: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
5f90: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
5fa0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
5fb0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
5fc0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65 73  nt rc;.  int res
5fd0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
5fe0: 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 61  f[100];..  if( a
5ff0: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
6000: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6010: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
6020: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
6030: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
6040: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
6050: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
6060: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
6070: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
6080: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69  erp, argv[1], (i
6090: 6e 74 2a 29 26 70 43 75 72 29 20 29 20 72 65 74  nt*)&pCur) ) ret
60a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
60b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
60c0: 65 65 4c 61 73 74 28 70 43 75 72 2c 20 26 72 65  eeLast(pCur, &re
60d0: 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  s);.  if( rc ){.
60e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
60f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
6100: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
6110: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6120: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 70 72 69  RROR;.  }.  spri
6130: 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 72 65  ntf(zBuf,"%d",re
6140: 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  s);.  Tcl_Append
6150: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
6160: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
6170: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6180: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
6190: 74 72 65 65 5f 65 6f 66 20 49 44 0a 2a 2a 0a 2a  tree_eof ID.**.*
61a0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
61b0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
61c0: 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
61d0: 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74  g at a valid ent
61e0: 72 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ry..** Return FA
61f0: 4c 53 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  LSE if the curso
6200: 72 20 64 6f 65 73 20 70 6f 69 6e 74 20 74 6f 20  r does point to 
6210: 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 0a 2a  a valid entry..*
6220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6230: 65 65 5f 65 6f 66 28 0a 20 20 76 6f 69 64 20 2a  ee_eof(.  void *
6240: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6250: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6260: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6270: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6280: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6290: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
62a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
62b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
62c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
62d0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
62e0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
62f0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
6300: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
6310: 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  r;.  char zBuf[5
6320: 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
6330: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
6340: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6350: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
6360: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
6370: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
6380: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
6390: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
63a0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
63b0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
63c0: 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29   argv[1], (int*)
63d0: 26 70 43 75 72 29 20 29 20 72 65 74 75 72 6e 20  &pCur) ) return 
63e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72  TCL_ERROR;.  spr
63f0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
6400: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
6410: 28 70 43 75 72 29 29 3b 0a 20 20 54 63 6c 5f 41  (pCur));.  Tcl_A
6420: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6430: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
6440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
6460: 3a 20 20 20 62 74 72 65 65 5f 6b 65 79 73 69 7a  :   btree_keysiz
6470: 65 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  e ID.**.** Retur
6480: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6490: 62 79 74 65 73 20 6f 66 20 6b 65 79 2e 20 20 46  bytes of key.  F
64a0: 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
64b0: 6c 65 2c 20 74 68 69 73 0a 2a 2a 20 72 65 74 75  le, this.** retu
64c0: 72 6e 73 20 74 68 65 20 6b 65 79 20 69 74 73 65  rns the key itse
64d0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lf..*/.static in
64e0: 74 20 62 74 72 65 65 5f 6b 65 79 73 69 7a 65 28  t btree_keysize(
64f0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
6500: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
6510: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
6520: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
6530: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
6540: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
6550: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
6560: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6570: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
6580: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6590: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
65a0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
65b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ent */.){.  BtCu
65c0: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 75 36  rsor *pCur;.  u6
65d0: 34 20 6e 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  4 n;.  char zBuf
65e0: 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67  [50];..  if( arg
65f0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
6600: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6610: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6620: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6630: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
6640: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
6650: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6660: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
6670: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
6680: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74  p, argv[1], (int
6690: 2a 29 26 70 43 75 72 29 20 29 20 72 65 74 75 72  *)&pCur) ) retur
66a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
66b0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
66c0: 7a 65 28 70 43 75 72 2c 20 26 6e 29 3b 0a 20 20  ze(pCur, &n);.  
66d0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
66e0: 6c 6c 75 22 2c 20 6e 29 3b 0a 20 20 54 63 6c 5f  llu", n);.  Tcl_
66f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6700: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
6710: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6720: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
6730: 65 3a 20 20 20 62 74 72 65 65 5f 6b 65 79 20 49  e:   btree_key I
6740: 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  D.**.** Return t
6750: 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 65  he key for the e
6760: 6e 74 72 79 20 61 74 20 77 68 69 63 68 20 74 68  ntry at which th
6770: 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
6780: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
6790: 69 6e 74 20 62 74 72 65 65 5f 6b 65 79 28 0a 20  int btree_key(. 
67a0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
67b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
67c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
67d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
67e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
67f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
6800: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
6810: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6820: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
6830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
6840: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
6850: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
6860: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  t */.){.  BtCurs
6870: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
6880: 72 63 3b 0a 20 20 75 36 34 20 6e 3b 0a 20 20 63  rc;.  u64 n;.  c
6890: 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66  har *zBuf;..  if
68a0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
68b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
68c0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
68d0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
68e0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
68f0: 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c  .       " ID\"",
6900: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
6910: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
6920: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
6930: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
6940: 20 28 69 6e 74 2a 29 26 70 43 75 72 29 20 29 20   (int*)&pCur) ) 
6950: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6960: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
6970: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
6980: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
6990: 42 74 72 65 65 46 6c 61 67 73 28 70 43 75 72 29  BtreeFlags(pCur)
69a0: 20 26 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20   & BTREE_INTKEY 
69b0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
69c0: 32 5b 36 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  2[60];.    sprin
69d0: 74 66 28 7a 42 75 66 32 2c 20 22 25 6c 6c 75 22  tf(zBuf2, "%llu"
69e0: 2c 20 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  , n);.    Tcl_Ap
69f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6a00: 70 2c 20 7a 42 75 66 32 2c 20 30 29 3b 0a 20 20  p, zBuf2, 0);.  
6a10: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 42 75 66 20  }else{.    zBuf 
6a20: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b  = malloc( n+1 );
6a30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6a40: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
6a50: 30 2c 20 6e 2c 20 7a 42 75 66 29 3b 0a 20 20 20  0, n, zBuf);.   
6a60: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
6a70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6a80: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
6a90: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
6aa0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
6ab0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ROR;.    }.    z
6ac0: 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[n] = 0;.    
6ad0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6ae0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
6af0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 42 75 66  );.    free(zBuf
6b00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6b10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6b20: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
6b30: 65 65 5f 64 61 74 61 20 49 44 0a 2a 2a 0a 2a 2a  ee_data ID.**.**
6b40: 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
6b50: 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 61   for the entry a
6b60: 74 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  t which the curs
6b70: 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a  or is pointing..
6b80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6b90: 72 65 65 5f 64 61 74 61 28 0a 20 20 76 6f 69 64  ree_data(.  void
6ba0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
6bb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6bc0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
6bd0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
6be0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
6bf0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
6c00: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
6c10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
6c20: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
6c30: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
6c40: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
6c50: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
6c60: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
6c70: 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Cur;.  int rc;. 
6c80: 20 75 33 32 20 6e 3b 0a 20 20 63 68 61 72 20 2a   u32 n;.  char *
6c90: 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 61 72 67  zBuf;..  if( arg
6ca0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
6cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6cc0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6cd0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6ce0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
6cf0: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
6d00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
6d10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
6d20: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
6d30: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74  p, argv[1], (int
6d40: 2a 29 26 70 43 75 72 29 20 29 20 72 65 74 75 72  *)&pCur) ) retur
6d50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
6d60: 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
6d70: 69 7a 65 28 70 43 75 72 2c 20 26 6e 29 3b 0a 20  ize(pCur, &n);. 
6d80: 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 20   zBuf = malloc( 
6d90: 6e 2b 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  n+1 );.  rc = sq
6da0: 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 70  lite3BtreeData(p
6db0: 43 75 72 2c 20 30 2c 20 6e 2c 20 7a 42 75 66 29  Cur, 0, n, zBuf)
6dc0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
6dd0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6de0: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
6df0: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
6e00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
6e10: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6e  OR;.  }.  zBuf[n
6e20: 5d 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 41 70 70  ] = 0;.  Tcl_App
6e30: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6e40: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 66 72  , zBuf, 0);.  fr
6e50: 65 65 28 7a 42 75 66 29 3b 0a 20 20 72 65 74 75  ee(zBuf);.  retu
6e60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6e70: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
6e80: 62 74 72 65 65 5f 66 65 74 63 68 5f 6b 65 79 20  btree_fetch_key 
6e90: 49 44 20 41 4d 54 0a 2a 2a 0a 2a 2a 20 55 73 65  ID AMT.**.** Use
6ea0: 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
6eb0: 65 4b 65 79 46 65 74 63 68 28 29 20 72 6f 75 74  eKeyFetch() rout
6ec0: 69 6e 65 20 74 6f 20 67 65 74 20 41 4d 54 20 62  ine to get AMT b
6ed0: 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 2e  ytes of the key.
6ee0: 0a 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74  .** If sqlite3Bt
6ef0: 72 65 65 4b 65 79 46 65 74 63 68 28 29 20 66 61  reeKeyFetch() fa
6f00: 69 6c 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ils, return an e
6f10: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  mpty string..*/.
6f20: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6f30: 5f 66 65 74 63 68 5f 6b 65 79 28 0a 20 20 76 6f  _fetch_key(.  vo
6f40: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
6f50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6f60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
6f70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
6f80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
6f90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
6fa0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
6fb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6fc0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
6fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
6fe0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
6ff0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
7000: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
7010: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 6e 3b 0a  *pCur;.  int n;.
7020: 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 75 36 34    int amt;.  u64
7030: 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e 73 74 20 63   nKey;.  const c
7040: 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 63 68 61  har *zBuf;.  cha
7050: 72 20 7a 53 74 61 74 69 63 5b 31 30 30 30 5d 3b  r zStatic[1000];
7060: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ..  if( argc!=3 
7070: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7080: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7090: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
70a0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
70b0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
70c0: 49 44 20 41 4d 54 5c 22 22 2c 20 30 29 3b 0a 20  ID AMT\"", 0);. 
70d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
70e0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
70f0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
7100: 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a  , argv[1], (int*
7110: 29 26 70 43 75 72 29 20 29 20 72 65 74 75 72 6e  )&pCur) ) return
7120: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
7130: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
7140: 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6e  erp, argv[2], &n
7150: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7160: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 42  RROR;.  sqlite3B
7170: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
7180: 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 7a 42 75 66  , &nKey);.  zBuf
7190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
71a0: 65 79 46 65 74 63 68 28 70 43 75 72 2c 20 26 61  eyFetch(pCur, &a
71b0: 6d 74 29 3b 0a 20 20 69 66 28 20 7a 42 75 66 20  mt);.  if( zBuf 
71c0: 26 26 20 61 6d 74 3e 3d 6e 20 29 7b 0a 20 20 20  && amt>=n ){.   
71d0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 73 69   assert( nKey<si
71e0: 7a 65 6f 66 28 7a 53 74 61 74 69 63 29 20 29 3b  zeof(zStatic) );
71f0: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29 20 6e  .    if( n>0 ) n
7200: 4b 65 79 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d  Key = n;.    mem
7210: 63 70 79 28 7a 53 74 61 74 69 63 2c 20 7a 42 75  cpy(zStatic, zBu
7220: 66 2c 20 28 69 6e 74 29 6e 4b 65 79 29 3b 20 0a  f, (int)nKey); .
7230: 20 20 20 20 7a 53 74 61 74 69 63 5b 6e 4b 65 79      zStatic[nKey
7240: 5d 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 41  ] = 0;.    Tcl_A
7250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7260: 72 70 2c 20 7a 53 74 61 74 69 63 2c 20 30 29 3b  rp, zStatic, 0);
7270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
7280: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
7290: 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 66 65  sage:   btree_fe
72a0: 74 63 68 5f 64 61 74 61 20 49 44 20 41 4d 54 0a  tch_data ID AMT.
72b0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
72c0: 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
72d0: 74 63 68 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  tch() routine to
72e0: 20 67 65 74 20 41 4d 54 20 62 79 74 65 73 20 6f   get AMT bytes o
72f0: 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 20 49 66  f the key..** If
7300: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
7310: 61 46 65 74 63 68 28 29 20 66 61 69 6c 73 2c 20  aFetch() fails, 
7320: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
7330: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
7340: 63 20 69 6e 74 20 62 74 72 65 65 5f 66 65 74 63  c int btree_fetc
7350: 68 5f 64 61 74 61 28 0a 20 20 76 6f 69 64 20 2a  h_data(.  void *
7360: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
7370: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
7380: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
7390: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
73a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
73b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
73c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
73d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
73e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
73f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
7400: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
7410: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
7420: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
7430: 72 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  r;.  int n;.  in
7440: 74 20 61 6d 74 3b 0a 20 20 75 33 32 20 6e 44 61  t amt;.  u32 nDa
7450: 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
7460: 20 2a 7a 42 75 66 3b 0a 20 20 63 68 61 72 20 7a   *zBuf;.  char z
7470: 53 74 61 74 69 63 5b 31 30 30 30 5d 3b 0a 0a 20  Static[1000];.. 
7480: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
7490: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
74a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
74b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
74c0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
74d0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 20  0],.       " ID 
74e0: 41 4d 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AMT\"", 0);.    
74f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
7510: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
7520: 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70  rgv[1], (int*)&p
7530: 43 75 72 29 20 29 20 72 65 74 75 72 6e 20 54 43  Cur) ) return TC
7540: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
7550: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
7560: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6e 29 20 29  , argv[2], &n) )
7570: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7580: 52 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  R;.  sqlite3Btre
7590: 65 44 61 74 61 53 69 7a 65 28 70 43 75 72 2c 20  eDataSize(pCur, 
75a0: 26 6e 44 61 74 61 29 3b 0a 20 20 7a 42 75 66 20  &nData);.  zBuf 
75b0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  = sqlite3BtreeDa
75c0: 74 61 46 65 74 63 68 28 70 43 75 72 2c 20 26 61  taFetch(pCur, &a
75d0: 6d 74 29 3b 0a 20 20 69 66 28 20 7a 42 75 66 20  mt);.  if( zBuf 
75e0: 26 26 20 61 6d 74 3e 3d 6e 20 29 7b 0a 20 20 20  && amt>=n ){.   
75f0: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3c 73   assert( nData<s
7600: 69 7a 65 6f 66 28 7a 53 74 61 74 69 63 29 20 29  izeof(zStatic) )
7610: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29 20  ;.    if( n>0 ) 
7620: 6e 44 61 74 61 20 3d 20 6e 3b 0a 20 20 20 20 6d  nData = n;.    m
7630: 65 6d 63 70 79 28 7a 53 74 61 74 69 63 2c 20 7a  emcpy(zStatic, z
7640: 42 75 66 2c 20 28 69 6e 74 29 6e 44 61 74 61 29  Buf, (int)nData)
7650: 3b 20 0a 20 20 20 20 7a 53 74 61 74 69 63 5b 6e  ; .    zStatic[n
7660: 44 61 74 61 5d 20 3d 20 30 3b 0a 20 20 20 20 54  Data] = 0;.    T
7670: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7680: 69 6e 74 65 72 70 2c 20 7a 53 74 61 74 69 63 2c  interp, zStatic,
7690: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
76a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
76b0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65  ** Usage:   btre
76c0: 65 5f 70 61 79 6c 6f 61 64 5f 73 69 7a 65 20 49  e_payload_size I
76d0: 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  D.**.** Return t
76e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
76f0: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 0a 2a 2f  es of payload.*/
7700: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7710: 65 5f 70 61 79 6c 6f 61 64 5f 73 69 7a 65 28 0a  e_payload_size(.
7720: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
7730: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7740: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
7750: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
7760: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
7770: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
7780: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
7790: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
77a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
77b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
77c0: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
77d0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
77e0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72  nt */.){.  BtCur
77f0: 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
7800: 20 6e 32 3b 0a 20 20 75 36 34 20 6e 31 3b 0a 20   n2;.  u64 n1;. 
7810: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
7820: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
7830: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7840: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7850: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
7860: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
7870: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49  v[0],.       " I
7880: 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  D\"", 0);.    re
7890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
78a0: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
78b0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
78c0: 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 43 75  v[1], (int*)&pCu
78d0: 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  r) ) return TCL_
78e0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 71 6c  ERROR;.  if( sql
78f0: 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 70  ite3BtreeFlags(p
7900: 43 75 72 29 20 26 20 42 54 52 45 45 5f 49 4e 54  Cur) & BTREE_INT
7910: 4b 45 59 20 29 7b 0a 20 20 20 20 6e 31 20 3d 20  KEY ){.    n1 = 
7920: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
7930: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
7940: 69 7a 65 28 70 43 75 72 2c 20 26 6e 31 29 3b 0a  ize(pCur, &n1);.
7950: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
7960: 65 65 44 61 74 61 53 69 7a 65 28 70 43 75 72 2c  eeDataSize(pCur,
7970: 20 26 6e 32 29 3b 0a 20 20 73 70 72 69 6e 74 66   &n2);.  sprintf
7980: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 28 69 6e  (zBuf, "%d", (in
7990: 74 29 28 6e 31 2b 6e 32 29 29 3b 0a 20 20 54 63  t)(n1+n2));.  Tc
79a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
79b0: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
79c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
79d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
79e0: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 63 75 72  age:   btree_cur
79f0: 73 6f 72 5f 69 6e 66 6f 20 49 44 0a 2a 2a 0a 2a  sor_info ID.**.*
7a00: 2a 20 52 65 74 75 72 6e 20 65 69 67 68 74 20 69  * Return eight i
7a10: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 69  ntegers containi
7a20: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
7a30: 62 6f 75 74 20 74 68 65 20 65 6e 74 72 79 20 74  bout the entry t
7a40: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20  he.** cursor is 
7a50: 70 6f 69 6e 74 69 6e 67 20 74 6f 3a 0a 2a 2a 0a  pointing to:.**.
7a60: 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 30 5d 20  **   aResult[0] 
7a70: 3d 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  =  The page numb
7a80: 65 72 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b  er.**   aResult[
7a90: 31 5d 20 3d 20 20 54 68 65 20 65 6e 74 72 79 20  1] =  The entry 
7aa0: 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 61 52 65 73  number.**   aRes
7ab0: 75 6c 74 5b 32 5d 20 3d 20 20 54 6f 74 61 6c 20  ult[2] =  Total 
7ac0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
7ad0: 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 0a 2a  s on this page.*
7ae0: 2a 20 20 20 61 52 65 73 75 6c 74 5b 33 5d 20 3d  *   aResult[3] =
7af0: 20 20 53 69 7a 65 20 6f 66 20 74 68 69 73 20 65    Size of this e
7b00: 6e 74 72 79 0a 2a 2a 20 20 20 61 52 65 73 75 6c  ntry.**   aResul
7b10: 74 5b 34 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f  t[4] =  Number o
7b20: 66 20 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20  f free bytes on 
7b30: 74 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61  this page.**   a
7b40: 52 65 73 75 6c 74 5b 35 5d 20 3d 20 20 4e 75 6d  Result[5] =  Num
7b50: 62 65 72 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  ber of free bloc
7b60: 6b 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ks on the page.*
7b70: 2a 20 20 20 61 52 65 73 75 6c 74 5b 36 5d 20 3d  *   aResult[6] =
7b80: 20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66    Page number of
7b90: 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20   the left child 
7ba0: 6f 66 20 74 68 69 73 20 65 6e 74 72 79 0a 2a 2a  of this entry.**
7bb0: 20 20 20 61 52 65 73 75 6c 74 5b 37 5d 20 3d 20     aResult[7] = 
7bc0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
7bd0: 74 68 65 20 72 69 67 68 74 20 63 68 69 6c 64 20  the right child 
7be0: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 70 61  for the whole pa
7bf0: 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
7c00: 20 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 69 6e   btree_cursor_in
7c10: 66 6f 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  fo(.  void *NotU
7c20: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
7c30: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
7c40: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
7c50: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
7c60: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
7c70: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7c90: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
7ca0: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
7cb0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a  r **argv      /*
7cc0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
7cd0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42  gument */.){.  B
7ce0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
7cf0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
7d00: 2c 20 6a 3b 0a 20 20 69 6e 74 20 61 52 65 73 75  , j;.  int aResu
7d10: 6c 74 5b 38 5d 3b 0a 20 20 63 68 61 72 20 7a 42  lt[8];.  char zB
7d20: 75 66 5b 34 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[400];..  if( 
7d30: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
7d40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7d50: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
7d60: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
7d70: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
7d80: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30        " ID\"", 0
7d90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
7da0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
7db0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
7dc0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28  terp, argv[1], (
7dd0: 69 6e 74 2a 29 26 70 43 75 72 29 20 29 20 72 65  int*)&pCur) ) re
7de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7df0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
7e00: 72 65 65 43 75 72 73 6f 72 49 6e 66 6f 28 70 43  reeCursorInfo(pC
7e10: 75 72 2c 20 61 52 65 73 75 6c 74 29 3b 0a 20 20  ur, aResult);.  
7e20: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
7e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7e40: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
7e50: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
7e60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7e70: 20 20 7d 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66    }.  j = 0;.  f
7e80: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7e90: 28 61 52 65 73 75 6c 74 29 2f 73 69 7a 65 6f 66  (aResult)/sizeof
7ea0: 28 61 52 65 73 75 6c 74 5b 30 5d 29 3b 20 69 2b  (aResult[0]); i+
7eb0: 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  +){.    sprintf(
7ec0: 26 7a 42 75 66 5b 6a 5d 2c 22 20 25 64 22 2c 20  &zBuf[j]," %d", 
7ed0: 61 52 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20  aResult[i]);.   
7ee0: 20 6a 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 42   j += strlen(&zB
7ef0: 75 66 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  uf[j]);.  }.  Tc
7f00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7f10: 6e 74 65 72 70 2c 20 26 7a 42 75 66 5b 31 5d 2c  nterp, &zBuf[1],
7f20: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
7f30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7f40: 2a 20 54 68 65 20 63 6f 6d 6d 61 6e 64 20 69 73  * The command is
7f50: 20 70 72 6f 76 69 64 65 64 20 66 6f 72 20 74 68   provided for th
7f60: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 65 74  e purpose of set
7f70: 74 69 6e 67 20 62 72 65 61 6b 70 6f 69 6e 74 73  ting breakpoints
7f80: 2e 0a 2a 2a 20 69 6e 20 72 65 67 72 65 73 73 69  ..** in regressi
7f90: 6f 6e 20 74 65 73 74 20 73 63 72 69 70 74 73 2e  on test scripts.
7fa0: 0a 2a 2a 0a 2a 2a 20 42 79 20 73 65 74 74 69 6e  .**.** By settin
7fb0: 67 20 61 20 47 44 42 20 62 72 65 61 6b 70 6f 69  g a GDB breakpoi
7fc0: 6e 74 20 6f 6e 20 74 68 69 73 20 70 72 6f 63 65  nt on this proce
7fd0: 64 75 72 65 20 61 6e 64 20 65 78 65 63 75 74 69  dure and executi
7fe0: 6e 67 20 74 68 65 0a 2a 2a 20 62 74 72 65 65 5f  ng the.** btree_
7ff0: 62 72 65 61 6b 70 6f 69 6e 74 20 63 6f 6d 6d 61  breakpoint comma
8000: 6e 64 20 69 6e 20 61 20 74 65 73 74 20 73 63 72  nd in a test scr
8010: 69 70 74 2c 20 77 65 20 63 61 6e 20 73 74 6f 70  ipt, we can stop
8020: 20 47 44 42 20 61 74 0a 2a 2a 20 74 68 65 20 70   GDB at.** the p
8030: 6f 69 6e 74 20 69 6e 20 74 68 65 20 73 63 72 69  oint in the scri
8040: 70 74 20 77 68 65 72 65 20 74 68 65 20 62 74 72  pt where the btr
8050: 65 65 5f 62 72 65 61 6b 70 6f 69 6e 74 20 63 6f  ee_breakpoint co
8060: 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 73 65  mmand is.** inse
8070: 72 74 65 64 2e 20 20 54 68 69 73 20 69 73 20 75  rted.  This is u
8080: 73 65 66 75 6c 20 66 6f 72 20 64 65 62 75 67 67  seful for debugg
8090: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
80a0: 6e 74 20 62 74 72 65 65 5f 62 72 65 61 6b 70 6f  nt btree_breakpo
80b0: 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
80c0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
80d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
80e0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
80f0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
8100: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
8110: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
8120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8130: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8140: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
8150: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
8160: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
8170: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
8180: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8190: 0a 0a 2f 2a 0a 2a 2a 20 75 73 61 67 65 3a 20 20  ../*.** usage:  
81a0: 20 76 61 72 69 6e 74 5f 74 65 73 74 20 20 53 54   varint_test  ST
81b0: 41 52 54 20 20 4d 55 4c 54 49 50 4c 49 45 52 20  ART  MULTIPLIER 
81c0: 20 43 4f 55 4e 54 20 20 49 4e 43 52 45 4d 45 4e   COUNT  INCREMEN
81d0: 54 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  T.**.** This com
81e0: 6d 61 6e 64 20 74 65 73 74 73 20 74 68 65 20 73  mand tests the s
81f0: 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28  qlite3PutVarint(
8200: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
8210: 56 61 72 69 6e 74 28 29 0a 2a 2a 20 72 6f 75 74  Varint().** rout
8220: 69 6e 65 73 2c 20 62 6f 74 68 20 66 6f 72 20 61  ines, both for a
8230: 63 63 75 72 61 63 79 20 61 6e 64 20 66 6f 72 20  ccuracy and for 
8240: 73 70 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  speed..**.** An 
8250: 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
8260: 65 6e 20 75 73 69 6e 67 20 50 75 74 56 61 72 69  en using PutVari
8270: 6e 74 28 29 20 61 6e 64 20 72 65 61 64 20 62 61  nt() and read ba
8280: 63 6b 20 77 69 74 68 0a 2a 2a 20 47 65 74 56 61  ck with.** GetVa
8290: 72 69 6e 74 28 29 20 61 6e 64 20 76 61 72 69 66  rint() and varif
82a0: 69 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e  ied to be unchan
82b0: 67 65 64 2e 20 20 54 68 69 73 20 72 65 70 65 61  ged.  This repea
82c0: 74 73 20 43 4f 55 4e 54 0a 2a 2a 20 74 69 6d 65  ts COUNT.** time
82d0: 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  s.  The first in
82e0: 74 65 67 65 72 20 69 73 20 53 54 41 52 54 2a 4d  teger is START*M
82f0: 55 4c 54 49 50 4c 49 45 52 2e 20 20 45 61 63 68  ULTIPLIER.  Each
8300: 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e   iteration.** in
8310: 63 72 65 61 73 65 73 20 74 68 65 20 69 6e 74 65  creases the inte
8320: 67 65 72 20 62 79 20 49 4e 43 52 45 4d 45 4e 54  ger by INCREMENT
8330: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d  ..**.** This com
8340: 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 6e 6f 74  mand returns not
8350: 68 69 6e 67 20 69 66 20 69 74 20 77 6f 72 6b 73  hing if it works
8360: 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 6e  .  It returns an
8370: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
8380: 2a 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  * if something g
8390: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
83a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 76  atic int btree_v
83b0: 61 72 69 6e 74 5f 74 65 73 74 28 0a 20 20 76 6f  arint_test(.  vo
83c0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
83d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
83e0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
83f0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8400: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8410: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8420: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8430: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8440: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8450: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
8460: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8470: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8480: 2f 0a 29 7b 0a 20 20 75 33 32 20 73 74 61 72 74  /.){.  u32 start
8490: 2c 20 6d 75 6c 74 2c 20 63 6f 75 6e 74 2c 20 69  , mult, count, i
84a0: 6e 63 72 3b 0a 20 20 75 36 34 20 69 6e 2c 20 6f  ncr;.  u64 in, o
84b0: 75 74 3b 0a 20 20 69 6e 74 20 6e 31 2c 20 6e 32  ut;.  int n1, n2
84c0: 2c 20 69 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e  , i, j;.  unsign
84d0: 65 64 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  ed char zBuf[100
84e0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  ];.  if( argc!=5
84f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8500: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8510: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8520: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8530: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8540: 20 53 54 41 52 54 20 4d 55 4c 54 49 50 4c 49 45   START MULTIPLIE
8550: 52 20 43 4f 55 4e 54 20 49 4e 43 52 45 4d 45 4e  R COUNT INCREMEN
8560: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
8570: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8580: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
8590: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
85a0: 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 73 74 61  v[1], (int*)&sta
85b0: 72 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rt) ) return TCL
85c0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
85d0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
85e0: 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29   argv[2], (int*)
85f0: 26 6d 75 6c 74 29 20 29 20 72 65 74 75 72 6e 20  &mult) ) return 
8600: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
8610: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
8620: 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20 28 69 6e  rp, argv[3], (in
8630: 74 2a 29 26 63 6f 75 6e 74 29 20 29 20 72 65 74  t*)&count) ) ret
8640: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8650: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
8660: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c  interp, argv[4],
8670: 20 28 69 6e 74 2a 29 26 69 6e 63 72 29 20 29 20   (int*)&incr) ) 
8680: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8690: 3b 0a 20 20 69 6e 20 3d 20 73 74 61 72 74 3b 0a  ;.  in = start;.
86a0: 20 20 69 6e 20 2a 3d 20 6d 75 6c 74 3b 0a 20 20    in *= mult;.  
86b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74  for(i=0; i<count
86c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
86d0: 20 7a 45 72 72 5b 32 30 30 5d 3b 0a 20 20 20 20   zErr[200];.    
86e0: 6e 31 20 3d 20 73 71 6c 69 74 65 33 50 75 74 56  n1 = sqlite3PutV
86f0: 61 72 69 6e 74 28 7a 42 75 66 2c 20 69 6e 29 3b  arint(zBuf, in);
8700: 0a 20 20 20 20 69 66 28 20 6e 31 3e 39 20 7c 7c  .    if( n1>9 ||
8710: 20 6e 31 3c 31 20 29 7b 0a 20 20 20 20 20 20 73   n1<1 ){.      s
8720: 70 72 69 6e 74 66 28 7a 45 72 72 2c 20 22 50 75  printf(zErr, "Pu
8730: 74 56 61 72 69 6e 74 20 72 65 74 75 72 6e 65 64  tVarint returned
8740: 20 25 64 20 2d 20 73 68 6f 75 6c 64 20 62 65 20   %d - should be 
8750: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 22  between 1 and 9"
8760: 2c 20 6e 31 29 3b 0a 20 20 20 20 20 20 54 63 6c  , n1);.      Tcl
8770: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8780: 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a  terp, zErr, 0);.
8790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
87a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
87b0: 20 20 6e 32 20 3d 20 73 71 6c 69 74 65 33 47 65    n2 = sqlite3Ge
87c0: 74 56 61 72 69 6e 74 28 7a 42 75 66 2c 20 26 6f  tVarint(zBuf, &o
87d0: 75 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 31 21  ut);.    if( n1!
87e0: 3d 6e 32 20 29 7b 0a 20 20 20 20 20 20 73 70 72  =n2 ){.      spr
87f0: 69 6e 74 66 28 7a 45 72 72 2c 20 22 50 75 74 56  intf(zErr, "PutV
8800: 61 72 69 6e 74 20 72 65 74 75 72 6e 65 64 20 25  arint returned %
8810: 64 20 61 6e 64 20 47 65 74 56 61 72 69 6e 74 20  d and GetVarint 
8820: 72 65 74 75 72 6e 65 64 20 25 64 22 2c 20 6e 31  returned %d", n1
8830: 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20 54 63 6c  , n2);.      Tcl
8840: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8850: 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29 3b 0a  terp, zErr, 0);.
8860: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
8870: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
8880: 20 20 69 66 28 20 69 6e 21 3d 6f 75 74 20 29 7b    if( in!=out ){
8890: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
88a0: 45 72 72 2c 20 22 57 72 6f 74 65 20 30 78 25 30  Err, "Wrote 0x%0
88b0: 31 36 6c 6c 78 20 61 6e 64 20 67 6f 74 20 62 61  16llx and got ba
88c0: 63 6b 20 30 78 25 30 31 36 6c 6c 78 22 2c 20 69  ck 0x%016llx", i
88d0: 6e 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 54  n, out);.      T
88e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
88f0: 69 6e 74 65 72 70 2c 20 7a 45 72 72 2c 20 30 29  interp, zErr, 0)
8900: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
8910: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8920: 0a 20 20 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72  .    /* In order
8930: 20 74 6f 20 67 65 74 20 72 65 61 6c 69 73 74 69   to get realisti
8940: 63 20 74 69 6d 69 6e 67 73 2c 20 72 75 6e 20 67  c timings, run g
8950: 65 74 56 61 72 69 6e 74 20 31 39 20 6d 6f 72 65  etVarint 19 more
8960: 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54   times..    ** T
8970: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 67  his is because g
8980: 65 74 56 61 72 69 6e 74 20 69 73 20 63 61 6c 6c  etVarint is call
8990: 65 64 20 61 62 6f 75 74 20 32 30 20 74 69 6d 65  ed about 20 time
89a0: 73 20 6d 6f 72 65 20 6f 66 74 65 6e 0a 20 20 20  s more often.   
89b0: 20 2a 2a 20 74 68 61 6e 20 70 75 74 56 61 72 69   ** than putVari
89c0: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nt..    */.    f
89d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 31 39 3b 20 6a 2b  or(j=0; j<19; j+
89e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
89f0: 33 47 65 74 56 61 72 69 6e 74 28 7a 42 75 66 2c  3GetVarint(zBuf,
8a00: 20 26 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20   &out);.    }.  
8a10: 20 20 69 6e 20 2b 3d 20 69 6e 63 72 3b 0a 20 20    in += incr;.  
8a20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
8a30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
8a40: 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
8a50: 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
8a60: 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
8a70: 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28  qlitetest3_Init(
8a80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8a90: 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  rp){.  extern in
8aa0: 74 20 73 71 6c 69 74 65 33 5f 62 74 72 65 65 5f  t sqlite3_btree_
8ab0: 74 72 61 63 65 3b 0a 20 20 73 74 61 74 69 63 20  trace;.  static 
8ac0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
8ad0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
8ae0: 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
8af0: 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
8b00: 20 7b 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65   {.     { "btree
8b10: 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  _open",         
8b20: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
8b30: 6f 63 2a 29 62 74 72 65 65 5f 6f 70 65 6e 20 20  oc*)btree_open  
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8b50: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63 6c       { "btree_cl
8b60: 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
8b70: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
8b80: 29 62 74 72 65 65 5f 63 6c 6f 73 65 20 20 20 20  )btree_close    
8b90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8ba0: 20 20 7b 20 22 62 74 72 65 65 5f 62 65 67 69 6e    { "btree_begin
8bb0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 20  _transaction",  
8bc0: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
8bd0: 72 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  ree_begin_transa
8be0: 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b  ction  },.     {
8bf0: 20 22 62 74 72 65 65 5f 63 6f 6d 6d 69 74 22 2c   "btree_commit",
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
8c10: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
8c20: 5f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  _commit         
8c30: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
8c40: 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b 22 2c 20  tree_rollback", 
8c50: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
8c60: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 72 6f  mdProc*)btree_ro
8c70: 6c 6c 62 61 63 6b 20 20 20 20 20 20 20 20 20 20  llback          
8c80: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
8c90: 65 5f 63 72 65 61 74 65 5f 74 61 62 6c 65 22 2c  e_create_table",
8ca0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
8cb0: 72 6f 63 2a 29 62 74 72 65 65 5f 63 72 65 61 74  roc*)btree_creat
8cc0: 65 5f 74 61 62 6c 65 20 20 20 20 20 20 20 7d 2c  e_table       },
8cd0: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 64  .     { "btree_d
8ce0: 72 6f 70 5f 74 61 62 6c 65 22 2c 20 20 20 20 20  rop_table",     
8cf0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
8d00: 2a 29 62 74 72 65 65 5f 64 72 6f 70 5f 74 61 62  *)btree_drop_tab
8d10: 6c 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  le         },.  
8d20: 20 20 20 7b 20 22 62 74 72 65 65 5f 63 6c 65 61     { "btree_clea
8d30: 72 5f 74 61 62 6c 65 22 2c 20 20 20 20 20 20 20  r_table",       
8d40: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
8d50: 74 72 65 65 5f 63 6c 65 61 72 5f 74 61 62 6c 65  tree_clear_table
8d60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
8d70: 7b 20 22 62 74 72 65 65 5f 67 65 74 5f 6d 65 74  { "btree_get_met
8d80: 61 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  a",           (T
8d90: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
8da0: 65 5f 67 65 74 5f 6d 65 74 61 20 20 20 20 20 20  e_get_meta      
8db0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
8dc0: 62 74 72 65 65 5f 75 70 64 61 74 65 5f 6d 65 74  btree_update_met
8dd0: 61 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  a",        (Tcl_
8de0: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 75  CmdProc*)btree_u
8df0: 70 64 61 74 65 5f 6d 65 74 61 20 20 20 20 20 20  pdate_meta      
8e00: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
8e10: 65 65 5f 70 61 67 65 5f 64 75 6d 70 22 2c 20 20  ee_page_dump",  
8e20: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
8e30: 50 72 6f 63 2a 29 62 74 72 65 65 5f 70 61 67 65  Proc*)btree_page
8e40: 5f 64 75 6d 70 20 20 20 20 20 20 20 20 20 20 7d  _dump          }
8e50: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
8e60: 74 72 65 65 5f 64 75 6d 70 22 2c 20 20 20 20 20  tree_dump",     
8e70: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
8e80: 63 2a 29 62 74 72 65 65 5f 74 72 65 65 5f 64 75  c*)btree_tree_du
8e90: 6d 70 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  mp          },. 
8ea0: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70 61 67      { "btree_pag
8eb0: 65 72 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20  er_stats",      
8ec0: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
8ed0: 62 74 72 65 65 5f 70 61 67 65 72 5f 73 74 61 74  btree_pager_stat
8ee0: 73 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  s        },.    
8ef0: 20 7b 20 22 62 74 72 65 65 5f 70 61 67 65 72 5f   { "btree_pager_
8f00: 72 65 66 5f 64 75 6d 70 22 2c 20 20 20 20 20 28  ref_dump",     (
8f10: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
8f20: 65 65 5f 70 61 67 65 72 5f 72 65 66 5f 64 75 6d  ee_pager_ref_dum
8f30: 70 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  p     },.     { 
8f40: 22 62 74 72 65 65 5f 63 75 72 73 6f 72 22 2c 20  "btree_cursor", 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
8f60: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
8f70: 63 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20  cursor          
8f80: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
8f90: 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72  ree_close_cursor
8fa0: 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
8fb0: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 6c 6f  dProc*)btree_clo
8fc0: 73 65 5f 63 75 72 73 6f 72 20 20 20 20 20 20 20  se_cursor       
8fd0: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
8fe0: 5f 6d 6f 76 65 5f 74 6f 22 2c 20 20 20 20 20 20  _move_to",      
8ff0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
9000: 6f 63 2a 29 62 74 72 65 65 5f 6d 6f 76 65 5f 74  oc*)btree_move_t
9010: 6f 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  o            },.
9020: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 64 65       { "btree_de
9030: 6c 65 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  lete",          
9040: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
9050: 29 62 74 72 65 65 5f 64 65 6c 65 74 65 20 20 20  )btree_delete   
9060: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9070: 20 20 7b 20 22 62 74 72 65 65 5f 69 6e 73 65 72    { "btree_inser
9080: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
9090: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
90a0: 72 65 65 5f 69 6e 73 65 72 74 20 20 20 20 20 20  ree_insert      
90b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
90c0: 20 22 62 74 72 65 65 5f 6e 65 78 74 22 2c 20 20   "btree_next",  
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
90e0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
90f0: 5f 6e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  _next           
9100: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
9110: 74 72 65 65 5f 70 72 65 76 22 2c 20 20 20 20 20  tree_prev",     
9120: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
9130: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 70 72  mdProc*)btree_pr
9140: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
9150: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
9160: 65 5f 65 6f 66 22 2c 20 20 20 20 20 20 20 20 20  e_eof",         
9170: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
9180: 72 6f 63 2a 29 62 74 72 65 65 5f 65 6f 66 20 20  roc*)btree_eof  
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
91a0: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 6b  .     { "btree_k
91b0: 65 79 73 69 7a 65 22 2c 20 20 20 20 20 20 20 20  eysize",        
91c0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
91d0: 2a 29 62 74 72 65 65 5f 6b 65 79 73 69 7a 65 20  *)btree_keysize 
91e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
91f0: 20 20 20 7b 20 22 62 74 72 65 65 5f 6b 65 79 22     { "btree_key"
9200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9210: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
9220: 74 72 65 65 5f 6b 65 79 20 20 20 20 20 20 20 20  tree_key        
9230: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
9240: 7b 20 22 62 74 72 65 65 5f 64 61 74 61 22 2c 20  { "btree_data", 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
9260: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
9270: 65 5f 64 61 74 61 20 20 20 20 20 20 20 20 20 20  e_data          
9280: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
9290: 62 74 72 65 65 5f 66 65 74 63 68 5f 6b 65 79 22  btree_fetch_key"
92a0: 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
92b0: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 66  CmdProc*)btree_f
92c0: 65 74 63 68 5f 6b 65 79 20 20 20 20 20 20 20 20  etch_key        
92d0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
92e0: 65 65 5f 66 65 74 63 68 5f 64 61 74 61 22 2c 20  ee_fetch_data", 
92f0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
9300: 50 72 6f 63 2a 29 62 74 72 65 65 5f 66 65 74 63  Proc*)btree_fetc
9310: 68 5f 64 61 74 61 20 20 20 20 20 20 20 20 20 7d  h_data         }
9320: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
9330: 70 61 79 6c 6f 61 64 5f 73 69 7a 65 22 2c 20 20  payload_size",  
9340: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
9350: 63 2a 29 62 74 72 65 65 5f 70 61 79 6c 6f 61 64  c*)btree_payload
9360: 5f 73 69 7a 65 20 20 20 20 20 20 20 7d 2c 0a 20  _size       },. 
9370: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 66 69 72      { "btree_fir
9380: 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  st",            
9390: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
93a0: 62 74 72 65 65 5f 66 69 72 73 74 20 20 20 20 20  btree_first     
93b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
93c0: 20 7b 20 22 62 74 72 65 65 5f 6c 61 73 74 22 2c   { "btree_last",
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
93e0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
93f0: 65 65 5f 6c 61 73 74 20 20 20 20 20 20 20 20 20  ee_last         
9400: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
9410: 22 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 69 6e  "btree_cursor_in
9420: 66 6f 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  fo",        (Tcl
9430: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
9440: 63 75 72 73 6f 72 5f 69 6e 66 6f 20 20 20 20 20  cursor_info     
9450: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
9460: 72 65 65 5f 63 75 72 73 6f 72 5f 6c 69 73 74 22  ree_cursor_list"
9470: 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
9480: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 75 72  dProc*)btree_cur
9490: 73 6f 72 5f 6c 69 73 74 20 20 20 20 20 20 20 20  sor_list        
94a0: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
94b0: 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  _integrity_check
94c0: 22 2c 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  ",    (Tcl_CmdPr
94d0: 6f 63 2a 29 62 74 72 65 65 5f 69 6e 74 65 67 72  oc*)btree_integr
94e0: 69 74 79 5f 63 68 65 63 6b 20 20 20 20 7d 2c 0a  ity_check    },.
94f0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 62 72       { "btree_br
9500: 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20  eakpoint",      
9510: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
9520: 29 62 74 72 65 65 5f 62 72 65 61 6b 70 6f 69 6e  )btree_breakpoin
9530: 74 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  t         },.   
9540: 20 20 7b 20 22 62 74 72 65 65 5f 76 61 72 69 6e    { "btree_varin
9550: 74 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  t_test",        
9560: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
9570: 72 65 65 5f 76 61 72 69 6e 74 5f 74 65 73 74 20  ree_varint_test 
9580: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
9590: 20 22 62 74 72 65 65 5f 62 65 67 69 6e 5f 73 74   "btree_begin_st
95a0: 61 74 65 6d 65 6e 74 22 2c 20 20 20 20 28 54 63  atement",    (Tc
95b0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
95c0: 5f 62 65 67 69 6e 5f 73 74 61 74 65 6d 65 6e 74  _begin_statement
95d0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
95e0: 74 72 65 65 5f 63 6f 6d 6d 69 74 5f 73 74 61 74  tree_commit_stat
95f0: 65 6d 65 6e 74 22 2c 20 20 20 28 54 63 6c 5f 43  ement",   (Tcl_C
9600: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 6f  mdProc*)btree_co
9610: 6d 6d 69 74 5f 73 74 61 74 65 6d 65 6e 74 20 20  mmit_statement  
9620: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
9630: 65 5f 72 6f 6c 6c 62 61 63 6b 5f 73 74 61 74 65  e_rollback_state
9640: 6d 65 6e 74 22 2c 20 28 54 63 6c 5f 43 6d 64 50  ment", (Tcl_CmdP
9650: 72 6f 63 2a 29 62 74 72 65 65 5f 72 6f 6c 6c 62  roc*)btree_rollb
9660: 61 63 6b 5f 73 74 61 74 65 6d 65 6e 74 20 7d 2c  ack_statement },
9670: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  .  };.  int i;..
9680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9690: 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66  eof(aCmd)/sizeof
96a0: 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  (aCmd[0]); i++){
96b0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43  .    Tcl_CreateC
96c0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
96d0: 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43  Cmd[i].zName, aC
96e0: 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20  md[i].xProc, 0, 
96f0: 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69  0);.  }.  Tcl_Li
9700: 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 70  nkVar(interp, "p
9710: 61 67 65 72 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ager_refinfo_ena
9720: 62 6c 65 22 2c 20 28 63 68 61 72 2a 29 26 70 61  ble", (char*)&pa
9730: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
9740: 62 6c 65 2c 0a 20 20 20 20 20 54 43 4c 5f 4c 49  ble,.     TCL_LI
9750: 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
9760: 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
9770: 62 74 72 65 65 5f 74 72 61 63 65 22 2c 20 28 63  btree_trace", (c
9780: 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 62 74  har*)&sqlite3_bt
9790: 72 65 65 5f 74 72 61 63 65 2c 0a 20 20 20 20 20  ree_trace,.     
97a0: 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
97b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
97c0: 7d 0a                                            }.