/ Hex Artifact Content
Login

Artifact c5a25235b6b2ada516550eb17b57f8dd002f6b41:


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 33 30 20 32 30 30 34 2f 30 35 2f 30 38 20 30  .30 2004/05/08 0
0240: 38 3a 32 33 3a 33 39 20 64 61 6e 69 65 6c 6b 31  8:23:39 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: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
0720: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
0730: 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22  "SQLITE_Unknown"
0740: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;     break;.  }
0750: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
0760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
0770: 20 20 20 62 74 72 65 65 5f 6f 70 65 6e 20 46 49     btree_open FI
0780: 4c 45 4e 41 4d 45 20 4e 43 41 43 48 45 20 46 4c  LENAME NCACHE FL
0790: 41 47 53 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  AGS.**.** Open a
07a0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 0a 2a 2f   new database.*/
07b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
07c0: 65 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a  e_open(.  void *
07d0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
07e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
07f0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
0800: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
0810: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
0820: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
0830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
0840: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
0850: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
0860: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
0870: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
0880: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
0890: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
08a0: 20 69 6e 74 20 72 63 2c 20 6e 43 61 63 68 65 2c   int rc, nCache,
08b0: 20 66 6c 61 67 73 3b 0a 20 20 63 68 61 72 20 7a   flags;.  char z
08c0: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20  Buf[100];.  if( 
08d0: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
08e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
08f0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
0900: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
0910: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
0920: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
0930: 20 4e 43 41 43 48 45 20 46 4c 41 47 53 5c 22 22   NCACHE FLAGS\""
0940: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
0950: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
0960: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
0970: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
0980: 2c 20 26 6e 43 61 63 68 65 29 20 29 20 72 65 74  , &nCache) ) ret
0990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
09a0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
09b0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 33 5d 2c  interp, argv[3],
09c0: 20 26 66 6c 61 67 73 29 20 29 20 72 65 74 75 72   &flags) ) retur
09d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
09e0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
09f0: 4f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20 26 70  Open(argv[1], &p
0a00: 42 74 2c 20 6e 43 61 63 68 65 2c 20 66 6c 61 67  Bt, nCache, flag
0a10: 73 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  s);.  if( rc!=SQ
0a20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
0a30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0a40: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
0a50: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
0a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0a70: 0a 20 20 7d 0a 20 20 73 70 72 69 6e 74 66 28 7a  .  }.  sprintf(z
0a80: 42 75 66 2c 22 25 70 22 2c 20 70 42 74 29 3b 0a  Buf,"%p", pBt);.
0a90: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 42    if( strncmp(zB
0aa0: 75 66 2c 22 30 78 22 2c 32 29 20 29 7b 0a 20 20  uf,"0x",2) ){.  
0ab0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
0ac0: 22 30 78 25 70 22 2c 20 70 42 74 29 3b 0a 20 20  "0x%p", pBt);.  
0ad0: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
0ae0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
0af0: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
0b00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
0b10: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
0b20: 63 6c 6f 73 65 20 49 44 0a 2a 2a 0a 2a 2a 20 43  close ID.**.** C
0b30: 6c 6f 73 65 20 74 68 65 20 67 69 76 65 6e 20 64  lose the given d
0b40: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
0b50: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 63 6c 6f  ic int btree_clo
0b60: 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  se(.  void *NotU
0b70: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
0b80: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
0b90: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0ba0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
0bb0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
0bc0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
0bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0be0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
0bf0: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
0c00: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a  r **argv      /*
0c10: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
0c20: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42  gument */.){.  B
0c30: 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74  tree *pBt;.  int
0c40: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
0c50: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
0c60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
0c70: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
0c80: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
0c90: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
0ca0: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
0cb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0cc0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
0cd0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
0ce0: 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29   argv[1], (int*)
0cf0: 26 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 54  &pBt) ) return T
0d00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
0d10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
0d20: 73 65 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72  se(pBt);.  if( r
0d30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
0d40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
0d50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
0d60: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
0d70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
0d80: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
0d90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0da0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
0db0: 65 65 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ee_begin_transac
0dc0: 74 69 6f 6e 20 49 44 0a 2a 2a 0a 2a 2a 20 53 74  tion ID.**.** St
0dd0: 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
0de0: 63 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ction.*/.static 
0df0: 69 6e 74 20 62 74 72 65 65 5f 62 65 67 69 6e 5f  int btree_begin_
0e00: 74 72 61 6e 73 61 63 74 69 6f 6e 28 0a 20 20 76  transaction(.  v
0e10: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
0e20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0e30: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
0e40: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
0e50: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
0e60: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
0e70: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
0e80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0e90: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
0ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
0eb0: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
0ec0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
0ed0: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
0ee0: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
0ef0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
0f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
0f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
0f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
0f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
0f40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22  ],.       " ID\"
0f50: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
0f60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
0f70: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
0f80: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
0f90: 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29  ], (int*)&pBt) )
0fa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
0fb0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
0fc0: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
0fd0: 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 21  (pBt);.  if( rc!
0fe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0ff0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1000: 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72  lt(interp, error
1010: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1020: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1030: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
1040: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1050: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
1060: 5f 72 6f 6c 6c 62 61 63 6b 20 49 44 0a 2a 2a 0a  _rollback ID.**.
1070: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 63 68 61 6e  ** Rollback chan
1080: 67 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ges.*/.static in
1090: 74 20 62 74 72 65 65 5f 72 6f 6c 6c 62 61 63 6b  t btree_rollback
10a0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
10b0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
10c0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
10d0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
10e0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
10f0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1100: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1120: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1130: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1140: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
1150: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1160: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72  ment */.){.  Btr
1170: 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 72  ee *pBt;.  int r
1180: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
1190: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
11a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11b0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
11c0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
11d0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
11e0: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
11f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1200: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
1210: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
1220: 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70  rgv[1], (int*)&p
1230: 42 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  Bt) ) return TCL
1240: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1250: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1260: 61 63 6b 28 70 42 74 29 3b 0a 20 20 69 66 28 20  ack(pBt);.  if( 
1270: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1280: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1290: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
12a0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
12b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
12d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
12e0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
12f0: 72 65 65 5f 63 6f 6d 6d 69 74 20 49 44 0a 2a 2a  ree_commit ID.**
1300: 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
1310: 68 61 6e 67 65 73 0a 2a 2f 0a 73 74 61 74 69 63  hanges.*/.static
1320: 20 69 6e 74 20 62 74 72 65 65 5f 63 6f 6d 6d 69   int btree_commi
1330: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
1340: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
1350: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1360: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1370: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1380: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1390: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
13a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13b0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
13c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
13e0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
13f0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
1400: 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20  ree *pBt;.  int 
1410: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
1420: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1430: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1440: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1450: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1460: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1470: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
1480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1490: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
14a0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
14b0: 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26  argv[1], (int*)&
14c0: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  pBt) ) return TC
14d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
14e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14f0: 69 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72  it(pBt);.  if( r
1500: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1510: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1520: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
1530: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1540: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1550: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1560: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1570: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72  .** Usage:   btr
1580: 65 65 5f 63 72 65 61 74 65 5f 74 61 62 6c 65 20  ee_create_table 
1590: 49 44 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 43  ID FLAGS.**.** C
15a0: 72 65 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c  reate a new tabl
15b0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
15c0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
15d0: 62 74 72 65 65 5f 63 72 65 61 74 65 5f 74 61 62  btree_create_tab
15e0: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  le(.  void *NotU
15f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
1600: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1610: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1620: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1630: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1640: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
1650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1660: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1670: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
1680: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a  r **argv      /*
1690: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
16a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42  gument */.){.  B
16b0: 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74  tree *pBt;.  int
16c0: 20 72 63 2c 20 69 54 61 62 6c 65 2c 20 66 6c 61   rc, iTable, fla
16d0: 67 73 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  gs;.  char zBuf[
16e0: 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21  30];.  if( argc!
16f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1700: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1710: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1720: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1730: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
1740: 20 22 20 49 44 20 46 4c 41 47 53 5c 22 22 2c 20   " ID FLAGS\"", 
1750: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1760: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1770: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
1780: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1790: 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65  (int*)&pBt) ) re
17a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17b0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17c0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
17d0: 2c 20 26 66 6c 61 67 73 29 20 29 20 72 65 74 75  , &flags) ) retu
17e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1800: 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 42 74  eCreateTable(pBt
1810: 2c 20 26 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , &iTable, flags
1820: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1830: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
1840: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1850: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
1860: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
1870: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1880: 20 20 7d 0a 20 20 73 70 72 69 6e 74 66 28 7a 42    }.  sprintf(zB
1890: 75 66 2c 20 22 25 64 22 2c 20 69 54 61 62 6c 65  uf, "%d", iTable
18a0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
18b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
18c0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
18d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18e0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
18f0: 5f 64 72 6f 70 5f 74 61 62 6c 65 20 49 44 20 54  _drop_table ID T
1900: 41 42 4c 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 44 65  ABLENUM.**.** De
1910: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 74  lete an entire t
1920: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 61  able from the da
1930: 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63  tabase.*/.static
1940: 20 69 6e 74 20 62 74 72 65 65 5f 64 72 6f 70 5f   int btree_drop_
1950: 74 61 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e  table(.  void *N
1960: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
1970: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1980: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1990: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
19a0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
19b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19d0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
19e0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
19f0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1a00: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
1a10: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
1a20: 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
1a30: 69 6e 74 20 69 54 61 62 6c 65 3b 0a 20 20 69 6e  int iTable;.  in
1a40: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
1a50: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1a60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a70: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a80: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a90: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
1aa0: 20 20 22 20 49 44 20 54 41 42 4c 45 4e 55 4d 5c    " ID TABLENUM\
1ab0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
1ac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ad0: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
1ae0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1af0: 31 5d 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20  1], (int*)&pBt) 
1b00: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b10: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1b20: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
1b30: 76 5b 32 5d 2c 20 26 69 54 61 62 6c 65 29 20 29  v[2], &iTable) )
1b40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b50: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1b60: 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
1b70: 70 42 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  pBt, iTable);.  
1b80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b90: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
1ba0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bb0: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
1bc0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1bd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1be0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1c00: 20 20 62 74 72 65 65 5f 63 6c 65 61 72 5f 74 61    btree_clear_ta
1c10: 62 6c 65 20 49 44 20 54 41 42 4c 45 4e 55 4d 0a  ble ID TABLENUM.
1c20: 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  **.** Remove all
1c30: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
1c40: 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 62 75  e given table bu
1c50: 74 20 6b 65 65 70 20 74 68 65 20 74 61 62 6c 65  t keep the table
1c60: 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74   around..*/.stat
1c70: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 63 6c 65  ic int btree_cle
1c80: 61 72 5f 74 61 62 6c 65 28 0a 20 20 76 6f 69 64  ar_table(.  void
1c90: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1ca0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1cb0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1cc0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1cd0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ce0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1cf0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1d00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1d10: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
1d20: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
1d30: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1d40: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1d50: 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1d60: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 0a 20  .  int iTable;. 
1d70: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
1d80: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1d90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1da0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1db0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1dc0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1dd0: 20 20 20 20 20 22 20 49 44 20 54 41 42 4c 45 4e       " ID TABLEN
1de0: 55 4d 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  UM\"", 0);.    r
1df0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e00: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
1e10: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
1e20: 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 42  gv[1], (int*)&pB
1e30: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1e40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1e50: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
1e60: 61 72 67 76 5b 32 5d 2c 20 26 69 54 61 62 6c 65  argv[2], &iTable
1e70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e80: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1e90: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
1ea0: 62 6c 65 28 70 42 74 2c 20 69 54 61 62 6c 65 29  ble(pBt, iTable)
1eb0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1ec0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
1ed0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ee0: 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28  terp, errorName(
1ef0: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
1f00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1f20: 4f 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53  OK;.}..#define S
1f30: 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45  QLITE_N_BTREE_ME
1f40: 54 41 20 31 36 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  TA 16../*.** Usa
1f50: 67 65 3a 20 20 20 62 74 72 65 65 5f 67 65 74 5f  ge:   btree_get_
1f60: 6d 65 74 61 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65  meta ID.**.** Re
1f70: 74 75 72 6e 20 6d 65 74 61 20 64 61 74 61 0a 2a  turn meta data.*
1f80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
1f90: 65 65 5f 67 65 74 5f 6d 65 74 61 28 0a 20 20 76  ee_get_meta(.  v
1fa0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1fb0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fc0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1fd0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1fe0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1ff0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2000: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2020: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
2040: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
2050: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2060: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
2070: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
2080: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
2090: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
20a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
20b0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
20c0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
20d0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
20e0: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
20f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2100: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2110: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
2120: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74  p, argv[1], (int
2130: 2a 29 26 70 42 74 29 20 29 20 72 65 74 75 72 6e  *)&pBt) ) return
2140: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f   TCL_ERROR;.  fo
2150: 72 28 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f  r(i=0; i<SQLITE_
2160: 4e 5f 42 54 52 45 45 5f 4d 45 54 41 3b 20 69 2b  N_BTREE_META; i+
2170: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  +){.    char zBu
2180: 66 5b 33 30 5d 3b 0a 20 20 20 20 75 6e 73 69 67  f[30];.    unsig
2190: 6e 65 64 20 69 6e 74 20 76 3b 0a 20 20 20 20 72  ned int v;.    r
21a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21b0: 47 65 74 4d 65 74 61 28 70 42 74 2c 20 69 2c 20  GetMeta(pBt, i, 
21c0: 26 76 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  &v);.    if( rc!
21d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
21f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
2200: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
2210: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2220: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2230: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22    sprintf(zBuf,"
2240: 25 64 22 2c 76 29 3b 0a 20 20 20 20 54 63 6c 5f  %d",v);.    Tcl_
2250: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2260: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  terp, zBuf);.  }
2270: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
2290: 3a 20 20 20 62 74 72 65 65 5f 75 70 64 61 74 65  :   btree_update
22a0: 5f 6d 65 74 61 20 49 44 20 4d 45 54 41 44 41 54  _meta ID METADAT
22b0: 41 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  A....**.** Retur
22c0: 6e 20 6d 65 74 61 20 64 61 74 61 0a 2a 2f 0a 73  n meta data.*/.s
22d0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
22e0: 75 70 64 61 74 65 5f 6d 65 74 61 28 0a 20 20 76  update_meta(.  v
22f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2300: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2310: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2320: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2330: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2340: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2350: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2360: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2370: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
2390: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
23a0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
23b0: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
23c0: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
23d0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 61 4d 65  int i;.  int aMe
23e0: 74 61 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  ta[SQLITE_N_BTRE
23f0: 45 5f 4d 45 54 41 5d 3b 0a 0a 20 20 69 66 28 20  E_META];..  if( 
2400: 61 72 67 63 21 3d 31 2b 53 51 4c 49 54 45 5f 4e  argc!=1+SQLITE_N
2410: 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 7b 0a 20  _BTREE_META ){. 
2420: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
2430: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
2440: 75 66 2c 22 25 64 22 2c 53 51 4c 49 54 45 5f 4e  uf,"%d",SQLITE_N
2450: 5f 42 54 52 45 45 5f 4d 45 54 41 29 3b 0a 20 20  _BTREE_META);.  
2460: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2470: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2480: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2490: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
24a0: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 20 4d 45  ,.       " ID ME
24b0: 54 41 44 41 54 41 2e 2e 2e 5c 22 20 28 4d 45 54  TADATA...\" (MET
24c0: 41 44 41 54 41 20 69 73 20 22 2c 20 7a 42 75 66  ADATA is ", zBuf
24d0: 2c 20 22 20 69 6e 74 65 67 65 72 73 29 22 2c 20  , " integers)", 
24e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
24f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2500: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
2510: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
2520: 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65  (int*)&pBt) ) re
2530: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2540: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 53 51 4c    for(i=1; i<SQL
2550: 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41  ITE_N_BTREE_META
2560: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2570: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
2580: 70 2c 20 61 72 67 76 5b 69 2b 31 5d 2c 20 26 61  p, argv[i+1], &a
2590: 4d 65 74 61 5b 69 5d 29 20 29 20 72 65 74 75 72  Meta[i]) ) retur
25a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25b0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 53 51  .  for(i=1; i<SQ
25c0: 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54  LITE_N_BTREE_MET
25d0: 41 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  A; i++){.    rc 
25e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  = sqlite3BtreeUp
25f0: 64 61 74 65 4d 65 74 61 28 70 42 74 2c 20 69 2c  dateMeta(pBt, i,
2600: 20 61 4d 65 74 61 5b 69 5d 29 3b 0a 20 20 20 20   aMeta[i]);.    
2610: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2620: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
2630: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2640: 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63  rp, errorName(rc
2650: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ), 0);.      ret
2660: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2680: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2690: 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65  ** Usage:   btre
26a0: 65 5f 70 61 67 65 5f 64 75 6d 70 20 49 44 20 50  e_page_dump ID P
26b0: 41 47 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20 50 72 69  AGENUM.**.** Pri
26c0: 6e 74 20 61 20 64 69 73 61 73 73 65 6d 62 6c 79  nt a disassembly
26d0: 20 6f 66 20 61 20 70 61 67 65 20 6f 6e 20 73 74   of a page on st
26e0: 61 6e 64 61 72 64 20 6f 75 74 70 75 74 0a 2a 2f  andard output.*/
26f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2700: 65 5f 70 61 67 65 5f 64 75 6d 70 28 0a 20 20 76  e_page_dump(.  v
2710: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2720: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2730: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2740: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2750: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2760: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2770: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2780: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2790: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
27a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
27b0: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
27c0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
27d0: 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  */.){.  Btree *p
27e0: 42 74 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 3b  Bt;.  int iPage;
27f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2800: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
2810: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2820: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2830: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2840: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
2850: 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c  .       " ID\"",
2860: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2870: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2880: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
2890: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
28a0: 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72   (int*)&pBt) ) r
28b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28c0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
28d0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
28e0: 5d 2c 20 26 69 50 61 67 65 29 20 29 20 72 65 74  ], &iPage) ) ret
28f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2910: 65 65 50 61 67 65 44 75 6d 70 28 70 42 74 2c 20  eePageDump(pBt, 
2920: 69 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  iPage, 0);.  if(
2930: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2940: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2950: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65  Result(interp, e
2960: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
2970: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2980: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
2990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
29a0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
29b0: 74 72 65 65 5f 74 72 65 65 5f 64 75 6d 70 20 49  tree_tree_dump I
29c0: 44 20 50 41 47 45 4e 55 4d 0a 2a 2a 0a 2a 2a 20  D PAGENUM.**.** 
29d0: 50 72 69 6e 74 20 61 20 64 69 73 61 73 73 65 6d  Print a disassem
29e0: 62 6c 79 20 6f 66 20 61 20 70 61 67 65 20 61 6e  bly of a page an
29f0: 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 20  d all its child 
2a00: 70 61 67 65 73 20 6f 6e 20 73 74 61 6e 64 61 72  pages on standar
2a10: 64 20 6f 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74  d output.*/.stat
2a20: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 74 72 65  ic int btree_tre
2a30: 65 5f 64 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a  e_dump(.  void *
2a40: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
2a50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2a60: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2a70: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2a80: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2a90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
2aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ab0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2ac0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
2ad0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
2ae0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
2af0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
2b00: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
2b10: 20 69 6e 74 20 69 50 61 67 65 3b 0a 20 20 69 6e   int iPage;.  in
2b20: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67  t rc;..  if( arg
2b30: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
2b40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2b50: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2b60: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2b70: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
2b80: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
2b90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ba0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2bb0: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
2bc0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74  p, argv[1], (int
2bd0: 2a 29 26 70 42 74 29 20 29 20 72 65 74 75 72 6e  *)&pBt) ) return
2be0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
2bf0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
2c00: 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69  erp, argv[2], &i
2c10: 50 61 67 65 29 20 29 20 72 65 74 75 72 6e 20 54  Page) ) return T
2c20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
2c30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
2c40: 65 44 75 6d 70 28 70 42 74 2c 20 69 50 61 67 65  eDump(pBt, iPage
2c50: 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 1);.  if( rc!=
2c60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2c80: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
2c90: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
2ca0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2cb0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
2cc0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2cd0: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
2ce0: 70 61 67 65 72 5f 73 74 61 74 73 20 49 44 0a 2a  pager_stats ID.*
2cf0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 70 61 67  *.** Returns pag
2d00: 65 72 20 73 74 61 74 69 73 74 69 63 73 0a 2a 2f  er statistics.*/
2d10: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2d20: 65 5f 70 61 67 65 72 5f 73 74 61 74 73 28 0a 20  e_pager_stats(. 
2d30: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2d40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d50: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d60: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d70: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2d80: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2d90: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2da0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2db0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2dc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
2dd0: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
2de0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2df0: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20  t */.){.  Btree 
2e00: 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pBt;.  int i;. 
2e10: 20 69 6e 74 20 2a 61 3b 0a 0a 20 20 69 66 28 20   int *a;..  if( 
2e20: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
2e30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2e40: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2e50: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2e60: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
2e70: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30        " ID\"", 0
2e80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2ea0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
2eb0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28  terp, argv[1], (
2ec0: 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72 65 74  int*)&pBt) ) ret
2ed0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ee0: 20 61 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65   a = sqlite3page
2ef0: 72 5f 73 74 61 74 73 28 73 71 6c 69 74 65 33 42  r_stats(sqlite3B
2f00: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
2f10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 39 3b  .  for(i=0; i<9;
2f20: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69   i++){.    stati
2f30: 63 20 63 68 61 72 20 2a 7a 4e 61 6d 65 5b 5d 20  c char *zName[] 
2f40: 3d 20 7b 0a 20 20 20 20 20 20 22 72 65 66 22 2c  = {.      "ref",
2f50: 20 22 70 61 67 65 22 2c 20 22 6d 61 78 22 2c 20   "page", "max", 
2f60: 22 73 69 7a 65 22 2c 20 22 73 74 61 74 65 22 2c  "size", "state",
2f70: 20 22 65 72 72 22 2c 0a 20 20 20 20 20 20 22 68   "err",.      "h
2f80: 69 74 22 2c 20 22 6d 69 73 73 22 2c 20 22 6f 76  it", "miss", "ov
2f90: 66 6c 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20  fl",.    };.    
2fa0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
2fb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c      Tcl_AppendEl
2fc0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 4e  ement(interp, zN
2fd0: 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 73 70 72  ame[i]);.    spr
2fe0: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 61  intf(zBuf,"%d",a
2ff0: 5b 69 5d 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  [i]);.    Tcl_Ap
3000: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3010: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20  rp, zBuf);.  }. 
3020: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3030: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
3040: 20 20 62 74 72 65 65 5f 70 61 67 65 72 5f 72 65    btree_pager_re
3050: 66 5f 64 75 6d 70 20 49 44 0a 2a 2a 0a 2a 2a 20  f_dump ID.**.** 
3060: 50 72 69 6e 74 20 6f 75 74 20 61 6c 6c 20 6f 75  Print out all ou
3070: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
3080: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
3090: 74 72 65 65 5f 70 61 67 65 72 5f 72 65 66 5f 64  tree_pager_ref_d
30a0: 75 6d 70 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ump(.  void *Not
30b0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
30c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
30d0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
30e0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
30f0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
3100: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3120: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3130: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
3140: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
3150: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
3160: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
3170: 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 69  Btree *pBt;..  i
3180: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
3190: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
31a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
31b0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
31c0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
31d0: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
31e0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
31f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3200: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
3210: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
3220: 2c 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20  , (int*)&pBt) ) 
3230: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3240: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
3250: 5f 72 65 66 64 75 6d 70 28 73 71 6c 69 74 65 33  _refdump(sqlite3
3260: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
3270: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3280: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3290: 65 3a 20 20 20 62 74 72 65 65 5f 69 6e 74 65 67  e:   btree_integ
32a0: 72 69 74 79 5f 63 68 65 63 6b 20 49 44 20 52 4f  rity_check ID RO
32b0: 4f 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 6f  OT ....**.** Loo
32c0: 6b 20 74 68 72 6f 75 67 68 20 65 76 65 72 79 20  k through every 
32d0: 70 61 67 65 20 6f 66 20 74 68 65 20 67 69 76 65  page of the give
32e0: 6e 20 42 54 72 65 65 20 66 69 6c 65 20 74 6f 20  n BTree file to 
32f0: 76 65 72 69 66 79 20 63 6f 72 72 65 63 74 0a 2a  verify correct.*
3300: 2a 20 66 6f 72 6d 61 74 74 69 6e 67 20 61 6e 64  * formatting and
3310: 20 6c 69 6e 6b 61 67 65 2e 20 20 52 65 74 75 72   linkage.  Retur
3320: 6e 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  n a line of text
3330: 20 66 6f 72 20 65 61 63 68 20 70 72 6f 62 6c 65   for each proble
3340: 6d 20 66 6f 75 6e 64 2e 0a 2a 2a 20 52 65 74 75  m found..** Retu
3350: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
3360: 6e 67 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ng if everything
3370: 20 77 6f 72 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74   worked..*/.stat
3380: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 69 6e 74  ic int btree_int
3390: 65 67 72 69 74 79 5f 63 68 65 63 6b 28 0a 20 20  egrity_check(.  
33a0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
33b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
33c0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
33d0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
33e0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
33f0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3400: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3410: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3420: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3430: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
3440: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
3450: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3460: 20 2a 2f 0a 29 7b 0a 20 20 42 74 72 65 65 20 2a   */.){.  Btree *
3470: 70 42 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  pBt;.  char *zRe
3480: 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 52 6f 6f  sult;.  int nRoo
3490: 74 3b 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b  t;.  int *aRoot;
34a0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
34b0: 20 61 72 67 63 3c 33 20 29 7b 0a 20 20 20 20 54   argc<3 ){.    T
34c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
34d0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
34e0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
34f0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
3500: 20 20 20 20 20 20 22 20 49 44 20 52 4f 4f 54 20        " ID ROOT 
3510: 2e 2e 2e 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  ...\"", 0);.    
3520: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3530: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
3540: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
3550: 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70  rgv[1], (int*)&p
3560: 42 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  Bt) ) return TCL
3570: 5f 45 52 52 4f 52 3b 0a 20 20 6e 52 6f 6f 74 20  _ERROR;.  nRoot 
3580: 3d 20 61 72 67 63 2d 32 3b 0a 20 20 61 52 6f 6f  = argc-2;.  aRoo
3590: 74 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  t = malloc( size
35a0: 6f 66 28 69 6e 74 29 2a 28 61 72 67 63 2d 32 29  of(int)*(argc-2)
35b0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
35c0: 3c 61 72 67 63 2d 32 3b 20 69 2b 2b 29 7b 0a 20  <argc-2; i++){. 
35d0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
35e0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
35f0: 2b 32 5d 2c 20 26 61 52 6f 6f 74 5b 69 5d 29 20  +2], &aRoot[i]) 
3600: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3610: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 52 65 73 75 6c  OR;.  }.  zResul
3620: 74 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  t = sqlite3Btree
3630: 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 70  IntegrityCheck(p
3640: 42 74 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74  Bt, aRoot, nRoot
3650: 29 3b 0a 20 20 69 66 28 20 7a 52 65 73 75 6c 74  );.  if( zResult
3660: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3670: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3680: 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20   zResult, 0);.  
3690: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 65    sqliteFree(zRe
36a0: 73 75 6c 74 29 3b 20 0a 20 20 7d 0a 20 20 72 65  sult); .  }.  re
36b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
36c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62  /*.** Usage:   b
36d0: 74 72 65 65 5f 63 75 72 73 6f 72 20 49 44 20 54  tree_cursor ID T
36e0: 41 42 4c 45 4e 55 4d 20 57 52 49 54 45 41 42 4c  ABLENUM WRITEABL
36f0: 45 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  E.**.** Create a
3700: 20 6e 65 77 20 63 75 72 73 6f 72 2e 20 20 52 65   new cursor.  Re
3710: 74 75 72 6e 20 74 68 65 20 49 44 20 66 6f 72 20  turn the ID for 
3720: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  the cursor..*/.s
3730: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
3740: 63 75 72 73 6f 72 28 0a 20 20 76 6f 69 64 20 2a  cursor(.  void *
3750: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
3760: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
3770: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
3780: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
3790: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
37a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
37b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
37c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
37d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
37e0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
37f0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
3800: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
3810: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20  .  Btree *pBt;. 
3820: 20 69 6e 74 20 69 54 61 62 6c 65 3b 0a 20 20 42   int iTable;.  B
3830: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
3840: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 77   int rc;.  int w
3850: 72 46 6c 61 67 3b 0a 20 20 63 68 61 72 20 7a 42  rFlag;.  char zB
3860: 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61  uf[30];..  if( a
3870: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  rgc!=4 ){.    Tc
3880: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3890: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
38a0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
38b0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
38c0: 20 20 20 20 20 22 20 49 44 20 54 41 42 4c 45 4e       " ID TABLEN
38d0: 55 4d 20 57 52 49 54 45 41 42 4c 45 5c 22 22 2c  UM WRITEABLE\"",
38e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
38f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
3900: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
3910: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
3920: 20 28 69 6e 74 2a 29 26 70 42 74 29 20 29 20 72   (int*)&pBt) ) r
3930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3940: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
3950: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
3960: 5d 2c 20 26 69 54 61 62 6c 65 29 20 29 20 72 65  ], &iTable) ) re
3970: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3980: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
3990: 6c 65 61 6e 28 69 6e 74 65 72 70 2c 20 61 72 67  lean(interp, arg
39a0: 76 5b 33 5d 2c 20 26 77 72 46 6c 61 67 29 20 29  v[3], &wrFlag) )
39b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
39c0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
39d0: 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 42 74  3BtreeCursor(pBt
39e0: 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
39f0: 2c 20 30 2c 20 30 2c 20 26 70 43 75 72 29 3b 0a  , 0, 0, &pCur);.
3a00: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
3a10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3a20: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
3a30: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
3a40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3a50: 3b 0a 20 20 7d 0a 20 20 73 70 72 69 6e 74 66 28  ;.  }.  sprintf(
3a60: 7a 42 75 66 2c 22 30 78 25 78 22 2c 20 28 69 6e  zBuf,"0x%x", (in
3a70: 74 29 70 43 75 72 29 3b 0a 20 20 54 63 6c 5f 41  t)pCur);.  Tcl_A
3a80: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3a90: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
3aa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_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 63 6c 6f 73 65 5f  :   btree_close_
3ad0: 63 75 72 73 6f 72 20 49 44 0a 2a 2a 0a 2a 2a 20  cursor ID.**.** 
3ae0: 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 6f  Close a cursor o
3af0: 70 65 6e 65 64 20 75 73 69 6e 67 20 62 74 72 65  pened using btre
3b00: 65 5f 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  e_cursor..*/.sta
3b10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 63 6c  tic int btree_cl
3b20: 6f 73 65 5f 63 75 72 73 6f 72 28 0a 20 20 76 6f  ose_cursor(.  vo
3b30: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
3b40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3b50: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
3b60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
3b70: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
3b80: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
3b90: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
3ba0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3bb0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
3bc0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
3bd0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
3be0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
3bf0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
3c00: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
3c10: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
3c20: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3c30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3c40: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
3c50: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
3c60: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
3c70: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
3c80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3c90: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
3ca0: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
3cb0: 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 43  gv[1], (int*)&pC
3cc0: 75 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ur) ) return TCL
3cd0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
3ce0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
3cf0: 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
3d00: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
3d10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3d20: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
3d30: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
3d40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3d50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
3d60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3d70: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
3d80: 6d 6f 76 65 5f 74 6f 20 49 44 20 4b 45 59 0a 2a  move_to ID KEY.*
3d90: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
3da0: 72 73 6f 72 20 74 6f 20 74 68 65 20 65 6e 74 72  rsor to the entr
3db0: 79 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  y with the given
3dc0: 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   key..*/.static 
3dd0: 69 6e 74 20 62 74 72 65 65 5f 6d 6f 76 65 5f 74  int btree_move_t
3de0: 6f 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  o(.  void *NotUs
3df0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
3e00: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
3e10: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3e20: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3e30: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3e40: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3e60: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3e70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3e80: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
3e90: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3ea0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74  ument */.){.  Bt
3eb0: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
3ec0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65  int rc;.  int re
3ed0: 73 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32  s;.  char zBuf[2
3ee0: 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  0];..  if( argc!
3ef0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
3f00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3f10: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
3f20: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
3f30: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
3f40: 20 22 20 49 44 20 4b 45 59 5c 22 22 2c 20 30 29   " ID KEY\"", 0)
3f50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3f60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3f70: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
3f80: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69  erp, argv[1], (i
3f90: 6e 74 2a 29 26 70 43 75 72 29 20 29 20 72 65 74  nt*)&pCur) ) ret
3fa0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3fb0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
3fc0: 65 46 6c 61 67 73 28 70 43 75 72 29 20 26 20 42  eFlags(pCur) & B
3fd0: 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 7b 0a 20  TREE_INTKEY ){. 
3fe0: 20 20 20 69 6e 74 20 69 4b 65 79 3b 0a 20 20 20     int iKey;.   
3ff0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
4000: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
4010: 20 26 69 4b 65 79 29 20 29 20 72 65 74 75 72 6e   &iKey) ) return
4020: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4030: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
4040: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 30 2c  eMoveto(pCur, 0,
4050: 20 69 4b 65 79 2c 20 26 72 65 73 29 3b 0a 20 20   iKey, &res);.  
4060: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
4070: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
4080: 74 6f 28 70 43 75 72 2c 20 61 72 67 76 5b 32 5d  to(pCur, argv[2]
4090: 2c 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d  , strlen(argv[2]
40a0: 29 2c 20 26 72 65 73 29 3b 20 20 0a 20 20 7d 0a  ), &res);  .  }.
40b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
40c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
40d0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
40e0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
40f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4100: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 3c  ;.  }.  if( res<
4110: 30 20 29 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20  0 ) res = -1;.  
4120: 69 66 28 20 72 65 73 3e 30 20 29 20 72 65 73 20  if( res>0 ) res 
4130: 3d 20 31 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  = 1;.  sprintf(z
4140: 42 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20  Buf,"%d",res);. 
4150: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4160: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
4170: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
4180: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4190: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
41a0: 64 65 6c 65 74 65 20 49 44 0a 2a 2a 0a 2a 2a 20  delete ID.**.** 
41b0: 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
41c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
41d0: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a   is pointing to.
41e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
41f0: 72 65 65 5f 64 65 6c 65 74 65 28 0a 20 20 76 6f  ree_delete(.  vo
4200: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
4210: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4220: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
4230: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
4240: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
4250: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
4260: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
4270: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4280: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
4290: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
42a0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
42b0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
42c0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
42d0: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
42e0: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
42f0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4300: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4310: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4320: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4330: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
4340: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
4350: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4360: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
4370: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4380: 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 43  gv[1], (int*)&pC
4390: 75 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ur) ) return TCL
43a0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
43b0: 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
43c0: 65 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  e(pCur);.  if( r
43d0: 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c ){.    Tcl_App
43e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
43f0: 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  , errorName(rc),
4400: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4410: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4420: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4430: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4440: 65 3a 20 20 20 62 74 72 65 65 5f 69 6e 73 65 72  e:   btree_inser
4450: 74 20 49 44 20 4b 45 59 20 44 41 54 41 0a 2a 2a  t ID KEY DATA.**
4460: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
4470: 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
4480: 67 69 76 65 6e 20 6b 65 79 20 61 6e 64 20 64 61  given key and da
4490: 74 61 2e 20 20 49 66 20 61 6e 20 65 6e 74 72 79  ta.  If an entry
44a0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73   already.** exis
44b0: 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ts with the same
44c0: 20 6b 65 79 20 74 68 65 20 6f 6c 64 20 65 6e 74   key the old ent
44d0: 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ry is overwritte
44e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
44f0: 20 62 74 72 65 65 5f 69 6e 73 65 72 74 28 0a 20   btree_insert(. 
4500: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4510: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4520: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4530: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4540: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4550: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4560: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4570: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4580: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4590: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
45a0: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
45b0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
45c0: 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  t */.){.  BtCurs
45d0: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
45e0: 72 63 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  rc;..  if( argc!
45f0: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
4600: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4610: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4620: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4630: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
4640: 20 22 20 49 44 20 4b 45 59 20 44 41 54 41 5c 22   " ID KEY DATA\"
4650: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4660: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4670: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
4680: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
4690: 5d 2c 20 28 69 6e 74 2a 29 26 70 43 75 72 29 20  ], (int*)&pCur) 
46a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
46b0: 4f 52 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  OR;.  if( sqlite
46c0: 33 42 74 72 65 65 46 6c 61 67 73 28 70 43 75 72  3BtreeFlags(pCur
46d0: 29 20 26 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  ) & BTREE_INTKEY
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65 79   ){.    int iKey
46f0: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
4700: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
4710: 76 5b 32 5d 2c 20 26 69 4b 65 79 29 20 29 20 72  v[2], &iKey) ) r
4720: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4730: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4740: 33 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 75  3BtreeInsert(pCu
4750: 72 2c 20 30 2c 20 69 4b 65 79 2c 20 61 72 67 76  r, 0, iKey, argv
4760: 5b 33 5d 2c 20 73 74 72 6c 65 6e 28 61 72 67 76  [3], strlen(argv
4770: 5b 33 5d 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  [3]));.  }else{.
4780: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4790: 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 75 72  BtreeInsert(pCur
47a0: 2c 20 61 72 67 76 5b 32 5d 2c 20 73 74 72 6c 65  , argv[2], strle
47b0: 6e 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20 20 20  n(argv[2]),.    
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 61 72 67 76 5b 33 5d 2c 20 73 74       argv[3], st
47e0: 72 6c 65 6e 28 61 72 67 76 5b 33 5d 29 29 3b 0a  rlen(argv[3]));.
47f0: 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
4800: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4810: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
4820: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
4830: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4840: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
4850: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4860: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
4870: 62 74 72 65 65 5f 6e 65 78 74 20 49 44 0a 2a 2a  btree_next ID.**
4880: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
4890: 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
48a0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
48b0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e  le.  Return 0 on
48c0: 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 31   success.** or 1
48d0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 77   if the cursor w
48e0: 61 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68  as already on th
48f0: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
4900: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 66 0a  the table or if.
4910: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  ** the table is 
4920: 65 6d 70 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  empty..*/.static
4930: 20 69 6e 74 20 62 74 72 65 65 5f 6e 65 78 74 28   int btree_next(
4940: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4950: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4960: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4970: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4980: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4990: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
49a0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
49b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
49c0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
49d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
49e0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
49f0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4a00: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ent */.){.  BtCu
4a10: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
4a20: 74 20 72 63 3b 0a 20 20 69 6e 74 20 72 65 73 20  t rc;.  int res 
4a30: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
4a40: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  [100];..  if( ar
4a50: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4a60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4a70: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4a80: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4a90: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4aa0: 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b      " ID\"", 0);
4ab0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4ac0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4ad0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
4ae0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 28 69 6e  rp, argv[1], (in
4af0: 74 2a 29 26 70 43 75 72 29 20 29 20 72 65 74 75  t*)&pCur) ) retu
4b00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4b10: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
4b20: 65 4e 65 78 74 28 70 43 75 72 2c 20 26 72 65 73  eNext(pCur, &res
4b30: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
4b40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4b50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f  ult(interp, erro
4b60: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
4b70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4b80: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 70 72 69 6e  ROR;.  }.  sprin
4b90: 74 66 28 7a 42 75 66 2c 22 25 64 22 2c 72 65 73  tf(zBuf,"%d",res
4ba0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
4bb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
4bc0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
4bd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4be0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
4bf0: 72 65 65 5f 70 72 65 76 20 49 44 0a 2a 2a 0a 2a  ree_prev ID.**.*
4c00: 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
4c10: 72 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  r to the previou
4c20: 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  s entry in the t
4c30: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 30 20  able.  Return 0 
4c40: 6f 6e 0a 2a 2a 20 73 75 63 63 65 73 73 20 61 6e  on.** success an
4c50: 64 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  d 1 if the curso
4c60: 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 6e  r was already on
4c70: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
4c80: 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   in.** the table
4c90: 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
4ca0: 20 77 61 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 73   was empty..*/.s
4cb0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
4cc0: 70 72 65 76 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  prev(.  void *No
4cd0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4ce0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4cf0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4d00: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4d10: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4d20: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d40: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4d50: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
4d60: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
4d70: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4d80: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4d90: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
4da0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
4db0: 20 72 65 73 20 3d 20 30 3b 0a 20 20 63 68 61 72   res = 0;.  char
4dc0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
4dd0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
4de0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4df0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4e00: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4e10: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4e20: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
4e30: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4e40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4e50: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
4e60: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
4e70: 2c 20 28 69 6e 74 2a 29 26 70 43 75 72 29 20 29  , (int*)&pCur) )
4e80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
4e90: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
4ea0: 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
4eb0: 43 75 72 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  Cur, &res);.  if
4ec0: 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
4ed0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4ee0: 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72  erp, errorName(r
4ef0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
4f00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4f10: 7d 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  }.  sprintf(zBuf
4f20: 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20 54 63  ,"%d",res);.  Tc
4f30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4f40: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
4f50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4f60: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4f70: 61 67 65 3a 20 20 20 62 74 72 65 65 5f 66 69 72  age:   btree_fir
4f80: 73 74 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65  st ID.**.** Move
4f90: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
4fa0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
4fb0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
4fc0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 0a 2a 2a  turn 0 if the.**
4fd0: 20 63 75 72 73 6f 72 20 77 61 73 20 6c 65 66 74   cursor was left
4fe0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 74 68   point to someth
4ff0: 69 6e 67 20 61 6e 64 20 31 20 69 66 20 74 68 65  ing and 1 if the
5000: 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
5010: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5020: 74 72 65 65 5f 66 69 72 73 74 28 0a 20 20 76 6f  tree_first(.  vo
5030: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
5040: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5050: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5060: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
5070: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
5080: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
5090: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
50a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
50b0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
50c0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
50d0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
50e0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
50f0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
5100: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
5110: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
5120: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
5130: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
5140: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5150: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5160: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
5170: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
5180: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
5190: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
51a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
51b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
51c0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
51d0: 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70  rgv[1], (int*)&p
51e0: 43 75 72 29 20 29 20 72 65 74 75 72 6e 20 54 43  Cur) ) return TC
51f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
5200: 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
5210: 74 28 70 43 75 72 2c 20 26 72 65 73 29 3b 0a 20  t(pCur, &res);. 
5220: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54   if( rc ){.    T
5230: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5240: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
5250: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
5260: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5270: 0a 20 20 7d 0a 20 20 73 70 72 69 6e 74 66 28 7a  .  }.  sprintf(z
5280: 42 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20  Buf,"%d",res);. 
5290: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
52a0: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
52b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
52c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
52d0: 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f   Usage:   btree_
52e0: 6c 61 73 74 20 49 44 0a 2a 2a 0a 2a 2a 20 4d 6f  last ID.**.** Mo
52f0: 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
5300: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
5310: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
5320: 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 0a 2a  eturn 0 if the.*
5330: 2a 20 63 75 72 73 6f 72 20 77 61 73 20 6c 65 66  * cursor was lef
5340: 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 74  t point to somet
5350: 68 69 6e 67 20 61 6e 64 20 31 20 69 66 20 74 68  hing and 1 if th
5360: 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
5370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5380: 62 74 72 65 65 5f 6c 61 73 74 28 0a 20 20 76 6f  btree_last(.  vo
5390: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
53a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
53b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
53c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
53d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
53e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
53f0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
5400: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5410: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
5420: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
5430: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
5440: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
5450: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
5460: 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *pCur;.  int rc;
5470: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
5480: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
5490: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
54a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
54b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
54c0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
54d0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
54e0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
54f0: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
5500: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
5520: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
5530: 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70  rgv[1], (int*)&p
5540: 43 75 72 29 20 29 20 72 65 74 75 72 6e 20 54 43  Cur) ) return TC
5550: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
5560: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
5570: 28 70 43 75 72 2c 20 26 72 65 73 29 3b 0a 20 20  (pCur, &res);.  
5580: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
5590: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
55a0: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
55b0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
55c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
55d0: 20 20 7d 0a 20 20 73 70 72 69 6e 74 66 28 7a 42    }.  sprintf(zB
55e0: 75 66 2c 22 25 64 22 2c 72 65 73 29 3b 0a 20 20  uf,"%d",res);.  
55f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5600: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
5610: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5620: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5630: 55 73 61 67 65 3a 20 20 20 62 74 72 65 65 5f 65  Usage:   btree_e
5640: 6f 66 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75  of ID.**.** Retu
5650: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
5660: 69 76 65 6e 20 63 75 72 73 6f 72 20 69 73 20 6e  iven cursor is n
5670: 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
5680: 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 0a 2a 2a   valid entry..**
5690: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
56a0: 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 65 73   the cursor does
56b0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69   point to a vali
56c0: 64 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  d entry..*/.stat
56d0: 69 63 20 69 6e 74 20 62 74 72 65 65 5f 65 6f 66  ic int btree_eof
56e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
56f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
5700: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
5710: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
5720: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
5730: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
5740: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
5750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5760: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5770: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5780: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
5790: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
57a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  ment */.){.  BtC
57b0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 63  ursor *pCur;.  c
57c0: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20  har zBuf[50];.. 
57d0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
57e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
57f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
5800: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
5810: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
5820: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
5830: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
5840: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5850: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
5860: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
5870: 31 5d 2c 20 28 69 6e 74 2a 29 26 70 43 75 72 29  1], (int*)&pCur)
5880: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
5890: 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ROR;.  sprintf(z
58a0: 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69 74  Buf, "%d", sqlit
58b0: 65 33 42 74 72 65 65 45 6f 66 28 70 43 75 72 29  e3BtreeEof(pCur)
58c0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
58d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
58e0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
58f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5900: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 62 74  *.** Usage:   bt
5910: 72 65 65 5f 6b 65 79 73 69 7a 65 20 49 44 0a 2a  ree_keysize ID.*
5920: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5930: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5940: 6f 66 20 6b 65 79 2e 20 20 0a 2a 2f 0a 73 74 61  of key.  .*/.sta
5950: 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f 6b 65  tic int btree_ke
5960: 79 73 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 4e  ysize(.  void *N
5970: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
5980: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
5990: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
59a0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
59b0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
59c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
59e0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
59f0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
5a00: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5a10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
5a20: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
5a30: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
5a40: 3b 0a 20 20 75 36 34 20 6e 3b 0a 20 20 63 68 61  ;.  u64 n;.  cha
5a50: 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69  r zBuf[50];..  i
5a60: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
5a70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5a80: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
5a90: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
5aa0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
5ab0: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
5ac0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
5ad0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
5ae0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
5af0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
5b00: 2c 20 28 69 6e 74 2a 29 26 70 43 75 72 29 20 29  , (int*)&pCur) )
5b10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5b20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  R;.  sqlite3Btre
5b30: 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
5b40: 6e 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  n);.  sprintf(zB
5b50: 75 66 2c 20 22 25 6c 6c 75 22 2c 20 6e 29 3b 0a  uf, "%llu", n);.
5b60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
5b70: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
5b80: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
5b90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5ba0: 2a 20 55 73 61 67 65 3a 20 20 20 62 74 72 65 65  * Usage:   btree
5bb0: 5f 6b 65 79 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65  _key ID.**.** Re
5bc0: 74 75 72 6e 20 74 68 65 20 6b 65 79 20 66 6f 72  turn the key for
5bd0: 20 74 68 65 20 65 6e 74 72 79 20 61 74 20 77 68   the entry at wh
5be0: 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
5bf0: 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73  s pointing..*/.s
5c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 5f  tatic int btree_
5c10: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
5c20: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
5c30: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
5c40: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
5c50: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
5c60: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
5c70: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5c90: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
5ca0: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
5cb0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
5cc0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
5cd0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
5ce0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
5cf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 36 34 20    int rc;.  u64 
5d00: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  n;.  char *zBuf;
5d10: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
5d20: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
5d30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5d40: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
5d50: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
5d60: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
5d70: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
5d80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5d90: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
5da0: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
5db0: 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26 70 43  gv[1], (int*)&pC
5dc0: 75 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ur) ) return TCL
5dd0: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
5de0: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
5df0: 75 72 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 73  ur, &n);.  if( s
5e00: 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73  qlite3BtreeFlags
5e10: 28 70 43 75 72 29 20 26 20 42 54 52 45 45 5f 49  (pCur) & BTREE_I
5e20: 4e 54 4b 45 59 20 29 7b 0a 20 20 20 20 63 68 61  NTKEY ){.    cha
5e30: 72 20 7a 42 75 66 32 5b 36 30 5d 3b 0a 20 20 20  r zBuf2[60];.   
5e40: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 32 2c 20   sprintf(zBuf2, 
5e50: 22 25 6c 6c 75 22 2c 20 6e 29 3b 0a 20 20 20 20  "%llu", n);.    
5e60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5e70: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 32 2c 20  (interp, zBuf2, 
5e80: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
5e90: 20 7a 42 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 20   zBuf = malloc( 
5ea0: 6e 2b 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n+1 );.    rc = 
5eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
5ec0: 70 43 75 72 2c 20 30 2c 20 6e 2c 20 7a 42 75 66  pCur, 0, n, zBuf
5ed0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
5ee0: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
5ef0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5f00: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
5f10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5f20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5f30: 0a 20 20 20 20 7a 42 75 66 5b 6e 5d 20 3d 20 30  .    zBuf[n] = 0
5f40: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
5f50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
5f60: 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  Buf, 0);.    fre
5f70: 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 72  e(zBuf);.  }.  r
5f80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
5fa0: 20 20 20 62 74 72 65 65 5f 64 61 74 61 20 49 44     btree_data ID
5fb0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
5fc0: 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 65  e data for the e
5fd0: 6e 74 72 79 20 61 74 20 77 68 69 63 68 20 74 68  ntry at which th
5fe0: 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
5ff0: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
6000: 69 6e 74 20 62 74 72 65 65 5f 64 61 74 61 28 0a  int btree_data(.
6010: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
6020: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
6030: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
6040: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
6050: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
6060: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
6070: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
6080: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6090: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
60a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
60b0: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
60c0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
60d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72  nt */.){.  BtCur
60e0: 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
60f0: 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20   rc;.  u32 n;.  
6100: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
6110: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
6120: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
6130: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
6140: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
6150: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
6160: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
6170: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
6180: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
6190: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
61a0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
61b0: 2c 20 28 69 6e 74 2a 29 26 70 43 75 72 29 20 29  , (int*)&pCur) )
61c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
61d0: 52 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  R;.  sqlite3Btre
61e0: 65 44 61 74 61 53 69 7a 65 28 70 43 75 72 2c 20  eDataSize(pCur, 
61f0: 26 6e 29 3b 0a 20 20 7a 42 75 66 20 3d 20 6d 61  &n);.  zBuf = ma
6200: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 72  lloc( n+1 );.  r
6210: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6220: 44 61 74 61 28 70 43 75 72 2c 20 30 2c 20 6e 2c  Data(pCur, 0, n,
6230: 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63   zBuf);.  if( rc
6240: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
6250: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6260: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
6270: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6280: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6290: 7a 42 75 66 5b 6e 5d 20 3d 20 30 3b 0a 20 20 54  zBuf[n] = 0;.  T
62a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
62b0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
62c0: 3b 0a 20 20 66 72 65 65 28 7a 42 75 66 29 3b 0a  ;.  free(zBuf);.
62d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
62e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
62f0: 67 65 3a 20 20 20 62 74 72 65 65 5f 70 61 79 6c  ge:   btree_payl
6300: 6f 61 64 5f 73 69 7a 65 20 49 44 0a 2a 2a 0a 2a  oad_size ID.**.*
6310: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
6320: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
6330: 70 61 79 6c 6f 61 64 0a 2a 2f 0a 73 74 61 74 69  payload.*/.stati
6340: 63 20 69 6e 74 20 62 74 72 65 65 5f 70 61 79 6c  c int btree_payl
6350: 6f 61 64 5f 73 69 7a 65 28 0a 20 20 76 6f 69 64  oad_size(.  void
6360: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
6370: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6380: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
6390: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
63a0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
63b0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
63c0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
63d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
63e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
63f0: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
6400: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
6410: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
6420: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
6430: 43 75 72 3b 0a 20 20 69 6e 74 20 6e 32 3b 0a 20  Cur;.  int n2;. 
6440: 20 75 36 34 20 6e 31 3b 0a 20 20 63 68 61 72 20   u64 n1;.  char 
6450: 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[50];..  if(
6460: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
6470: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6480: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6490: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
64a0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
64b0: 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20         " ID\"", 
64c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
64d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
64e0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
64f0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
6500: 28 69 6e 74 2a 29 26 70 43 75 72 29 20 29 20 72  (int*)&pCur) ) r
6510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6520: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74  .  if( sqlite3Bt
6530: 72 65 65 46 6c 61 67 73 28 70 43 75 72 29 20 26  reeFlags(pCur) &
6540: 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 7b   BTREE_INTKEY ){
6550: 0a 20 20 20 20 6e 31 20 3d 20 30 3b 0a 20 20 7d  .    n1 = 0;.  }
6560: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6570: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
6580: 75 72 2c 20 26 6e 31 29 3b 0a 20 20 7d 0a 20 20  ur, &n1);.  }.  
6590: 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
65a0: 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 32 29 3b  Size(pCur, &n2);
65b0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
65c0: 20 22 25 64 22 2c 20 28 69 6e 74 29 28 6e 31 2b   "%d", (int)(n1+
65d0: 6e 32 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  n2));.  Tcl_Appe
65e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
65f0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
6600: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6610: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
6620: 20 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 64 75   btree_cursor_du
6630: 6d 70 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mp ID.**.** Retu
6640: 72 6e 20 65 69 67 68 74 20 69 6e 74 65 67 65 72  rn eight integer
6650: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e 66  s containing inf
6660: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
6670: 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
6680: 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
6690: 6e 67 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ng to:.**.**   a
66a0: 52 65 73 75 6c 74 5b 30 5d 20 3d 20 20 54 68 65  Result[0] =  The
66b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   page number.** 
66c0: 20 20 61 52 65 73 75 6c 74 5b 31 5d 20 3d 20 20    aResult[1] =  
66d0: 54 68 65 20 65 6e 74 72 79 20 6e 75 6d 62 65 72  The entry number
66e0: 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74 5b 32 5d  .**   aResult[2]
66f0: 20 3d 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   =  Total number
6700: 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 74   of entries on t
6710: 68 69 73 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  his page.**   aR
6720: 65 73 75 6c 74 5b 33 5d 20 3d 20 20 53 69 7a 65  esult[3] =  Size
6730: 20 6f 66 20 74 68 69 73 20 65 6e 74 72 79 0a 2a   of this entry.*
6740: 2a 20 20 20 61 52 65 73 75 6c 74 5b 34 5d 20 3d  *   aResult[4] =
6750: 20 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65    Number of free
6760: 20 62 79 74 65 73 20 6f 6e 20 74 68 69 73 20 70   bytes on this p
6770: 61 67 65 0a 2a 2a 20 20 20 61 52 65 73 75 6c 74  age.**   aResult
6780: 5b 35 5d 20 3d 20 20 4e 75 6d 62 65 72 20 6f 66  [5] =  Number of
6790: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 6f 6e 20   free blocks on 
67a0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 61 52  the page.**   aR
67b0: 65 73 75 6c 74 5b 36 5d 20 3d 20 20 50 61 67 65  esult[6] =  Page
67c0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
67d0: 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 69  eft child of thi
67e0: 73 20 65 6e 74 72 79 0a 2a 2a 20 20 20 61 52 65  s entry.**   aRe
67f0: 73 75 6c 74 5b 37 5d 20 3d 20 20 50 61 67 65 20  sult[7] =  Page 
6800: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 69  number of the ri
6810: 67 68 74 20 63 68 69 6c 64 20 66 6f 72 20 74 68  ght child for th
6820: 65 20 77 68 6f 6c 65 20 70 61 67 65 0a 2a 2f 0a  e whole page.*/.
6830: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6840: 5f 63 75 72 73 6f 72 5f 64 75 6d 70 28 0a 20 20  _cursor_dump(.  
6850: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
6860: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6870: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
6880: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
6890: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
68a0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
68b0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
68c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
68d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
68e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
68f0: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
6900: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
6910: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
6920: 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
6930: 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  c;.  int i, j;. 
6940: 20 69 6e 74 20 61 52 65 73 75 6c 74 5b 38 5d 3b   int aResult[8];
6950: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30  .  char zBuf[400
6960: 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ];..  if( argc!=
6970: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
6980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6990: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
69a0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
69b0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
69c0: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
69d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
69e0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
69f0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
6a00: 61 72 67 76 5b 31 5d 2c 20 28 69 6e 74 2a 29 26  argv[1], (int*)&
6a10: 70 43 75 72 29 20 29 20 72 65 74 75 72 6e 20 54  pCur) ) return T
6a20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
6a30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6a40: 73 6f 72 44 75 6d 70 28 70 43 75 72 2c 20 61 52  sorDump(pCur, aR
6a50: 65 73 75 6c 74 29 3b 0a 20 20 69 66 28 20 72 63  esult);.  if( rc
6a60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
6a70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6a80: 20 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20   errorName(rc), 
6a90: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6aa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6ab0: 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
6ac0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 52 65 73 75  ; i<sizeof(aResu
6ad0: 6c 74 29 2f 73 69 7a 65 6f 66 28 61 52 65 73 75  lt)/sizeof(aResu
6ae0: 6c 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  lt[0]); i++){.  
6af0: 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b    sprintf(&zBuf[
6b00: 6a 5d 2c 22 20 25 64 22 2c 20 61 52 65 73 75 6c  j]," %d", aResul
6b10: 74 5b 69 5d 29 3b 0a 20 20 20 20 6a 20 2b 3d 20  t[i]);.    j += 
6b20: 73 74 72 6c 65 6e 28 26 7a 42 75 66 5b 6a 5d 29  strlen(&zBuf[j])
6b30: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
6b40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6b50: 20 26 7a 42 75 66 5b 31 5d 2c 20 30 29 3b 0a 20   &zBuf[1], 0);. 
6b60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6b70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
6b80: 63 6f 6d 6d 61 6e 64 20 69 73 20 70 72 6f 76 69  command is provi
6b90: 64 65 64 20 66 6f 72 20 74 68 65 20 70 75 72 70  ded for the purp
6ba0: 6f 73 65 20 6f 66 20 73 65 74 74 69 6e 67 20 62  ose of setting b
6bb0: 72 65 61 6b 70 6f 69 6e 74 73 2e 0a 2a 2a 20 69  reakpoints..** i
6bc0: 6e 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73  n regression tes
6bd0: 74 20 73 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a  t scripts..**.**
6be0: 20 42 79 20 73 65 74 74 69 6e 67 20 61 20 47 44   By setting a GD
6bf0: 42 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20  B breakpoint on 
6c00: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61  this procedure a
6c10: 6e 64 20 65 78 65 63 75 74 69 6e 67 20 74 68 65  nd executing the
6c20: 0a 2a 2a 20 62 74 72 65 65 5f 62 72 65 61 6b 70  .** btree_breakp
6c30: 6f 69 6e 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20  oint command in 
6c40: 61 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  a test script, w
6c50: 65 20 63 61 6e 20 73 74 6f 70 20 47 44 42 20 61  e can stop GDB a
6c60: 74 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 69  t.** the point i
6c70: 6e 20 74 68 65 20 73 63 72 69 70 74 20 77 68 65  n the script whe
6c80: 72 65 20 74 68 65 20 62 74 72 65 65 5f 62 72 65  re the btree_bre
6c90: 61 6b 70 6f 69 6e 74 20 63 6f 6d 6d 61 6e 64 20  akpoint command 
6ca0: 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20  is.** inserted. 
6cb0: 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
6cc0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a  for debugging..*
6cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6ce0: 65 65 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20  ee_breakpoint(. 
6cf0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
6d00: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6d10: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
6d20: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
6d30: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
6d40: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
6d50: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
6d60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6d70: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
6d80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
6d90: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
6da0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
6db0: 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  t */.){.  return
6dc0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
6dd0: 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d  ** Register comm
6de0: 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43  ands with the TC
6df0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
6e00: 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  /.int Sqlitetest
6e10: 33 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  3_Init(Tcl_Inter
6e20: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74  p *interp){.  st
6e30: 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
6e40: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
6e50: 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63       Tcl_CmdProc
6e60: 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d   *xProc;.  } aCm
6e70: 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
6e80: 62 74 72 65 65 5f 6f 70 65 6e 22 2c 20 20 20 20  btree_open",    
6e90: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
6ea0: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6f  CmdProc*)btree_o
6eb0: 70 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  pen             
6ec0: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
6ed0: 65 65 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20  ee_close",      
6ee0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
6ef0: 50 72 6f 63 2a 29 62 74 72 65 65 5f 63 6c 6f 73  Proc*)btree_clos
6f00: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  e              }
6f10: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
6f20: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
6f30: 6e 22 2c 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f  n",  (Tcl_CmdPro
6f40: 63 2a 29 62 74 72 65 65 5f 62 65 67 69 6e 5f 74  c*)btree_begin_t
6f50: 72 61 6e 73 61 63 74 69 6f 6e 20 20 7d 2c 0a 20  ransaction  },. 
6f60: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 63 6f 6d      { "btree_com
6f70: 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  mit",           
6f80: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
6f90: 62 74 72 65 65 5f 63 6f 6d 6d 69 74 20 20 20 20  btree_commit    
6fa0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
6fb0: 20 7b 20 22 62 74 72 65 65 5f 72 6f 6c 6c 62 61   { "btree_rollba
6fc0: 63 6b 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  ck",           (
6fd0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
6fe0: 65 65 5f 72 6f 6c 6c 62 61 63 6b 20 20 20 20 20  ee_rollback     
6ff0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
7000: 22 62 74 72 65 65 5f 63 72 65 61 74 65 5f 74 61  "btree_create_ta
7010: 62 6c 65 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ble",       (Tcl
7020: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
7030: 63 72 65 61 74 65 5f 74 61 62 6c 65 20 20 20 20  create_table    
7040: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
7050: 72 65 65 5f 64 72 6f 70 5f 74 61 62 6c 65 22 2c  ree_drop_table",
7060: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
7070: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 64 72 6f  dProc*)btree_dro
7080: 70 5f 74 61 62 6c 65 20 20 20 20 20 20 20 20 20  p_table         
7090: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
70a0: 5f 63 6c 65 61 72 5f 74 61 62 6c 65 22 2c 20 20  _clear_table",  
70b0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
70c0: 6f 63 2a 29 62 74 72 65 65 5f 63 6c 65 61 72 5f  oc*)btree_clear_
70d0: 74 61 62 6c 65 20 20 20 20 20 20 20 20 7d 2c 0a  table        },.
70e0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 67 65       { "btree_ge
70f0: 74 5f 6d 65 74 61 22 2c 20 20 20 20 20 20 20 20  t_meta",        
7100: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
7110: 29 62 74 72 65 65 5f 67 65 74 5f 6d 65 74 61 20  )btree_get_meta 
7120: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7130: 20 20 7b 20 22 62 74 72 65 65 5f 75 70 64 61 74    { "btree_updat
7140: 65 5f 6d 65 74 61 22 2c 20 20 20 20 20 20 20 20  e_meta",        
7150: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
7160: 72 65 65 5f 75 70 64 61 74 65 5f 6d 65 74 61 20  ree_update_meta 
7170: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
7180: 20 22 62 74 72 65 65 5f 70 61 67 65 5f 64 75 6d   "btree_page_dum
7190: 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  p",          (Tc
71a0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
71b0: 5f 70 61 67 65 5f 64 75 6d 70 20 20 20 20 20 20  _page_dump      
71c0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
71d0: 74 72 65 65 5f 74 72 65 65 5f 64 75 6d 70 22 2c  tree_tree_dump",
71e0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
71f0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 74 72  mdProc*)btree_tr
7200: 65 65 5f 64 75 6d 70 20 20 20 20 20 20 20 20 20  ee_dump         
7210: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
7220: 65 5f 70 61 67 65 72 5f 73 74 61 74 73 22 2c 20  e_pager_stats", 
7230: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
7240: 72 6f 63 2a 29 62 74 72 65 65 5f 70 61 67 65 72  roc*)btree_pager
7250: 5f 73 74 61 74 73 20 20 20 20 20 20 20 20 7d 2c  _stats        },
7260: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 70  .     { "btree_p
7270: 61 67 65 72 5f 72 65 66 5f 64 75 6d 70 22 2c 20  ager_ref_dump", 
7280: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
7290: 2a 29 62 74 72 65 65 5f 70 61 67 65 72 5f 72 65  *)btree_pager_re
72a0: 66 5f 64 75 6d 70 20 20 20 20 20 7d 2c 0a 20 20  f_dump     },.  
72b0: 20 20 20 7b 20 22 62 74 72 65 65 5f 63 75 72 73     { "btree_curs
72c0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
72d0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
72e0: 74 72 65 65 5f 63 75 72 73 6f 72 20 20 20 20 20  tree_cursor     
72f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
7300: 7b 20 22 62 74 72 65 65 5f 63 6c 6f 73 65 5f 63  { "btree_close_c
7310: 75 72 73 6f 72 22 2c 20 20 20 20 20 20 20 28 54  ursor",       (T
7320: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65  cl_CmdProc*)btre
7330: 65 5f 63 6c 6f 73 65 5f 63 75 72 73 6f 72 20 20  e_close_cursor  
7340: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
7350: 62 74 72 65 65 5f 6d 6f 76 65 5f 74 6f 22 2c 20  btree_move_to", 
7360: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
7370: 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6d  CmdProc*)btree_m
7380: 6f 76 65 5f 74 6f 20 20 20 20 20 20 20 20 20 20  ove_to          
7390: 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72    },.     { "btr
73a0: 65 65 5f 64 65 6c 65 74 65 22 2c 20 20 20 20 20  ee_delete",     
73b0: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
73c0: 50 72 6f 63 2a 29 62 74 72 65 65 5f 64 65 6c 65  Proc*)btree_dele
73d0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  te             }
73e0: 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f  ,.     { "btree_
73f0: 69 6e 73 65 72 74 22 2c 20 20 20 20 20 20 20 20  insert",        
7400: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
7410: 63 2a 29 62 74 72 65 65 5f 69 6e 73 65 72 74 20  c*)btree_insert 
7420: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7430: 20 20 20 20 7b 20 22 62 74 72 65 65 5f 6e 65 78      { "btree_nex
7440: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
7450: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
7460: 62 74 72 65 65 5f 6e 65 78 74 20 20 20 20 20 20  btree_next      
7470: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7480: 20 7b 20 22 62 74 72 65 65 5f 70 72 65 76 22 2c   { "btree_prev",
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
74a0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72  Tcl_CmdProc*)btr
74b0: 65 65 5f 70 72 65 76 20 20 20 20 20 20 20 20 20  ee_prev         
74c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
74d0: 22 62 74 72 65 65 5f 65 6f 66 22 2c 20 20 20 20  "btree_eof",    
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
74f0: 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f  _CmdProc*)btree_
7500: 65 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eof             
7510: 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74     },.     { "bt
7520: 72 65 65 5f 6b 65 79 73 69 7a 65 22 2c 20 20 20  ree_keysize",   
7530: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
7540: 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6b 65 79  dProc*)btree_key
7550: 73 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  size            
7560: 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65  },.     { "btree
7570: 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  _key",          
7580: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
7590: 6f 63 2a 29 62 74 72 65 65 5f 6b 65 79 20 20 20  oc*)btree_key   
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
75b0: 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 64 61       { "btree_da
75c0: 74 61 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ta",            
75d0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
75e0: 29 62 74 72 65 65 5f 64 61 74 61 20 20 20 20 20  )btree_data     
75f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7600: 20 20 7b 20 22 62 74 72 65 65 5f 70 61 79 6c 6f    { "btree_paylo
7610: 61 64 5f 73 69 7a 65 22 2c 20 20 20 20 20 20 20  ad_size",       
7620: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74  (Tcl_CmdProc*)bt
7630: 72 65 65 5f 70 61 79 6c 6f 61 64 5f 73 69 7a 65  ree_payload_size
7640: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
7650: 20 22 62 74 72 65 65 5f 66 69 72 73 74 22 2c 20   "btree_first", 
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
7670: 6c 5f 43 6d 64 50 72 6f 63 2a 29 62 74 72 65 65  l_CmdProc*)btree
7680: 5f 66 69 72 73 74 20 20 20 20 20 20 20 20 20 20  _first          
7690: 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
76a0: 74 72 65 65 5f 6c 61 73 74 22 2c 20 20 20 20 20  tree_last",     
76b0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
76c0: 6d 64 50 72 6f 63 2a 29 62 74 72 65 65 5f 6c 61  mdProc*)btree_la
76d0: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
76e0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 74 72 65   },.     { "btre
76f0: 65 5f 63 75 72 73 6f 72 5f 64 75 6d 70 22 2c 20  e_cursor_dump", 
7700: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
7710: 72 6f 63 2a 29 62 74 72 65 65 5f 63 75 72 73 6f  roc*)btree_curso
7720: 72 5f 64 75 6d 70 20 20 20 20 20 20 20 20 7d 2c  r_dump        },
7730: 0a 20 20 20 20 20 7b 20 22 62 74 72 65 65 5f 69  .     { "btree_i
7740: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 2c  ntegrity_check",
7750: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
7760: 2a 29 62 74 72 65 65 5f 69 6e 74 65 67 72 69 74  *)btree_integrit
7770: 79 5f 63 68 65 63 6b 20 20 20 20 7d 2c 0a 20 20  y_check    },.  
7780: 20 20 20 7b 20 22 62 74 72 65 65 5f 62 72 65 61     { "btree_brea
7790: 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  kpoint",        
77a0: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 62   (Tcl_CmdProc*)b
77b0: 74 72 65 65 5f 62 72 65 61 6b 70 6f 69 6e 74 20  tree_breakpoint 
77c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
77d0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
77e0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43  i=0; i<sizeof(aC
77f0: 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b  md)/sizeof(aCmd[
7800: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
7810: 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
7820: 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d  (interp, aCmd[i]
7830: 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e  .zName, aCmd[i].
7840: 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20  xProc, 0, 0);.  
7850: 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  }.  Tcl_LinkVar(
7860: 69 6e 74 65 72 70 2c 20 22 70 61 67 65 72 5f 72  interp, "pager_r
7870: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 22 2c 20  efinfo_enable", 
7880: 28 63 68 61 72 2a 29 26 70 61 67 65 72 33 5f 72  (char*)&pager3_r
7890: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 2c 0a 20  efinfo_enable,. 
78a0: 20 20 20 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54      TCL_LINK_INT
78b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
78c0: 4f 4b 3b 0a 7d 0a 0a 0a 0a                       OK;.}....