/ Hex Artifact Content
Login

Artifact e6bc9dba233bf1b57ca0a525a2bba762db4e223de84990739db3f09c46151b1e:


0000: 2f 2a 0a 2a 2a 20 41 20 75 74 69 6c 69 74 79 20  /*.** A utility 
0010: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 61 6c 6c  for printing all
0020: 20 6f 72 20 70 61 72 74 20 6f 66 20 61 6e 20 53   or part of an S
0030: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66  QLite database f
0040: 69 6c 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ile..*/.#include
0050: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0060: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 64  ude <ctype.h>.#d
0070: 65 66 69 6e 65 20 49 53 44 49 47 49 54 28 58 29  efine ISDIGIT(X)
0080: 20 69 73 64 69 67 69 74 28 28 75 6e 73 69 67 6e   isdigit((unsign
0090: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
00a0: 66 69 6e 65 20 49 53 50 52 49 4e 54 28 58 29 20  fine ISPRINT(X) 
00b0: 69 73 70 72 69 6e 74 28 28 75 6e 73 69 67 6e 65  isprint((unsigne
00c0: 64 20 63 68 61 72 29 28 58 29 29 0a 23 69 6e 63  d char)(X)).#inc
00d0: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
00e0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
00f0: 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  /stat.h>.#includ
0100: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 0a 23 69 66  e <fcntl.h>..#if
0110: 20 21 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56   !defined(_MSC_V
0120: 45 52 29 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  ER).#include <un
0130: 69 73 74 64 2e 68 3e 0a 23 65 6c 73 65 0a 23 69  istd.h>.#else.#i
0140: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 65  nclude <io.h>.#e
0150: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  ndif..#include <
0160: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
0170: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0180: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0190: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  >.#include "sqli
01a0: 74 65 33 2e 68 22 0a 0a 0a 73 74 61 74 69 63 20  te3.h"...static 
01b0: 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 44 61 74  struct GlobalDat
01c0: 61 20 7b 0a 20 20 69 6e 74 20 70 61 67 65 73 69  a {.  int pagesi
01d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
01e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
01f0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
0200: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 66 64 3b 20   */.  int dbfd; 
0210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0220: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
0230: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 72 65 61  scriptor for rea
0240: 64 69 6e 67 20 74 68 65 20 44 42 20 2a 2f 0a 20  ding the DB */. 
0250: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
0260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0270: 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 6e 75   /* Last page nu
0280: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 65  mber */.  int pe
0290: 72 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  rLine;          
02a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 45 58            /* HEX
02b0: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 70 72 69   elements to pri
02c0: 6e 74 20 70 65 72 20 6c 69 6e 65 20 2a 2f 0a 20  nt per line */. 
02d0: 20 69 6e 74 20 62 52 61 77 3b 20 20 20 20 20 20   int bRaw;      
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02f0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 61 63 63 65   /* True to acce
0300: 73 73 20 64 62 20 66 69 6c 65 20 76 69 61 20 4f  ss db file via O
0310: 53 20 41 50 49 73 20 2a 2f 0a 20 20 73 71 6c 69  S APIs */.  sqli
0320: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 3b 20 20  te3_file *pFd;  
0330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
0340: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
0350: 6f 72 20 6e 6f 6e 2d 72 61 77 20 6d 6f 64 65 20  or non-raw mode 
0360: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 44  */.  sqlite3 *pD
0370: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0380: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
0390: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
03a0: 73 20 70 46 64 20 2a 2f 0a 7d 20 67 20 3d 20 7b  s pFd */.} g = {
03b0: 31 30 32 34 2c 20 2d 31 2c 20 30 2c 20 31 36 2c  1024, -1, 0, 16,
03c0: 20 20 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 0a 74     0, 0, 0};...t
03d0: 79 70 65 64 65 66 20 6c 6f 6e 67 20 6c 6f 6e 67  ypedef long long
03e0: 20 69 6e 74 20 69 36 34 3b 20 20 20 20 20 20 2f   int i64;      /
03f0: 2a 20 44 61 74 61 74 79 70 65 20 66 6f 72 20 36  * Datatype for 6
0400: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20 2a  4-bit integers *
0410: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  /.../*.** Conver
0420: 74 20 74 68 65 20 76 61 72 2d 69 6e 74 20 66 6f  t the var-int fo
0430: 72 6d 61 74 20 69 6e 74 6f 20 69 36 34 2e 20 20  rmat into i64.  
0440: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
0450: 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 69 6e  r of bytes.** in
0460: 20 74 68 65 20 76 61 72 2d 69 6e 74 2e 20 20 57   the var-int.  W
0470: 72 69 74 65 20 74 68 65 20 76 61 72 2d 69 6e 74  rite the var-int
0480: 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 70 56 61   value into *pVa
0490: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
04a0: 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28 63 6f   decodeVarint(co
04b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
04c0: 72 20 2a 7a 2c 20 69 36 34 20 2a 70 56 61 6c 29  r *z, i64 *pVal)
04d0: 7b 0a 20 20 69 36 34 20 76 20 3d 20 30 3b 0a 20  {.  i64 v = 0;. 
04e0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
04f0: 30 3b 20 69 3c 38 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<8; i++){.  
0500: 20 20 76 20 3d 20 28 76 3c 3c 37 29 20 2b 20 28    v = (v<<7) + (
0510: 7a 5b 69 5d 26 30 78 37 66 29 3b 0a 20 20 20 20  z[i]&0x7f);.    
0520: 69 66 28 20 28 7a 5b 69 5d 26 30 78 38 30 29 3d  if( (z[i]&0x80)=
0530: 3d 30 20 29 7b 20 2a 70 56 61 6c 20 3d 20 76 3b  =0 ){ *pVal = v;
0540: 20 72 65 74 75 72 6e 20 69 2b 31 3b 20 7d 0a 20   return i+1; }. 
0550: 20 7d 0a 20 20 76 20 3d 20 28 76 3c 3c 38 29 20   }.  v = (v<<8) 
0560: 2b 20 28 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  + (z[i]&0xff);. 
0570: 20 2a 70 56 61 6c 20 3d 20 76 3b 0a 20 20 72 65   *pVal = v;.  re
0580: 74 75 72 6e 20 39 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 9;.}../*.**
0590: 20 45 78 74 72 61 63 74 20 61 20 62 69 67 2d 65   Extract a big-e
05a0: 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69 6e 74  ndian 32-bit int
05b0: 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75  eger.*/.static u
05c0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 64 65 63 6f  nsigned int deco
05d0: 64 65 49 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e  deInt32(const un
05e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b  signed char *z){
05f0: 0a 20 20 72 65 74 75 72 6e 20 28 7a 5b 30 5d 3c  .  return (z[0]<
0600: 3c 32 34 29 20 2b 20 28 7a 5b 31 5d 3c 3c 31 36  <24) + (z[1]<<16
0610: 29 20 2b 20 28 7a 5b 32 5d 3c 3c 38 29 20 2b 20  ) + (z[2]<<8) + 
0620: 7a 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 20 52 65 70 6f  z[3];.}../* Repo
0630: 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  rt an out-of-mem
0640: 6f 72 79 20 65 72 72 6f 72 20 61 6e 64 20 64 69  ory error and di
0650: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
0660: 64 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  d out_of_memory(
0670: 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66  void){.  fprintf
0680: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
0690: 6d 65 6d 6f 72 79 2e 2e 2e 5c 6e 22 29 3b 0a 20  memory...\n");. 
06a0: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(1);.}../*.
06b0: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
06c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
06d0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
06e0: 20 2a 6f 70 65 6e 44 61 74 61 62 61 73 65 28 63   *openDatabase(c
06f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 67 2c  onst char *zPrg,
0700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0710: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
0720: 64 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c  db = 0;.  int fl
0730: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
0740: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
0750: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
0760: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
0770: 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61 6d 65 2c  3_open_v2(zName,
0780: 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 30 29 3b   &db, flags, 0);
0790: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
07a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
07b0: 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73  t char *zErr = s
07c0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
07d0: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  );.    fprintf(s
07e0: 74 64 65 72 72 2c 20 22 25 73 3a 20 63 61 6e 27  tderr, "%s: can'
07f0: 74 20 6f 70 65 6e 20 25 73 20 28 25 73 29 5c 6e  t open %s (%s)\n
0800: 22 2c 20 7a 50 72 67 2c 20 7a 4e 61 6d 65 2c 20  ", zPrg, zName, 
0810: 7a 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  zErr);.    sqlit
0820: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
0830: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
0840: 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 2f   return db;.}../
0850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
08a0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6c 6f 77 2d 6c  ginning of low-l
08b0: 65 76 65 6c 20 66 69 6c 65 20 61 63 63 65 73 73  evel file access
08c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
08d0: 2a 20 41 6c 6c 20 6c 6f 77 2d 6c 65 76 65 6c 20  * All low-level 
08e0: 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
08f0: 74 61 62 61 73 65 20 66 69 6c 65 20 72 65 61 64  tabase file read
0900: 20 62 79 20 74 68 69 73 20 70 72 6f 67 72 61 6d   by this program
0910: 20 69 73 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64   is.** performed
0920: 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
0930: 77 69 6e 67 20 66 6f 75 72 20 66 75 6e 63 74 69  wing four functi
0940: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 69 6c  ons:.**.**   fil
0950: 65 4f 70 65 6e 28 29 20 20 20 20 20 2d 20 6f 70  eOpen()     - op
0960: 65 6e 20 74 68 65 20 64 62 20 66 69 6c 65 0a 2a  en the db file.*
0970: 2a 20 20 20 66 69 6c 65 43 6c 6f 73 65 28 29 20  *   fileClose() 
0980: 20 20 20 2d 20 63 6c 6f 73 65 20 74 68 65 20 64     - close the d
0990: 62 20 66 69 6c 65 0a 2a 2a 20 20 20 66 69 6c 65  b file.**   file
09a0: 52 65 61 64 28 29 20 20 20 20 20 2d 20 72 65 61  Read()     - rea
09b0: 64 20 72 61 77 20 64 61 74 61 20 66 72 6f 6d 20  d raw data from 
09c0: 74 68 65 20 64 62 20 66 69 6c 65 0a 2a 2a 20 20  the db file.**  
09d0: 20 66 69 6c 65 47 65 74 73 69 7a 65 28 29 20 20   fileGetsize()  
09e0: 2d 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a  - return the siz
09f0: 65 20 6f 66 20 74 68 65 20 64 62 20 66 69 6c 65  e of the db file
0a00: 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 0a 2f 2a   in bytes.*/../*
0a10: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 61 74  .** Open the dat
0a20: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
0a30: 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 4f  tatic void fileO
0a40: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
0a50: 7a 50 72 67 2c 20 63 6f 6e 73 74 20 63 68 61 72  zPrg, const char
0a60: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65   *zName){.  asse
0a70: 72 74 28 20 67 2e 64 62 66 64 3c 30 20 29 3b 0a  rt( g.dbfd<0 );.
0a80: 20 20 69 66 28 20 67 2e 62 52 61 77 3d 3d 30 20    if( g.bRaw==0 
0a90: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
0aa0: 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20     void *pArg = 
0ab0: 28 76 6f 69 64 20 2a 29 28 26 67 2e 70 46 64 29  (void *)(&g.pFd)
0ac0: 3b 0a 20 20 20 20 67 2e 70 44 62 20 3d 20 6f 70  ;.    g.pDb = op
0ad0: 65 6e 44 61 74 61 62 61 73 65 28 7a 50 72 67 2c  enDatabase(zPrg,
0ae0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20   zName);.    rc 
0af0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
0b00: 6f 6e 74 72 6f 6c 28 67 2e 70 44 62 2c 20 22 6d  ontrol(g.pDb, "m
0b10: 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ain", SQLITE_FCN
0b20: 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c  TL_FILE_POINTER,
0b30: 20 70 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   pArg);.    if( 
0b40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
0b50: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
0b60: 74 64 65 72 72 2c 20 0a 20 20 20 20 20 20 20 20  tderr, .        
0b70: 20 20 22 25 73 3a 20 66 61 69 6c 65 64 20 74 6f    "%s: failed to
0b80: 20 6f 62 74 61 69 6e 20 66 64 20 66 6f 72 20 25   obtain fd for %
0b90: 73 20 28 53 51 4c 69 74 65 20 74 6f 6f 20 6f 6c  s (SQLite too ol
0ba0: 64 3f 29 5c 6e 22 2c 20 7a 50 72 67 2c 20 7a 4e  d?)\n", zPrg, zN
0bb0: 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
0bc0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
0bd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  }.  }else{.    g
0be0: 2e 64 62 66 64 20 3d 20 6f 70 65 6e 28 7a 4e 61  .dbfd = open(zNa
0bf0: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  me, O_RDONLY);. 
0c00: 20 20 20 69 66 28 20 67 2e 64 62 66 64 3c 30 20     if( g.dbfd<0 
0c10: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
0c20: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e  (stderr,"%s: can
0c30: 27 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 7a  't open %s\n", z
0c40: 50 72 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Prg, zName);.   
0c50: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
0c60: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
0c70: 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73  lose the databas
0c80: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79  e file opened by
0c90: 20 66 69 6c 65 4f 70 65 6e 28 29 0a 2a 2f 0a 73   fileOpen().*/.s
0ca0: 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65 43  tatic void fileC
0cb0: 6c 6f 73 65 28 29 7b 0a 20 20 69 66 28 20 67 2e  lose(){.  if( g.
0cc0: 62 52 61 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  bRaw==0 ){.    s
0cd0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 70  qlite3_close(g.p
0ce0: 44 62 29 3b 0a 20 20 20 20 67 2e 70 44 62 20 3d  Db);.    g.pDb =
0cf0: 20 30 3b 0a 20 20 20 20 67 2e 70 46 64 20 3d 20   0;.    g.pFd = 
0d00: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
0d10: 63 6c 6f 73 65 28 67 2e 64 62 66 64 29 3b 0a 20  close(g.dbfd);. 
0d20: 20 20 20 67 2e 64 62 66 64 20 3d 20 2d 31 3b 0a     g.dbfd = -1;.
0d30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
0d40: 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
0d50: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  he file..**.** S
0d60: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
0d70: 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 62 74 61   content is obta
0d80: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
0d90: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6e  3_malloc() and n
0da0: 65 65 64 73 20 0a 2a 2a 20 74 6f 20 62 65 20 66  eeds .** to be f
0db0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
0dc0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  er..*/.static un
0dd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 69 6c  signed char *fil
0de0: 65 52 65 61 64 28 73 71 6c 69 74 65 33 5f 69 6e  eRead(sqlite3_in
0df0: 74 36 34 20 6f 66 73 74 2c 20 69 6e 74 20 6e 42  t64 ofst, int nB
0e00: 79 74 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  yte){.  unsigned
0e10: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20   char *aData;.  
0e20: 69 6e 74 20 67 6f 74 3b 0a 20 20 61 44 61 74 61  int got;.  aData
0e30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
0e40: 63 28 6e 42 79 74 65 2b 33 32 29 3b 0a 20 20 69  c(nByte+32);.  i
0e50: 66 28 20 61 44 61 74 61 3d 3d 30 20 29 20 6f 75  f( aData==0 ) ou
0e60: 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
0e70: 20 6d 65 6d 73 65 74 28 61 44 61 74 61 2c 20 30   memset(aData, 0
0e80: 2c 20 6e 42 79 74 65 2b 33 32 29 3b 0a 20 20 69  , nByte+32);.  i
0e90: 66 28 20 67 2e 62 52 61 77 3d 3d 30 20 29 7b 0a  f( g.bRaw==0 ){.
0ea0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 67 2e 70      int rc = g.p
0eb0: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52  Fd->pMethods->xR
0ec0: 65 61 64 28 67 2e 70 46 64 2c 20 28 76 6f 69 64  ead(g.pFd, (void
0ed0: 2a 29 61 44 61 74 61 2c 20 6e 42 79 74 65 2c 20  *)aData, nByte, 
0ee0: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  ofst);.    if( r
0ef0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
0f00: 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
0f10: 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
0f20: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
0f30: 65 72 72 2c 20 22 65 72 72 6f 72 20 69 6e 20 78  err, "error in x
0f40: 52 65 61 64 28 29 20 2d 20 25 64 5c 6e 22 2c 20  Read() - %d\n", 
0f50: 72 63 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  rc);.      exit(
0f60: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
0f70: 65 7b 0a 20 20 20 20 6c 73 65 65 6b 28 67 2e 64  e{.    lseek(g.d
0f80: 62 66 64 2c 20 28 6c 6f 6e 67 29 6f 66 73 74 2c  bfd, (long)ofst,
0f90: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
0fa0: 67 6f 74 20 3d 20 72 65 61 64 28 67 2e 64 62 66  got = read(g.dbf
0fb0: 64 2c 20 61 44 61 74 61 2c 20 6e 42 79 74 65 29  d, aData, nByte)
0fc0: 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3e 30 20  ;.    if( got>0 
0fd0: 26 26 20 67 6f 74 3c 6e 42 79 74 65 20 29 20 6d  && got<nByte ) m
0fe0: 65 6d 73 65 74 28 61 44 61 74 61 2b 67 6f 74 2c  emset(aData+got,
0ff0: 20 30 2c 20 6e 42 79 74 65 2d 67 6f 74 29 3b 0a   0, nByte-got);.
1000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 44 61    }.  return aDa
1010: 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
1020: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1030: 74 68 65 20 66 69 6c 65 20 69 6e 20 62 79 74 65  the file in byte
1040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
1050: 74 65 33 5f 69 6e 74 36 34 20 66 69 6c 65 47 65  te3_int64 fileGe
1060: 74 73 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73  tsize(void){.  s
1070: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 65 73  qlite3_int64 res
1080: 20 3d 20 30 3b 0a 20 20 69 66 28 20 67 2e 62 52   = 0;.  if( g.bR
1090: 61 77 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  aw==0 ){.    int
10a0: 20 72 63 20 3d 20 67 2e 70 46 64 2d 3e 70 4d 65   rc = g.pFd->pMe
10b0: 74 68 6f 64 73 2d 3e 78 46 69 6c 65 53 69 7a 65  thods->xFileSize
10c0: 28 67 2e 70 46 64 2c 20 26 72 65 73 29 3b 0a 20  (g.pFd, &res);. 
10d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 70  E_OK ){.      fp
10f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 65  rintf(stderr, "e
1100: 72 72 6f 72 20 69 6e 20 78 46 69 6c 65 53 69 7a  rror in xFileSiz
1110: 65 28 29 20 2d 20 25 64 5c 6e 22 2c 20 72 63 29  e() - %d\n", rc)
1120: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
1130: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1140: 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1150: 73 62 75 66 3b 0a 20 20 20 20 66 73 74 61 74 28  sbuf;.    fstat(
1160: 67 2e 64 62 66 64 2c 20 26 73 62 75 66 29 3b 0a  g.dbfd, &sbuf);.
1170: 20 20 20 20 72 65 73 20 3d 20 28 73 71 6c 69 74      res = (sqlit
1180: 65 33 5f 69 6e 74 36 34 29 28 73 62 75 66 2e 73  e3_int64)(sbuf.s
1190: 74 5f 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72  t_size);.  }.  r
11a0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
11b0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 6c 6f 77 2d 6c  .** End of low-l
11c0: 65 76 65 6c 20 66 69 6c 65 20 61 63 63 65 73 73  evel file access
11d0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 2a 2a   functions..****
11e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1220: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  ******/../*.** P
1230: 72 69 6e 74 20 61 20 72 61 6e 67 65 20 6f 66 20  rint a range of 
1240: 62 79 74 65 73 20 61 73 20 68 65 78 20 61 6e 64  bytes as hex and
1250: 20 61 73 20 61 73 63 69 69 2e 0a 2a 2f 0a 73 74   as ascii..*/.st
1260: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
1270: 61 72 20 2a 70 72 69 6e 74 5f 62 79 74 65 5f 72  ar *print_byte_r
1280: 61 6e 67 65 28 0a 20 20 69 6e 74 20 6f 66 73 74  ange(.  int ofst
1290: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
12a0: 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
12b0: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 74  range of bytes t
12c0: 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  o print */.  int
12d0: 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
12e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
12f0: 65 73 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20  es to print */. 
1300: 20 69 6e 74 20 70 72 69 6e 74 4f 66 73 74 20 20   int printOfst  
1310: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
1320: 61 6d 6f 75 6e 74 20 74 6f 20 74 68 65 20 69 6e  amount to the in
1330: 64 65 78 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  dex on the left 
1340: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 75  column */.){.  u
1350: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
1360: 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ata;.  int i, j;
1370: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1380: 4f 66 73 74 46 6d 74 3b 0a 0a 20 20 69 66 28 20  OfstFmt;..  if( 
1390: 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74  ((printOfst+nByt
13a0: 65 29 26 7e 30 78 66 66 66 29 3d 3d 30 20 29 7b  e)&~0xfff)==0 ){
13b0: 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20  .    zOfstFmt = 
13c0: 22 20 25 30 33 78 3a 20 22 3b 0a 20 20 7d 65 6c  " %03x: ";.  }el
13d0: 73 65 20 69 66 28 20 28 28 70 72 69 6e 74 4f 66  se if( ((printOf
13e0: 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66 66  st+nByte)&~0xfff
13f0: 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66  f)==0 ){.    zOf
1400: 73 74 46 6d 74 20 3d 20 22 20 25 30 34 78 3a 20  stFmt = " %04x: 
1410: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  ";.  }else if( (
1420: 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74 65  (printOfst+nByte
1430: 29 26 7e 30 78 66 66 66 66 66 29 3d 3d 30 20 29  )&~0xfffff)==0 )
1440: 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d  {.    zOfstFmt =
1450: 20 22 20 25 30 35 78 3a 20 22 3b 0a 20 20 7d 65   " %05x: ";.  }e
1460: 6c 73 65 20 69 66 28 20 28 28 70 72 69 6e 74 4f  lse if( ((printO
1470: 66 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66  fst+nByte)&~0xff
1480: 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ffff)==0 ){.    
1490: 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 36  zOfstFmt = " %06
14a0: 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  x: ";.  }else{. 
14b0: 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20     zOfstFmt = " 
14c0: 25 30 38 78 3a 20 22 3b 0a 20 20 7d 0a 0a 20 20  %08x: ";.  }..  
14d0: 61 44 61 74 61 20 3d 20 66 69 6c 65 52 65 61 64  aData = fileRead
14e0: 28 6f 66 73 74 2c 20 6e 42 79 74 65 29 3b 0a 20  (ofst, nByte);. 
14f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
1500: 65 3b 20 69 20 2b 3d 20 67 2e 70 65 72 4c 69 6e  e; i += g.perLin
1510: 65 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e){.    fprintf(
1520: 73 74 64 6f 75 74 2c 20 7a 4f 66 73 74 46 6d 74  stdout, zOfstFmt
1530: 2c 20 69 2b 70 72 69 6e 74 4f 66 73 74 29 3b 0a  , i+printOfst);.
1540: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 67      for(j=0; j<g
1550: 2e 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a  .perLine; j++){.
1560: 20 20 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 42        if( i+j>nB
1570: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  yte ){.        f
1580: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
1590: 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c     ");.      }el
15a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
15b0: 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 30 32 78  ntf(stdout,"%02x
15c0: 20 22 2c 20 61 44 61 74 61 5b 69 2b 6a 5d 29 3b   ", aData[i+j]);
15d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 67 2e     for(j=0; j<g.
15f0: 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20  perLine; j++){. 
1600: 20 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 42 79       if( i+j>nBy
1610: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  te ){.        fp
1620: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 20  rintf(stdout, " 
1630: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
1640: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1650: 28 73 74 64 6f 75 74 2c 22 25 63 22 2c 20 49 53  (stdout,"%c", IS
1660: 50 52 49 4e 54 28 61 44 61 74 61 5b 69 2b 6a 5d  PRINT(aData[i+j]
1670: 29 20 3f 20 61 44 61 74 61 5b 69 2b 6a 5d 20 3a  ) ? aData[i+j] :
1680: 20 27 2e 27 29 3b 0a 20 20 20 20 20 20 7d 0a 20   '.');.      }. 
1690: 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
16a0: 28 73 74 64 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (stdout,"\n");. 
16b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 44 61 74   }.  return aDat
16c0: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  a;.}../*.** Prin
16d0: 74 20 61 6e 20 65 6e 74 69 72 65 20 70 61 67 65  t an entire page
16e0: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 61 73 20 68   of content as h
16f0: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
1700: 64 20 70 72 69 6e 74 5f 70 61 67 65 28 69 6e 74  d print_page(int
1710: 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 69 53 74   iPg){.  int iSt
1720: 61 72 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  art;.  unsigned 
1730: 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69  char *aData;.  i
1740: 53 74 61 72 74 20 3d 20 28 69 50 67 2d 31 29 2a  Start = (iPg-1)*
1750: 67 2e 70 61 67 65 73 69 7a 65 3b 0a 20 20 66 70  g.pagesize;.  fp
1760: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 50  rintf(stdout, "P
1770: 61 67 65 20 25 64 3a 20 20 20 28 6f 66 66 73 65  age %d:   (offse
1780: 74 73 20 30 78 25 78 2e 2e 30 78 25 78 29 5c 6e  ts 0x%x..0x%x)\n
1790: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 50 67  ",.          iPg
17a0: 2c 20 69 53 74 61 72 74 2c 20 69 53 74 61 72 74  , iStart, iStart
17b0: 2b 67 2e 70 61 67 65 73 69 7a 65 2d 31 29 3b 0a  +g.pagesize-1);.
17c0: 20 20 61 44 61 74 61 20 3d 20 70 72 69 6e 74 5f    aData = print_
17d0: 62 79 74 65 5f 72 61 6e 67 65 28 69 53 74 61 72  byte_range(iStar
17e0: 74 2c 20 67 2e 70 61 67 65 73 69 7a 65 2c 20 30  t, g.pagesize, 0
17f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1800: 65 28 61 44 61 74 61 29 3b 0a 7d 0a 0a 0a 2f 2a  e(aData);.}.../*
1810: 20 50 72 69 6e 74 20 61 20 6c 69 6e 65 20 6f 66   Print a line of
1820: 20 64 65 63 6f 64 65 20 6f 75 74 70 75 74 20 73   decode output s
1830: 68 6f 77 69 6e 67 20 61 20 34 2d 62 79 74 65 20  howing a 4-byte 
1840: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1850: 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 64 65  ic void print_de
1860: 63 6f 64 65 5f 6c 69 6e 65 28 0a 20 20 75 6e 73  code_line(.  uns
1870: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
1880: 61 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  a,      /* Conte
1890: 6e 74 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  nt being decoded
18a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
18b0: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
18c0: 20 2f 2a 20 53 74 61 72 74 20 61 6e 64 20 73 69   /* Start and si
18d0: 7a 65 20 6f 66 20 64 65 63 6f 64 65 20 2a 2f 0a  ze of decode */.
18e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
18f0: 73 67 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sg           /* 
1900: 4d 65 73 73 61 67 65 20 74 6f 20 61 70 70 65 6e  Message to appen
1910: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  d */.){.  int i,
1920: 20 6a 3b 0a 20 20 69 6e 74 20 76 61 6c 20 3d 20   j;.  int val = 
1930: 61 44 61 74 61 5b 6f 66 73 74 5d 3b 0a 20 20 63  aData[ofst];.  c
1940: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
1950: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1960: 20 25 30 33 78 3a 20 25 30 32 78 22 2c 20 6f 66   %03x: %02x", of
1970: 73 74 2c 20 61 44 61 74 61 5b 6f 66 73 74 5d 29  st, aData[ofst])
1980: 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73 74 72  ;.  i = (int)str
1990: 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 66 6f 72  len(zBuf);.  for
19a0: 28 6a 3d 31 3b 20 6a 3c 34 3b 20 6a 2b 2b 29 7b  (j=1; j<4; j++){
19b0: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 6e 42 79 74  .    if( j>=nByt
19c0: 65 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  e ){.      sprin
19d0: 74 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 20  tf(&zBuf[i], "  
19e0: 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
19f0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a        sprintf(&z
1a00: 42 75 66 5b 69 5d 2c 20 22 20 25 30 32 78 22 2c  Buf[i], " %02x",
1a10: 20 61 44 61 74 61 5b 6f 66 73 74 2b 6a 5d 29 3b   aData[ofst+j]);
1a20: 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c  .      val = val
1a30: 2a 32 35 36 20 2b 20 61 44 61 74 61 5b 6f 66 73  *256 + aData[ofs
1a40: 74 2b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t+j];.    }.    
1a50: 69 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  i += (int)strlen
1a60: 28 26 7a 42 75 66 5b 69 5d 29 3b 0a 20 20 7d 0a  (&zBuf[i]);.  }.
1a70: 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b    sprintf(&zBuf[
1a80: 69 5d 2c 20 22 20 20 20 25 39 64 22 2c 20 76 61  i], "   %9d", va
1a90: 6c 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73  l);.  printf("%s
1aa0: 20 20 25 73 5c 6e 22 2c 20 7a 42 75 66 2c 20 7a    %s\n", zBuf, z
1ab0: 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Msg);.}../*.** D
1ac0: 65 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ecode the databa
1ad0: 73 65 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 73 74  se header..*/.st
1ae0: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f  atic void print_
1af0: 64 62 5f 68 65 61 64 65 72 28 76 6f 69 64 29 7b  db_header(void){
1b00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b10: 20 2a 61 44 61 74 61 3b 0a 20 20 61 44 61 74 61   *aData;.  aData
1b20: 20 3d 20 70 72 69 6e 74 5f 62 79 74 65 5f 72 61   = print_byte_ra
1b30: 6e 67 65 28 30 2c 20 31 30 30 2c 20 30 29 3b 0a  nge(0, 100, 0);.
1b40: 20 20 70 72 69 6e 74 66 28 22 44 65 63 6f 64 65    printf("Decode
1b50: 64 3a 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f  d:\n");.  print_
1b60: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
1b70: 61 2c 20 31 36 2c 20 32 2c 20 22 44 61 74 61 62  a, 16, 2, "Datab
1b80: 61 73 65 20 70 61 67 65 20 73 69 7a 65 22 29 3b  ase page size");
1b90: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1ba0: 6c 69 6e 65 28 61 44 61 74 61 2c 20 31 38 2c 20  line(aData, 18, 
1bb0: 31 2c 20 22 46 69 6c 65 20 66 6f 72 6d 61 74 20  1, "File format 
1bc0: 77 72 69 74 65 20 76 65 72 73 69 6f 6e 22 29 3b  write version");
1bd0: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1be0: 6c 69 6e 65 28 61 44 61 74 61 2c 20 31 39 2c 20  line(aData, 19, 
1bf0: 31 2c 20 22 46 69 6c 65 20 66 6f 72 6d 61 74 20  1, "File format 
1c00: 72 65 61 64 20 76 65 72 73 69 6f 6e 22 29 3b 0a  read version");.
1c10: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
1c20: 69 6e 65 28 61 44 61 74 61 2c 20 32 30 2c 20 31  ine(aData, 20, 1
1c30: 2c 20 22 52 65 73 65 72 76 65 64 20 73 70 61 63  , "Reserved spac
1c40: 65 20 61 74 20 65 6e 64 20 6f 66 20 70 61 67 65  e at end of page
1c50: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1c60: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 32  de_line(aData, 2
1c70: 34 2c 20 34 2c 20 22 46 69 6c 65 20 63 68 61 6e  4, 4, "File chan
1c80: 67 65 20 63 6f 75 6e 74 65 72 22 29 3b 0a 20 20  ge counter");.  
1c90: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1ca0: 65 28 61 44 61 74 61 2c 20 32 38 2c 20 34 2c 20  e(aData, 28, 4, 
1cb0: 22 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73  "Size of databas
1cc0: 65 20 69 6e 20 70 61 67 65 73 22 29 3b 0a 20 20  e in pages");.  
1cd0: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
1ce0: 65 28 61 44 61 74 61 2c 20 33 32 2c 20 34 2c 20  e(aData, 32, 4, 
1cf0: 22 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20  "Page number of 
1d00: 66 69 72 73 74 20 66 72 65 65 6c 69 73 74 20 70  first freelist p
1d10: 61 67 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  age");.  print_d
1d20: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
1d30: 2c 20 33 36 2c 20 34 2c 20 22 4e 75 6d 62 65 72  , 36, 4, "Number
1d40: 20 6f 66 20 66 72 65 65 6c 69 73 74 20 70 61 67   of freelist pag
1d50: 65 73 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  es");.  print_de
1d60: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1d70: 20 34 30 2c 20 34 2c 20 22 53 63 68 65 6d 61 20   40, 4, "Schema 
1d80: 63 6f 6f 6b 69 65 22 29 3b 0a 20 20 70 72 69 6e  cookie");.  prin
1d90: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1da0: 61 74 61 2c 20 34 34 2c 20 34 2c 20 22 53 63 68  ata, 44, 4, "Sch
1db0: 65 6d 61 20 66 6f 72 6d 61 74 20 76 65 72 73 69  ema format versi
1dc0: 6f 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  on");.  print_de
1dd0: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1de0: 20 34 38 2c 20 34 2c 20 22 44 65 66 61 75 6c 74   48, 4, "Default
1df0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
1e00: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1e10: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 35  de_line(aData, 5
1e20: 32 2c 20 34 2c 20 22 4c 61 72 67 65 73 74 20 61  2, 4, "Largest a
1e30: 75 74 6f 2d 76 61 63 20 72 6f 6f 74 20 70 61 67  uto-vac root pag
1e40: 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  e");.  print_dec
1e50: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
1e60: 35 36 2c 20 34 2c 20 22 54 65 78 74 20 65 6e 63  56, 4, "Text enc
1e70: 6f 64 69 6e 67 22 29 3b 0a 20 20 70 72 69 6e 74  oding");.  print
1e80: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1e90: 74 61 2c 20 36 30 2c 20 34 2c 20 22 55 73 65 72  ta, 60, 4, "User
1ea0: 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72   version");.  pr
1eb0: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1ec0: 61 44 61 74 61 2c 20 36 34 2c 20 34 2c 20 22 49  aData, 64, 4, "I
1ed0: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1ee0: 6d 20 6d 6f 64 65 22 29 3b 0a 20 20 70 72 69 6e  m mode");.  prin
1ef0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1f00: 61 74 61 2c 20 36 38 2c 20 34 2c 20 22 41 70 70  ata, 68, 4, "App
1f10: 6c 69 63 61 74 69 6f 6e 20 49 44 22 29 3b 0a 20  lication ID");. 
1f20: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1f30: 6e 65 28 61 44 61 74 61 2c 20 37 32 2c 20 34 2c  ne(aData, 72, 4,
1f40: 20 22 6d 65 74 61 5b 38 5d 22 29 3b 0a 20 20 70   "meta[8]");.  p
1f50: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1f60: 28 61 44 61 74 61 2c 20 37 36 2c 20 34 2c 20 22  (aData, 76, 4, "
1f70: 6d 65 74 61 5b 39 5d 22 29 3b 0a 20 20 70 72 69  meta[9]");.  pri
1f80: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
1f90: 44 61 74 61 2c 20 38 30 2c 20 34 2c 20 22 6d 65  Data, 80, 4, "me
1fa0: 74 61 5b 31 30 5d 22 29 3b 0a 20 20 70 72 69 6e  ta[10]");.  prin
1fb0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1fc0: 61 74 61 2c 20 38 34 2c 20 34 2c 20 22 6d 65 74  ata, 84, 4, "met
1fd0: 61 5b 31 31 5d 22 29 3b 0a 20 20 70 72 69 6e 74  a[11]");.  print
1fe0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1ff0: 74 61 2c 20 38 38 2c 20 34 2c 20 22 6d 65 74 61  ta, 88, 4, "meta
2000: 5b 31 32 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f  [12]");.  print_
2010: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
2020: 61 2c 20 39 32 2c 20 34 2c 20 22 43 68 61 6e 67  a, 92, 4, "Chang
2030: 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 76 65  e counter for ve
2040: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 22 29 3b 0a  rsion number");.
2050: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
2060: 69 6e 65 28 61 44 61 74 61 2c 20 39 36 2c 20 34  ine(aData, 96, 4
2070: 2c 20 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f  , "SQLite versio
2080: 6e 20 6e 75 6d 62 65 72 22 29 3b 0a 7d 0a 0a 2f  n number");.}../
2090: 2a 0a 2a 2a 20 44 65 73 63 72 69 62 65 20 63 65  *.** Describe ce
20a0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73  ll content..*/.s
20b0: 74 61 74 69 63 20 69 36 34 20 64 65 73 63 72 69  tatic i64 descri
20c0: 62 65 43 6f 6e 74 65 6e 74 28 0a 20 20 75 6e 73  beContent(.  uns
20d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 20  igned char *a,  
20e0: 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e       /* Cell con
20f0: 74 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4c  tent */.  i64 nL
2100: 6f 63 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ocal,           
2110: 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 61 5b    /* Bytes in a[
2120: 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  ] */.  char *zDe
2130: 73 63 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  sc             /
2140: 2a 20 57 72 69 74 65 20 64 65 73 63 72 69 70 74  * Write descript
2150: 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ion here */.){. 
2160: 20 69 36 34 20 6e 44 65 73 63 20 3d 20 30 3b 0a   i64 nDesc = 0;.
2170: 20 20 69 6e 74 20 6e 2c 20 6a 3b 0a 20 20 69 36    int n, j;.  i6
2180: 34 20 69 2c 20 78 2c 20 76 3b 0a 20 20 63 6f 6e  4 i, x, v;.  con
2190: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
21a0: 20 2a 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74   *pData;.  const
21b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21c0: 70 4c 69 6d 69 74 3b 0a 20 20 63 68 61 72 20 73  pLimit;.  char s
21d0: 65 70 20 3d 20 27 20 27 3b 0a 0a 20 20 70 4c 69  ep = ' ';..  pLi
21e0: 6d 69 74 20 3d 20 26 61 5b 6e 4c 6f 63 61 6c 5d  mit = &a[nLocal]
21f0: 3b 0a 20 20 6e 20 3d 20 64 65 63 6f 64 65 56 61  ;.  n = decodeVa
2200: 72 69 6e 74 28 61 2c 20 26 78 29 3b 0a 20 20 70  rint(a, &x);.  p
2210: 44 61 74 61 20 3d 20 26 61 5b 78 5d 3b 0a 20 20  Data = &a[x];.  
2220: 61 20 2b 3d 20 6e 3b 0a 20 20 69 20 3d 20 78 20  a += n;.  i = x 
2230: 2d 20 6e 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  - n;.  while( i>
2240: 30 20 26 26 20 70 44 61 74 61 3c 3d 70 4c 69 6d  0 && pData<=pLim
2250: 69 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 64 65  it ){.    n = de
2260: 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 78  codeVarint(a, &x
2270: 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20  );.    a += n;. 
2280: 20 20 20 69 20 2d 3d 20 6e 3b 0a 20 20 20 20 6e     i -= n;.    n
2290: 4c 6f 63 61 6c 20 2d 3d 20 6e 3b 0a 20 20 20 20  Local -= n;.    
22a0: 7a 44 65 73 63 5b 30 5d 20 3d 20 73 65 70 3b 0a  zDesc[0] = sep;.
22b0: 20 20 20 20 73 65 70 20 3d 20 27 2c 27 3b 0a 20      sep = ',';. 
22c0: 20 20 20 6e 44 65 73 63 2b 2b 3b 0a 20 20 20 20     nDesc++;.    
22d0: 7a 44 65 73 63 2b 2b 3b 0a 20 20 20 20 69 66 28  zDesc++;.    if(
22e0: 20 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   x==0 ){.      s
22f0: 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 2a  printf(zDesc, "*
2300: 22 29 3b 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 20  ");     /* NULL 
2310: 69 73 20 61 20 22 2a 22 20 2a 2f 0a 20 20 20 20  is a "*" */.    
2320: 7d 65 6c 73 65 20 69 66 28 20 78 3e 3d 31 20 26  }else if( x>=1 &
2330: 26 20 78 3c 3d 36 20 29 7b 0a 20 20 20 20 20 20  & x<=6 ){.      
2340: 76 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  v = (signed char
2350: 29 70 44 61 74 61 5b 30 5d 3b 0a 20 20 20 20 20  )pData[0];.     
2360: 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20   pData++;.      
2370: 73 77 69 74 63 68 28 20 78 20 29 7b 0a 20 20 20  switch( x ){.   
2380: 20 20 20 20 20 63 61 73 65 20 36 3a 20 20 76 20       case 6:  v 
2390: 3d 20 28 76 3c 3c 31 36 29 20 2b 20 28 70 44 61  = (v<<16) + (pDa
23a0: 74 61 5b 30 5d 3c 3c 38 29 20 2b 20 70 44 61 74  ta[0]<<8) + pDat
23b0: 61 5b 31 5d 3b 20 20 70 44 61 74 61 20 2b 3d 20  a[1];  pData += 
23c0: 32 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  2;.        case 
23d0: 35 3a 20 20 76 20 3d 20 28 76 3c 3c 31 36 29 20  5:  v = (v<<16) 
23e0: 2b 20 28 70 44 61 74 61 5b 30 5d 3c 3c 38 29 20  + (pData[0]<<8) 
23f0: 2b 20 70 44 61 74 61 5b 31 5d 3b 20 20 70 44 61  + pData[1];  pDa
2400: 74 61 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ta += 2;.       
2410: 20 63 61 73 65 20 34 3a 20 20 76 20 3d 20 28 76   case 4:  v = (v
2420: 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b  <<8) + pData[0];
2430: 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20    pData++;.     
2440: 20 20 20 63 61 73 65 20 33 3a 20 20 76 20 3d 20     case 3:  v = 
2450: 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30  (v<<8) + pData[0
2460: 5d 3b 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20  ];  pData++;.   
2470: 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 76 20       case 2:  v 
2480: 3d 20 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61  = (v<<8) + pData
2490: 5b 30 5d 3b 20 20 70 44 61 74 61 2b 2b 3b 0a 20  [0];  pData++;. 
24a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 70 72       }.      spr
24b0: 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 25 6c 6c  intf(zDesc, "%ll
24c0: 64 22 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73  d", v);.    }els
24d0: 65 20 69 66 28 20 78 3d 3d 37 20 29 7b 0a 20 20  e if( x==7 ){.  
24e0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73      sprintf(zDes
24f0: 63 2c 20 22 72 65 61 6c 22 29 3b 0a 20 20 20 20  c, "real");.    
2500: 20 20 70 44 61 74 61 20 2b 3d 20 38 3b 0a 20 20    pData += 8;.  
2510: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d 38    }else if( x==8
2520: 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74   ){.      sprint
2530: 66 28 7a 44 65 73 63 2c 20 22 30 22 29 3b 0a 20  f(zDesc, "0");. 
2540: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d     }else if( x==
2550: 39 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  9 ){.      sprin
2560: 74 66 28 7a 44 65 73 63 2c 20 22 31 22 29 3b 0a  tf(zDesc, "1");.
2570: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3e      }else if( x>
2580: 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 69 36 34  =12 ){.      i64
2590: 20 73 69 7a 65 20 3d 20 28 78 2d 31 32 29 2f 32   size = (x-12)/2
25a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 78 26 31  ;.      if( (x&1
25b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
25c0: 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22  sprintf(zDesc, "
25d0: 62 6c 6f 62 28 25 6c 6c 64 29 22 2c 20 73 69 7a  blob(%lld)", siz
25e0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
25f0: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
2600: 28 7a 44 65 73 63 2c 20 22 74 78 74 28 25 6c 6c  (zDesc, "txt(%ll
2610: 64 29 22 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  d)", size);.    
2620: 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20    }.      pData 
2630: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  += size;.    }. 
2640: 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c     j = (int)strl
2650: 65 6e 28 7a 44 65 73 63 29 3b 0a 20 20 20 20 7a  en(zDesc);.    z
2660: 44 65 73 63 20 2b 3d 20 6a 3b 0a 20 20 20 20 6e  Desc += j;.    n
2670: 44 65 73 63 20 2b 3d 20 6a 3b 0a 20 20 7d 0a 20  Desc += j;.  }. 
2680: 20 72 65 74 75 72 6e 20 6e 44 65 73 63 3b 0a 7d   return nDesc;.}
2690: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
26a0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
26b0: 64 20 73 69 7a 65 20 67 69 76 65 6e 20 74 68 65  d size given the
26c0: 20 74 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   total payload s
26d0: 69 7a 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70  ize and.** the p
26e0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  age size..*/.sta
26f0: 74 69 63 20 69 36 34 20 6c 6f 63 61 6c 50 61 79  tic i64 localPay
2700: 6c 6f 61 64 28 69 36 34 20 6e 50 61 79 6c 6f 61  load(i64 nPayloa
2710: 64 2c 20 63 68 61 72 20 63 54 79 70 65 29 7b 0a  d, char cType){.
2720: 20 20 69 36 34 20 6d 61 78 4c 6f 63 61 6c 3b 0a    i64 maxLocal;.
2730: 20 20 69 36 34 20 6d 69 6e 4c 6f 63 61 6c 3b 0a    i64 minLocal;.
2740: 20 20 69 36 34 20 73 75 72 70 6c 75 73 3b 0a 20    i64 surplus;. 
2750: 20 69 36 34 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69   i64 nLocal;.  i
2760: 66 28 20 63 54 79 70 65 3d 3d 31 33 20 29 7b 0a  f( cType==13 ){.
2770: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 65 61      /* Table lea
2780: 66 20 2a 2f 0a 20 20 20 20 6d 61 78 4c 6f 63 61  f */.    maxLoca
2790: 6c 20 3d 20 67 2e 70 61 67 65 73 69 7a 65 2d 33  l = g.pagesize-3
27a0: 35 3b 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  5;.    minLocal 
27b0: 3d 20 28 67 2e 70 61 67 65 73 69 7a 65 2d 31 32  = (g.pagesize-12
27c0: 29 2a 33 32 2f 32 35 35 2d 32 33 3b 0a 20 20 7d  )*32/255-23;.  }
27d0: 65 6c 73 65 7b 0a 20 20 20 20 6d 61 78 4c 6f 63  else{.    maxLoc
27e0: 61 6c 20 3d 20 28 67 2e 70 61 67 65 73 69 7a 65  al = (g.pagesize
27f0: 2d 31 32 29 2a 36 34 2f 32 35 35 2d 32 33 3b 0a  -12)*64/255-23;.
2800: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28      minLocal = (
2810: 67 2e 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 33  g.pagesize-12)*3
2820: 32 2f 32 35 35 2d 32 33 3b 0a 20 20 7d 0a 20 20  2/255-23;.  }.  
2830: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 6d 61 78  if( nPayload>max
2840: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 73 75 72  Local ){.    sur
2850: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
2860: 2b 20 28 6e 50 61 79 6c 6f 61 64 2d 6d 69 6e 4c  + (nPayload-minL
2870: 6f 63 61 6c 29 25 28 67 2e 70 61 67 65 73 69 7a  ocal)%(g.pagesiz
2880: 65 2d 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75  e-4);.    if( su
2890: 72 70 6c 75 73 3c 3d 6d 61 78 4c 6f 63 61 6c 20  rplus<=maxLocal 
28a0: 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
28b0: 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  = surplus;.    }
28c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 4c 6f 63  else{.      nLoc
28d0: 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  al = minLocal;. 
28e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
28f0: 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c    nLocal = nPayl
2900: 6f 61 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  oad;.  }.  retur
2910: 6e 20 6e 4c 6f 63 61 6c 3b 0a 7d 0a 20 20 0a 0a  n nLocal;.}.  ..
2920: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 64  /*.** Create a d
2930: 65 73 63 72 69 70 74 69 6f 6e 20 66 6f 72 20 61  escription for a
2940: 20 73 69 6e 67 6c 65 20 63 65 6c 6c 2e 0a 2a 2a   single cell..**
2950: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2960: 61 6c 75 65 20 69 73 20 74 68 65 20 6c 6f 63 61  alue is the loca
2970: 6c 20 63 65 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a  l cell size..*/.
2980: 73 74 61 74 69 63 20 69 36 34 20 64 65 73 63 72  static i64 descr
2990: 69 62 65 43 65 6c 6c 28 0a 20 20 75 6e 73 69 67  ibeCell(.  unsig
29a0: 6e 65 64 20 63 68 61 72 20 63 54 79 70 65 2c 20  ned char cType, 
29b0: 20 20 20 2f 2a 20 50 61 67 65 20 74 79 70 65 20     /* Page type 
29c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
29d0: 61 72 20 2a 61 2c 20 20 20 20 20 20 20 2f 2a 20  ar *a,       /* 
29e0: 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Cell content */.
29f0: 20 20 69 6e 74 20 73 68 6f 77 43 65 6c 6c 43 6f    int showCellCo
2a00: 6e 74 65 6e 74 2c 20 20 20 20 2f 2a 20 53 68 6f  ntent,    /* Sho
2a10: 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2a20: 66 20 74 72 75 65 20 2a 2f 0a 20 20 63 68 61 72  f true */.  char
2a30: 20 2a 2a 70 7a 44 65 73 63 20 20 20 20 20 20 20   **pzDesc       
2a40: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 64 65 73      /* Store des
2a50: 63 72 69 70 74 69 6f 6e 20 68 65 72 65 20 2a 2f  cription here */
2a60: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
2a70: 36 34 20 6e 44 65 73 63 20 3d 20 30 3b 0a 20 20  64 nDesc = 0;.  
2a80: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
2a90: 20 6c 65 66 74 43 68 69 6c 64 3b 0a 20 20 69 36   leftChild;.  i6
2aa0: 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 36  4 nPayload;.  i6
2ab0: 34 20 72 6f 77 69 64 3b 0a 20 20 69 36 34 20 6e  4 rowid;.  i64 n
2ac0: 4c 6f 63 61 6c 3b 0a 20 20 73 74 61 74 69 63 20  Local;.  static 
2ad0: 63 68 61 72 20 7a 44 65 73 63 5b 31 30 30 30 5d  char zDesc[1000]
2ae0: 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  i = 0;.  if(
2af0: 20 63 54 79 70 65 3c 3d 35 20 29 7b 0a 20 20 20   cType<=5 ){.   
2b00: 20 6c 65 66 74 43 68 69 6c 64 20 3d 20 28 28 61   leftChild = ((a
2b10: 5b 30 5d 2a 32 35 36 20 2b 20 61 5b 31 5d 29 2a  [0]*256 + a[1])*
2b20: 32 35 36 20 2b 20 61 5b 32 5d 29 2a 32 35 36 20  256 + a[2])*256 
2b30: 2b 20 61 5b 33 5d 3b 0a 20 20 20 20 61 20 2b 3d  + a[3];.    a +=
2b40: 20 34 3b 0a 20 20 20 20 6e 20 2b 3d 20 34 3b 0a   4;.    n += 4;.
2b50: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73      sprintf(zDes
2b60: 63 2c 20 22 6c 78 3a 20 25 64 20 22 2c 20 6c 65  c, "lx: %d ", le
2b70: 66 74 43 68 69 6c 64 29 3b 0a 20 20 20 20 6e 44  ftChild);.    nD
2b80: 65 73 63 20 3d 20 73 74 72 6c 65 6e 28 7a 44 65  esc = strlen(zDe
2b90: 73 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  sc);.  }.  if( c
2ba0: 54 79 70 65 21 3d 35 20 29 7b 0a 20 20 20 20 69  Type!=5 ){.    i
2bb0: 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28   = decodeVarint(
2bc0: 61 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  a, &nPayload);. 
2bd0: 20 20 20 61 20 2b 3d 20 69 3b 0a 20 20 20 20 6e     a += i;.    n
2be0: 20 2b 3d 20 69 3b 0a 20 20 20 20 73 70 72 69 6e   += i;.    sprin
2bf0: 74 66 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d  tf(&zDesc[nDesc]
2c00: 2c 20 22 6e 3a 20 25 6c 6c 64 20 22 2c 20 6e 50  , "n: %lld ", nP
2c10: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 44 65  ayload);.    nDe
2c20: 73 63 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 44  sc += strlen(&zD
2c30: 65 73 63 5b 6e 44 65 73 63 5d 29 3b 0a 20 20 20  esc[nDesc]);.   
2c40: 20 6e 4c 6f 63 61 6c 20 3d 20 6c 6f 63 61 6c 50   nLocal = localP
2c50: 61 79 6c 6f 61 64 28 6e 50 61 79 6c 6f 61 64 2c  ayload(nPayload,
2c60: 20 63 54 79 70 65 29 3b 0a 20 20 7d 65 6c 73 65   cType);.  }else
2c70: 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
2c80: 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 7d   nLocal = 0;.  }
2c90: 0a 20 20 69 66 28 20 63 54 79 70 65 3d 3d 35 20  .  if( cType==5 
2ca0: 7c 7c 20 63 54 79 70 65 3d 3d 31 33 20 29 7b 0a  || cType==13 ){.
2cb0: 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56 61      i = decodeVa
2cc0: 72 69 6e 74 28 61 2c 20 26 72 6f 77 69 64 29 3b  rint(a, &rowid);
2cd0: 0a 20 20 20 20 61 20 2b 3d 20 69 3b 0a 20 20 20  .    a += i;.   
2ce0: 20 6e 20 2b 3d 20 69 3b 0a 20 20 20 20 73 70 72   n += i;.    spr
2cf0: 69 6e 74 66 28 26 7a 44 65 73 63 5b 6e 44 65 73  intf(&zDesc[nDes
2d00: 63 5d 2c 20 22 72 3a 20 25 6c 6c 64 20 22 2c 20  c], "r: %lld ", 
2d10: 72 6f 77 69 64 29 3b 0a 20 20 20 20 6e 44 65 73  rowid);.    nDes
2d20: 63 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 44 65  c += strlen(&zDe
2d30: 73 63 5b 6e 44 65 73 63 5d 29 3b 0a 20 20 7d 0a  sc[nDesc]);.  }.
2d40: 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61    if( nLocal<nPa
2d50: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e 74  yload ){.    int
2d60: 20 6f 76 66 6c 3b 0a 20 20 20 20 75 6e 73 69 67   ovfl;.    unsig
2d70: 6e 65 64 20 63 68 61 72 20 2a 62 20 3d 20 26 61  ned char *b = &a
2d80: 5b 6e 4c 6f 63 61 6c 5d 3b 0a 20 20 20 20 6f 76  [nLocal];.    ov
2d90: 66 6c 20 3d 20 28 28 62 5b 30 5d 2a 32 35 36 20  fl = ((b[0]*256 
2da0: 2b 20 62 5b 31 5d 29 2a 32 35 36 20 2b 20 62 5b  + b[1])*256 + b[
2db0: 32 5d 29 2a 32 35 36 20 2b 20 62 5b 33 5d 3b 0a  2])*256 + b[3];.
2dc0: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 44 65      sprintf(&zDe
2dd0: 73 63 5b 6e 44 65 73 63 5d 2c 20 22 6f 76 3a 20  sc[nDesc], "ov: 
2de0: 25 64 20 22 2c 20 6f 76 66 6c 29 3b 0a 20 20 20  %d ", ovfl);.   
2df0: 20 6e 44 65 73 63 20 2b 3d 20 73 74 72 6c 65 6e   nDesc += strlen
2e00: 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 29 3b  (&zDesc[nDesc]);
2e10: 0a 20 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20 7d  .    n += 4;.  }
2e20: 0a 20 20 69 66 28 20 73 68 6f 77 43 65 6c 6c 43  .  if( showCellC
2e30: 6f 6e 74 65 6e 74 20 26 26 20 63 54 79 70 65 21  ontent && cType!
2e40: 3d 35 20 29 7b 0a 20 20 20 20 6e 44 65 73 63 20  =5 ){.    nDesc 
2e50: 2b 3d 20 64 65 73 63 72 69 62 65 43 6f 6e 74 65  += describeConte
2e60: 6e 74 28 61 2c 20 6e 4c 6f 63 61 6c 2c 20 26 7a  nt(a, nLocal, &z
2e70: 44 65 73 63 5b 6e 44 65 73 63 2d 31 5d 29 3b 0a  Desc[nDesc-1]);.
2e80: 20 20 7d 0a 20 20 2a 70 7a 44 65 73 63 20 3d 20    }.  *pzDesc = 
2e90: 7a 44 65 73 63 3b 0a 20 20 72 65 74 75 72 6e 20  zDesc;.  return 
2ea0: 6e 4c 6f 63 61 6c 2b 6e 3b 0a 7d 0a 0a 2f 2a 20  nLocal+n;.}../* 
2eb0: 50 72 69 6e 74 20 61 6e 20 6f 66 66 73 65 74 20  Print an offset 
2ec0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 42 79 74  followed by nByt
2ed0: 65 20 62 79 74 65 73 2e 20 20 41 64 64 20 65 78  e bytes.  Add ex
2ee0: 74 72 61 20 77 68 69 74 65 2d 73 70 61 63 65 0a  tra white-space.
2ef0: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
2f00: 20 74 68 61 74 20 73 75 62 73 65 71 75 65 6e 74   that subsequent
2f10: 20 74 65 78 74 20 69 73 20 61 6c 69 67 6e 65 64   text is aligned
2f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f30: 20 70 72 69 6e 74 42 79 74 65 73 28 0a 20 20 75   printBytes(.  u
2f40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
2f50: 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ata,      /* Con
2f60: 74 65 6e 74 20 62 65 69 6e 67 20 64 65 63 6f 64  tent being decod
2f70: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
2f80: 20 63 68 61 72 20 2a 61 53 74 61 72 74 2c 20 20   char *aStart,  
2f90: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63     /* Start of c
2fa0: 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 70 72 69  ontent to be pri
2fb0: 6e 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  nted */.  int nB
2fc0: 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
2fd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fe0: 66 20 62 79 74 65 73 20 74 6f 20 70 72 69 6e 74  f bytes to print
2ff0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   */.){.  int j;.
3000: 20 20 70 72 69 6e 74 66 28 22 20 25 30 33 78 3a    printf(" %03x:
3010: 20 22 2c 20 28 69 6e 74 29 28 61 53 74 61 72 74   ", (int)(aStart
3020: 2d 61 44 61 74 61 29 29 3b 0a 20 20 66 6f 72 28  -aData));.  for(
3030: 6a 3d 30 3b 20 6a 3c 39 3b 20 6a 2b 2b 29 7b 0a  j=0; j<9; j++){.
3040: 20 20 20 20 69 66 28 20 6a 3e 3d 6e 42 79 74 65      if( j>=nByte
3050: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
3060: 28 22 20 20 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ("   ");.    }el
3070: 73 65 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  se{.      printf
3080: 28 22 25 30 32 78 20 22 2c 20 61 53 74 61 72 74  ("%02x ", aStart
3090: 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [j]);.    }.  }.
30a0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
30b0: 61 20 66 75 6c 6c 20 64 65 63 6f 64 65 20 6f 6e  a full decode on
30c0: 20 73 74 64 6f 75 74 20 66 6f 72 20 74 68 65 20   stdout for the 
30d0: 63 65 6c 6c 20 61 74 20 61 5b 6f 66 73 74 5d 2e  cell at a[ofst].
30e0: 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 65 20 70  .** Assume the p
30f0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 68  age contains a h
3100: 65 61 64 65 72 20 6f 66 20 73 69 7a 65 20 73 7a  eader of size sz
3110: 50 67 48 64 72 20 62 79 74 65 73 2e 0a 2a 2f 0a  PgHdr bytes..*/.
3120: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f  static void deco
3130: 64 65 43 65 6c 6c 28 0a 20 20 75 6e 73 69 67 6e  deCell(.  unsign
3140: 65 64 20 63 68 61 72 20 2a 61 2c 20 20 20 20 20  ed char *a,     
3150: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
3160: 74 20 28 77 69 74 68 6f 75 74 20 74 68 65 20 70  t (without the p
3170: 61 67 65 2d 31 20 68 65 61 64 65 72 29 20 2a 2f  age-1 header) */
3180: 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 6e 6f  .  unsigned pgno
3190: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
31a0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
31b0: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
31c0: 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69         /* Cell i
31d0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ndex */.  int sz
31e0: 50 67 48 64 72 2c 20 20 20 20 20 20 20 20 20 20  PgHdr,          
31f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
3200: 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 30   page header.  0
3210: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 69 6e 74   or 100 */.  int
3220: 20 6f 66 73 74 20 20 20 20 20 20 20 20 20 20 20   ofst           
3230: 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 62 65 67       /* Cell beg
3240: 69 6e 73 20 61 74 20 61 5b 6f 66 73 74 5d 20 2a  ins at a[ofst] *
3250: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 20  /.){.  int i, j 
3260: 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 65 66 74 43  = 0;.  int leftC
3270: 68 69 6c 64 3b 0a 20 20 69 36 34 20 6b 3b 0a 20  hild;.  i64 k;. 
3280: 20 69 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   i64 nPayload;. 
3290: 20 69 36 34 20 72 6f 77 69 64 3b 0a 20 20 69 36   i64 rowid;.  i6
32a0: 34 20 6e 48 64 72 3b 0a 20 20 69 36 34 20 69 54  4 nHdr;.  i64 iT
32b0: 79 70 65 3b 0a 20 20 69 36 34 20 6e 4c 6f 63 61  ype;.  i64 nLoca
32c0: 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
32d0: 61 72 20 2a 78 20 3d 20 61 20 2b 20 6f 66 73 74  ar *x = a + ofst
32e0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
32f0: 72 20 2a 65 6e 64 3b 0a 20 20 75 6e 73 69 67 6e  r *end;.  unsign
3300: 65 64 20 63 68 61 72 20 63 54 79 70 65 20 3d 20  ed char cType = 
3310: 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  a[0];.  int nCol
3320: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 43 6f   = 0;.  int szCo
3330: 6c 5b 32 30 30 30 5d 3b 0a 20 20 69 6e 74 20 6f  l[2000];.  int o
3340: 66 73 74 43 6f 6c 5b 32 30 30 30 5d 3b 0a 20 20  fstCol[2000];.  
3350: 69 6e 74 20 74 79 70 65 43 6f 6c 5b 32 30 30 30  int typeCol[2000
3360: 5d 3b 0a 0a 20 20 70 72 69 6e 74 66 28 22 43 65  ];..  printf("Ce
3370: 6c 6c 5b 25 64 5d 3a 5c 6e 22 2c 20 69 43 65 6c  ll[%d]:\n", iCel
3380: 6c 29 3b 0a 20 20 69 66 28 20 63 54 79 70 65 3c  l);.  if( cType<
3390: 3d 35 20 29 7b 0a 20 20 20 20 6c 65 66 74 43 68  =5 ){.    leftCh
33a0: 69 6c 64 20 3d 20 28 28 78 5b 30 5d 2a 32 35 36  ild = ((x[0]*256
33b0: 20 2b 20 78 5b 31 5d 29 2a 32 35 36 20 2b 20 78   + x[1])*256 + x
33c0: 5b 32 5d 29 2a 32 35 36 20 2b 20 78 5b 33 5d 3b  [2])*256 + x[3];
33d0: 0a 20 20 20 20 70 72 69 6e 74 42 79 74 65 73 28  .    printBytes(
33e0: 61 2c 20 78 2c 20 34 29 3b 0a 20 20 20 20 70 72  a, x, 4);.    pr
33f0: 69 6e 74 66 28 22 6c 65 66 74 20 63 68 69 6c 64  intf("left child
3400: 20 70 61 67 65 3a 3a 20 25 64 5c 6e 22 2c 20 6c   page:: %d\n", l
3410: 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 20 20 78  eftChild);.    x
3420: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
3430: 20 63 54 79 70 65 21 3d 35 20 29 7b 0a 20 20 20   cType!=5 ){.   
3440: 20 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e   i = decodeVarin
3450: 74 28 78 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b  t(x, &nPayload);
3460: 0a 20 20 20 20 70 72 69 6e 74 42 79 74 65 73 28  .    printBytes(
3470: 61 2c 20 78 2c 20 69 29 3b 0a 20 20 20 20 6e 4c  a, x, i);.    nL
3480: 6f 63 61 6c 20 3d 20 6c 6f 63 61 6c 50 61 79 6c  ocal = localPayl
3490: 6f 61 64 28 6e 50 61 79 6c 6f 61 64 2c 20 63 54  oad(nPayload, cT
34a0: 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  ype);.    if( nL
34b0: 6f 63 61 6c 3d 3d 6e 50 61 79 6c 6f 61 64 20 29  ocal==nPayload )
34c0: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
34d0: 70 61 79 6c 6f 61 64 2d 73 69 7a 65 3a 20 25 6c  payload-size: %l
34e0: 6c 64 5c 6e 22 2c 20 6e 50 61 79 6c 6f 61 64 29  ld\n", nPayload)
34f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3500: 20 20 20 70 72 69 6e 74 66 28 22 70 61 79 6c 6f     printf("paylo
3510: 61 64 2d 73 69 7a 65 3a 20 25 6c 6c 64 20 28 25  ad-size: %lld (%
3520: 6c 6c 64 20 6c 6f 63 61 6c 2c 20 25 6c 6c 64 20  lld local, %lld 
3530: 6f 76 65 72 66 6c 6f 77 29 5c 6e 22 2c 0a 20 20  overflow)\n",.  
3540: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 79 6c             nPayl
3550: 6f 61 64 2c 20 6e 4c 6f 63 61 6c 2c 20 6e 50 61  oad, nLocal, nPa
3560: 79 6c 6f 61 64 2d 6e 4c 6f 63 61 6c 29 3b 0a 20  yload-nLocal);. 
3570: 20 20 20 7d 0a 20 20 20 20 78 20 2b 3d 20 69 3b     }.    x += i;
3580: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
3590: 61 79 6c 6f 61 64 20 3d 20 6e 4c 6f 63 61 6c 20  ayload = nLocal 
35a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6e 64 20 3d  = 0;.  }.  end =
35b0: 20 78 20 2b 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69   x + nLocal;.  i
35c0: 66 28 20 63 54 79 70 65 3d 3d 35 20 7c 7c 20 63  f( cType==5 || c
35d0: 54 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20 20 20  Type==13 ){.    
35e0: 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  i = decodeVarint
35f0: 28 78 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  (x, &rowid);.   
3600: 20 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20 78   printBytes(a, x
3610: 2c 20 69 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , i);.    printf
3620: 28 22 72 6f 77 69 64 3a 20 25 6c 6c 64 5c 6e 22  ("rowid: %lld\n"
3630: 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 78 20  , rowid);.    x 
3640: 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += i;.  }.  if( 
3650: 6e 4c 6f 63 61 6c 3e 30 20 29 7b 0a 20 20 20 20  nLocal>0 ){.    
3660: 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  i = decodeVarint
3670: 28 78 2c 20 26 6e 48 64 72 29 3b 0a 20 20 20 20  (x, &nHdr);.    
3680: 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20 78 2c  printBytes(a, x,
3690: 20 69 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   i);.    printf(
36a0: 22 72 65 63 6f 72 64 2d 68 65 61 64 65 72 2d 73  "record-header-s
36b0: 69 7a 65 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74  ize: %d\n", (int
36c0: 29 6e 48 64 72 29 3b 0a 20 20 20 20 6a 20 3d 20  )nHdr);.    j = 
36d0: 69 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  i;.    nCol = 0;
36e0: 0a 20 20 20 20 6b 20 3d 20 6e 48 64 72 3b 0a 20  .    k = nHdr;. 
36f0: 20 20 20 77 68 69 6c 65 28 20 78 2b 6a 3c 3d 65     while( x+j<=e
3700: 6e 64 20 26 26 20 6a 3c 6e 48 64 72 20 29 7b 0a  nd && j<nHdr ){.
3710: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
3720: 72 20 2a 7a 54 79 70 65 4e 61 6d 65 3b 0a 20 20  r *zTypeName;.  
3730: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 30 3b       int sz = 0;
3740: 0a 20 20 20 20 20 20 20 63 68 61 72 20 7a 4e 6d  .       char zNm
3750: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 69 20 3d  [30];.       i =
3760: 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28 78 2b   decodeVarint(x+
3770: 6a 2c 20 26 69 54 79 70 65 29 3b 0a 20 20 20 20  j, &iType);.    
3780: 20 20 20 70 72 69 6e 74 42 79 74 65 73 28 61 2c     printBytes(a,
3790: 20 78 2b 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20   x+j, i);.      
37a0: 20 70 72 69 6e 74 66 28 22 74 79 70 65 63 6f 64   printf("typecod
37b0: 65 5b 25 64 5d 3a 20 25 64 20 2d 20 22 2c 20 6e  e[%d]: %d - ", n
37c0: 43 6f 6c 2c 20 28 69 6e 74 29 69 54 79 70 65 29  Col, (int)iType)
37d0: 3b 0a 20 20 20 20 20 20 20 73 77 69 74 63 68 28  ;.       switch(
37e0: 20 69 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   iType ){.      
37f0: 20 20 20 63 61 73 65 20 30 3a 20 20 7a 54 79 70     case 0:  zTyp
3800: 65 4e 61 6d 65 20 3d 20 22 4e 55 4c 4c 22 3b 20  eName = "NULL"; 
3810: 20 20 20 73 7a 20 3d 20 30 3b 20 20 62 72 65 61     sz = 0;  brea
3820: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
3830: 20 31 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d   1:  zTypeName =
3840: 20 22 69 6e 74 38 22 3b 20 20 20 20 73 7a 20 3d   "int8";    sz =
3850: 20 31 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20   1;  break;.    
3860: 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a 54       case 2:  zT
3870: 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74 31 36  ypeName = "int16
3880: 22 3b 20 20 20 73 7a 20 3d 20 32 3b 20 20 62 72  ";   sz = 2;  br
3890: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
38a0: 73 65 20 33 3a 20 20 7a 54 79 70 65 4e 61 6d 65  se 3:  zTypeName
38b0: 20 3d 20 22 69 6e 74 32 34 22 3b 20 20 20 73 7a   = "int24";   sz
38c0: 20 3d 20 33 3b 20 20 62 72 65 61 6b 3b 0a 20 20   = 3;  break;.  
38d0: 20 20 20 20 20 20 20 63 61 73 65 20 34 3a 20 20         case 4:  
38e0: 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74  zTypeName = "int
38f0: 33 32 22 3b 20 20 20 73 7a 20 3d 20 34 3b 20 20  32";   sz = 4;  
3900: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
3910: 63 61 73 65 20 35 3a 20 20 7a 54 79 70 65 4e 61  case 5:  zTypeNa
3920: 6d 65 20 3d 20 22 69 6e 74 34 38 22 3b 20 20 20  me = "int48";   
3930: 73 7a 20 3d 20 36 3b 20 20 62 72 65 61 6b 3b 0a  sz = 6;  break;.
3940: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 36 3a           case 6:
3950: 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22 69    zTypeName = "i
3960: 6e 74 36 34 22 3b 20 20 20 73 7a 20 3d 20 38 3b  nt64";   sz = 8;
3970: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3980: 20 20 63 61 73 65 20 37 3a 20 20 7a 54 79 70 65    case 7:  zType
3990: 4e 61 6d 65 20 3d 20 22 64 6f 75 62 6c 65 22 3b  Name = "double";
39a0: 20 20 73 7a 20 3d 20 38 3b 20 20 62 72 65 61 6b    sz = 8;  break
39b0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
39c0: 38 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20  8:  zTypeName = 
39d0: 22 7a 65 72 6f 22 3b 20 20 20 20 73 7a 20 3d 20  "zero";    sz = 
39e0: 30 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0;  break;.     
39f0: 20 20 20 20 63 61 73 65 20 39 3a 20 20 7a 54 79      case 9:  zTy
3a00: 70 65 4e 61 6d 65 20 3d 20 22 6f 6e 65 22 3b 20  peName = "one"; 
3a10: 20 20 20 20 73 7a 20 3d 20 30 3b 20 20 62 72 65      sz = 0;  bre
3a20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
3a30: 65 20 31 30 3a 0a 20 20 20 20 20 20 20 20 20 63  e 10:.         c
3a40: 61 73 65 20 31 31 3a 20 7a 54 79 70 65 4e 61 6d  ase 11: zTypeNam
3a50: 65 20 3d 20 22 65 72 72 6f 72 22 3b 20 20 20 73  e = "error";   s
3a60: 7a 20 3d 20 30 3b 20 20 62 72 65 61 6b 3b 0a 20  z = 0;  break;. 
3a70: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
3a80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 73 7a   {.           sz
3a90: 20 3d 20 28 69 6e 74 29 28 69 54 79 70 65 2d 31   = (int)(iType-1
3aa0: 32 29 2f 32 3b 0a 20 20 20 20 20 20 20 20 20 20  2)/2;.          
3ab0: 20 73 70 72 69 6e 74 66 28 7a 4e 6d 2c 20 28 69   sprintf(zNm, (i
3ac0: 54 79 70 65 26 31 29 3d 3d 30 20 3f 20 22 62 6c  Type&1)==0 ? "bl
3ad0: 6f 62 28 25 64 29 22 20 3a 20 22 74 65 78 74 28  ob(%d)" : "text(
3ae0: 25 64 29 22 2c 20 73 7a 29 3b 0a 20 20 20 20 20  %d)", sz);.     
3af0: 20 20 20 20 20 20 7a 54 79 70 65 4e 61 6d 65 20        zTypeName 
3b00: 3d 20 7a 4e 6d 3b 0a 20 20 20 20 20 20 20 20 20  = zNm;.         
3b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3b20: 20 20 7d 0a 20 20 20 20 20 20 20 7d 0a 20 20 20    }.       }.   
3b30: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e      printf("%s\n
3b40: 22 2c 20 7a 54 79 70 65 4e 61 6d 65 29 3b 0a 20  ", zTypeName);. 
3b50: 20 20 20 20 20 20 73 7a 43 6f 6c 5b 6e 43 6f 6c        szCol[nCol
3b60: 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 6f  ] = sz;.       o
3b70: 66 73 74 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 28  fstCol[nCol] = (
3b80: 69 6e 74 29 6b 3b 0a 20 20 20 20 20 20 20 74 79  int)k;.       ty
3b90: 70 65 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 28 69  peCol[nCol] = (i
3ba0: 6e 74 29 69 54 79 70 65 3b 0a 20 20 20 20 20 20  nt)iType;.      
3bb0: 20 6b 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20   k += sz;.      
3bc0: 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
3bd0: 6a 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  j += i;.    }.  
3be0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
3bf0: 6c 20 26 26 20 6f 66 73 74 43 6f 6c 5b 69 5d 2b  l && ofstCol[i]+
3c00: 73 7a 43 6f 6c 5b 69 5d 3c 3d 6e 4c 6f 63 61 6c  szCol[i]<=nLocal
3c10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69  ; i++){.       i
3c20: 6e 74 20 73 20 3d 20 6f 66 73 74 43 6f 6c 5b 69  nt s = ofstCol[i
3c30: 5d 3b 0a 20 20 20 20 20 20 20 69 36 34 20 76 3b  ];.       i64 v;
3c40: 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  .       const un
3c50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
3c60: 74 61 3b 0a 20 20 20 20 20 20 20 69 66 28 20 73  ta;.       if( s
3c70: 7a 43 6f 6c 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  zCol[i]==0 ) con
3c80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 70 72  tinue;.       pr
3c90: 69 6e 74 42 79 74 65 73 28 61 2c 20 78 2b 73 2c  intBytes(a, x+s,
3ca0: 20 73 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   szCol[i]);.    
3cb0: 20 20 20 70 72 69 6e 74 66 28 22 64 61 74 61 5b     printf("data[
3cc0: 25 64 5d 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20  %d]: ", i);.    
3cd0: 20 20 20 70 44 61 74 61 20 3d 20 78 2b 73 3b 0a     pData = x+s;.
3ce0: 20 20 20 20 20 20 20 69 66 28 20 74 79 70 65 43         if( typeC
3cf0: 6f 6c 5b 69 5d 3c 3d 37 20 29 7b 0a 20 20 20 20  ol[i]<=7 ){.    
3d00: 20 20 20 20 20 76 20 3d 20 28 73 69 67 6e 65 64       v = (signed
3d10: 20 63 68 61 72 29 70 44 61 74 61 5b 30 5d 3b 0a   char)pData[0];.
3d20: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31           for(k=1
3d30: 3b 20 6b 3c 73 7a 43 6f 6c 5b 69 5d 3b 20 6b 2b  ; k<szCol[i]; k+
3d40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 76  +){.           v
3d50: 20 3d 20 28 76 3c 3c 38 29 20 2b 20 70 44 61 74   = (v<<8) + pDat
3d60: 61 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 7d  a[k];.         }
3d70: 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 74 79  .         if( ty
3d80: 70 65 43 6f 6c 5b 69 5d 3d 3d 37 20 29 7b 0a 20  peCol[i]==7 ){. 
3d90: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
3da0: 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 6d   r;.           m
3db0: 65 6d 63 70 79 28 26 72 2c 20 26 76 2c 20 73 69  emcpy(&r, &v, si
3dc0: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20  zeof(r));.      
3dd0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 23 67       printf("%#g
3de0: 5c 6e 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  \n", r);.       
3df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3e00: 20 20 20 20 70 72 69 6e 74 66 28 22 25 6c 6c 64      printf("%lld
3e10: 5c 6e 22 2c 20 76 29 3b 0a 20 20 20 20 20 20 20  \n", v);.       
3e20: 20 20 7d 0a 20 20 20 20 20 20 20 7d 65 6c 73 65    }.       }else
3e30: 7b 0a 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  {.         int i
3e40: 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20  i, jj;.         
3e50: 63 68 61 72 20 7a 43 6f 6e 73 74 5b 33 32 5d 3b  char zConst[32];
3e60: 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 28 74  .         if( (t
3e70: 79 70 65 43 6f 6c 5b 69 5d 26 31 29 3d 3d 30 20  ypeCol[i]&1)==0 
3e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 7a 43  ){.           zC
3e90: 6f 6e 73 74 5b 30 5d 20 3d 20 27 78 27 3b 0a 20  onst[0] = 'x';. 
3ea0: 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 73 74            zConst
3eb0: 5b 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20  [1] = '\'';.    
3ec0: 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 2c         for(ii=2,
3ed0: 20 6a 6a 3d 30 3b 20 6a 6a 3c 73 7a 43 6f 6c 5b   jj=0; jj<szCol[
3ee0: 69 5d 20 26 26 20 69 69 3c 32 34 3b 20 6a 6a 2b  i] && ii<24; jj+
3ef0: 2b 2c 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20  +, ii+=2){.     
3f00: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
3f10: 7a 43 6f 6e 73 74 2b 69 69 2c 20 22 25 30 32 78  zConst+ii, "%02x
3f20: 22 2c 20 70 44 61 74 61 5b 6a 6a 5d 29 3b 0a 20  ", pData[jj]);. 
3f30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3f40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3f50: 20 20 20 20 20 20 20 7a 43 6f 6e 73 74 5b 30 5d         zConst[0]
3f60: 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20   = '\'';.       
3f70: 20 20 20 20 66 6f 72 28 69 69 3d 31 2c 20 6a 6a      for(ii=1, jj
3f80: 3d 30 3b 20 6a 6a 3c 73 7a 43 6f 6c 5b 69 5d 20  =0; jj<szCol[i] 
3f90: 26 26 20 69 69 3c 32 34 3b 20 6a 6a 2b 2b 2c 20  && ii<24; jj++, 
3fa0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
3fb0: 20 20 20 20 7a 43 6f 6e 73 74 5b 69 69 5d 20 3d      zConst[ii] =
3fc0: 20 49 53 50 52 49 4e 54 28 70 44 61 74 61 5b 6a   ISPRINT(pData[j
3fd0: 6a 5d 29 20 3f 20 70 44 61 74 61 5b 6a 6a 5d 20  j]) ? pData[jj] 
3fe0: 3a 20 27 2e 27 3b 0a 20 20 20 20 20 20 20 20 20  : '.';.         
3ff0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 7a    }.           z
4000: 43 6f 6e 73 74 5b 69 69 5d 20 3d 20 30 3b 0a 20  Const[ii] = 0;. 
4010: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4020: 20 20 20 69 66 28 20 6a 6a 3c 73 7a 43 6f 6c 5b     if( jj<szCol[
4030: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
4040: 20 6d 65 6d 63 70 79 28 7a 43 6f 6e 73 74 2b 69   memcpy(zConst+i
4050: 69 2c 20 22 2e 2e 2e 27 22 2c 20 35 29 3b 0a 20  i, "...'", 5);. 
4060: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4070: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
4080: 28 7a 43 6f 6e 73 74 2b 69 69 2c 20 22 27 22 2c  (zConst+ii, "'",
4090: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a   2);.         }.
40a0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
40b0: 22 25 73 5c 6e 22 2c 20 7a 43 6f 6e 73 74 29 3b  "%s\n", zConst);
40c0: 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
40d0: 20 6a 20 3d 20 6f 66 73 74 43 6f 6c 5b 69 5d 20   j = ofstCol[i] 
40e0: 2b 20 73 7a 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  + szCol[i];.    
40f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 6e 4c  }.  }.  if( j<nL
4100: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e  ocal ){.    prin
4110: 74 42 79 74 65 73 28 61 2c 20 78 2b 6a 2c 20 30  tBytes(a, x+j, 0
4120: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e  );.    printf(".
4130: 2e 2e 20 25 6c 6c 64 20 62 79 74 65 73 20 6f 66  .. %lld bytes of
4140: 20 63 6f 6e 74 65 6e 74 20 2e 2e 2e 5c 6e 22 2c   content ...\n",
4150: 20 6e 4c 6f 63 61 6c 2d 6a 29 3b 0a 20 20 7d 0a   nLocal-j);.  }.
4160: 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61    if( nLocal<nPa
4170: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 72 69  yload ){.    pri
4180: 6e 74 42 79 74 65 73 28 61 2c 20 78 2b 6e 4c 6f  ntBytes(a, x+nLo
4190: 63 61 6c 2c 20 34 29 3b 0a 20 20 20 20 70 72 69  cal, 4);.    pri
41a0: 6e 74 66 28 22 6f 76 65 72 66 6c 6f 77 2d 70 61  ntf("overflow-pa
41b0: 67 65 3a 20 25 64 5c 6e 22 2c 20 64 65 63 6f 64  ge: %d\n", decod
41c0: 65 49 6e 74 33 32 28 78 2b 6e 4c 6f 63 61 6c 29  eInt32(x+nLocal)
41d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
41e0: 20 44 65 63 6f 64 65 20 61 20 62 74 72 65 65 20   Decode a btree 
41f0: 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  page.*/.static v
4200: 6f 69 64 20 64 65 63 6f 64 65 5f 62 74 72 65 65  oid decode_btree
4210: 5f 70 61 67 65 28 0a 20 20 75 6e 73 69 67 6e 65  _page(.  unsigne
4220: 64 20 63 68 61 72 20 2a 61 2c 20 20 20 2f 2a 20  d char *a,   /* 
4230: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
4240: 20 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20    int pgno,     
4250: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
4260: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 64  mber */.  int hd
4270: 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 2f 2a  rSize,        /*
4280: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
4290: 65 20 68 65 61 64 65 72 2e 20 20 30 20 6f 72 20  e header.  0 or 
42a0: 31 30 30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  100 */.  char *z
42b0: 41 72 67 73 20 20 20 20 20 20 20 20 20 2f 2a 20  Args         /* 
42c0: 46 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  Flags to control
42d0: 20 66 6f 72 6d 61 74 74 69 6e 67 20 2a 2f 0a 29   formatting */.)
42e0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
42f0: 7a 54 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  zType = "unknown
4300: 22 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  ";.  int nCell;.
4310: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
4320: 74 20 69 43 65 6c 6c 50 74 72 3b 0a 20 20 69 6e  t iCellPtr;.  in
4330: 74 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e  t showCellConten
4340: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 68 6f  t = 0;.  int sho
4350: 77 4d 61 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  wMap = 0;.  int 
4360: 63 65 6c 6c 54 6f 44 65 63 6f 64 65 20 3d 20 2d  cellToDecode = -
4370: 32 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 70 20  2;.  char *zMap 
4380: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 61  = 0;.  switch( a
4390: 5b 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20  [0] ){.    case 
43a0: 32 3a 20 20 7a 54 79 70 65 20 3d 20 22 69 6e 64  2:  zType = "ind
43b0: 65 78 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  ex interior node
43c0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
43d0: 61 73 65 20 35 3a 20 20 7a 54 79 70 65 20 3d 20  ase 5:  zType = 
43e0: 22 74 61 62 6c 65 20 69 6e 74 65 72 69 6f 72 20  "table interior 
43f0: 6e 6f 64 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20  node";  break;. 
4400: 20 20 20 63 61 73 65 20 31 30 3a 20 7a 54 79 70     case 10: zTyp
4410: 65 20 3d 20 22 69 6e 64 65 78 20 6c 65 61 66 22  e = "index leaf"
4420: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
4430: 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 33 3a 20  k;.    case 13: 
4440: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 20 6c  zType = "table l
4450: 65 61 66 22 3b 20 20 20 20 20 20 20 20 20 20 20  eaf";           
4460: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 69  break;.  }.  whi
4470: 6c 65 28 20 7a 41 72 67 73 5b 30 5d 20 29 7b 0a  le( zArgs[0] ){.
4480: 20 20 20 20 73 77 69 74 63 68 28 20 7a 41 72 67      switch( zArg
4490: 73 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61  s[0] ){.      ca
44a0: 73 65 20 27 63 27 3a 20 73 68 6f 77 43 65 6c 6c  se 'c': showCell
44b0: 43 6f 6e 74 65 6e 74 20 3d 20 31 3b 20 20 62 72  Content = 1;  br
44c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
44d0: 27 6d 27 3a 20 73 68 6f 77 4d 61 70 20 3d 20 31  'm': showMap = 1
44e0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
44f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 64 27  ;.      case 'd'
4500: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4510: 21 49 53 44 49 47 49 54 28 7a 41 72 67 73 5b 31  !ISDIGIT(zArgs[1
4520: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
4530: 63 65 6c 6c 54 6f 44 65 63 6f 64 65 20 3d 20 2d  cellToDecode = -
4540: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
4550: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c  {.          cell
4560: 54 6f 44 65 63 6f 64 65 20 3d 20 30 3b 0a 20 20  ToDecode = 0;.  
4570: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
4580: 53 44 49 47 49 54 28 7a 41 72 67 73 5b 31 5d 29  SDIGIT(zArgs[1])
4590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
45a0: 7a 41 72 67 73 2b 2b 3b 0a 20 20 20 20 20 20 20  zArgs++;.       
45b0: 20 20 20 20 20 63 65 6c 6c 54 6f 44 65 63 6f 64       cellToDecod
45c0: 65 20 3d 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65  e = cellToDecode
45d0: 2a 31 30 20 2b 20 7a 41 72 67 73 5b 30 5d 20 2d  *10 + zArgs[0] -
45e0: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
45f0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
4600: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4610: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 41 72   }.    }.    zAr
4620: 67 73 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  gs++;.  }.  nCel
4630: 6c 20 3d 20 61 5b 33 5d 2a 32 35 36 20 2b 20 61  l = a[3]*256 + a
4640: 5b 34 5d 3b 0a 20 20 69 43 65 6c 6c 50 74 72 20  [4];.  iCellPtr 
4650: 3d 20 28 61 5b 30 5d 3d 3d 32 20 7c 7c 20 61 5b  = (a[0]==2 || a[
4660: 30 5d 3d 3d 35 29 20 3f 20 31 32 20 3a 20 38 3b  0]==5) ? 12 : 8;
4670: 0a 20 20 69 66 28 20 63 65 6c 6c 54 6f 44 65 63  .  if( cellToDec
4680: 6f 64 65 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ode>=nCell ){.  
4690: 20 20 70 72 69 6e 74 66 28 22 50 61 67 65 20 25    printf("Page %
46a0: 64 20 68 61 73 20 6f 6e 6c 79 20 25 64 20 63 65  d has only %d ce
46b0: 6c 6c 73 5c 6e 22 2c 20 70 67 6e 6f 2c 20 6e 43  lls\n", pgno, nC
46c0: 65 6c 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ell);.    return
46d0: 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22  ;.  }.  printf("
46e0: 48 65 61 64 65 72 20 6f 6e 20 62 74 72 65 65 20  Header on btree 
46f0: 70 61 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67 6e  page %d:\n", pgn
4700: 6f 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  o);.  print_deco
4710: 64 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 31 2c  de_line(a, 0, 1,
4720: 20 7a 54 79 70 65 29 3b 0a 20 20 70 72 69 6e 74   zType);.  print
4730: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20  _decode_line(a, 
4740: 31 2c 20 32 2c 20 22 4f 66 66 73 65 74 20 74 6f  1, 2, "Offset to
4750: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
4760: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
4770: 64 65 5f 6c 69 6e 65 28 61 2c 20 33 2c 20 32 2c  de_line(a, 3, 2,
4780: 20 22 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c   "Number of cell
4790: 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 22 29  s on this page")
47a0: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
47b0: 5f 6c 69 6e 65 28 61 2c 20 35 2c 20 32 2c 20 22  _line(a, 5, 2, "
47c0: 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
47d0: 6f 6e 74 65 6e 74 20 61 72 65 61 22 29 3b 0a 20  ontent area");. 
47e0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
47f0: 6e 65 28 61 2c 20 37 2c 20 31 2c 20 22 46 72 61  ne(a, 7, 1, "Fra
4800: 67 6d 65 6e 74 65 64 20 62 79 74 65 20 63 6f 75  gmented byte cou
4810: 6e 74 22 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d  nt");.  if( a[0]
4820: 3d 3d 32 20 7c 7c 20 61 5b 30 5d 3d 3d 35 20 29  ==2 || a[0]==5 )
4830: 7b 0a 20 20 20 20 70 72 69 6e 74 5f 64 65 63 6f  {.    print_deco
4840: 64 65 5f 6c 69 6e 65 28 61 2c 20 38 2c 20 34 2c  de_line(a, 8, 4,
4850: 20 22 52 69 67 68 74 20 63 68 69 6c 64 22 29 3b   "Right child");
4860: 0a 20 20 7d 0a 20 20 69 66 28 20 63 65 6c 6c 54  .  }.  if( cellT
4870: 6f 44 65 63 6f 64 65 3d 3d 28 2d 32 29 20 26 26  oDecode==(-2) &&
4880: 20 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20   nCell>0 ){.    
4890: 70 72 69 6e 74 66 28 22 20 6b 65 79 3a 20 6c 78  printf(" key: lx
48a0: 3d 6c 65 66 74 2d 63 68 69 6c 64 20 6e 3d 70 61  =left-child n=pa
48b0: 79 6c 6f 61 64 2d 73 69 7a 65 20 72 3d 72 6f 77  yload-size r=row
48c0: 69 64 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  id\n");.  }.  if
48d0: 28 20 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20  ( showMap ){.   
48e0: 20 7a 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f   zMap = sqlite3_
48f0: 6d 61 6c 6c 6f 63 28 67 2e 70 61 67 65 73 69 7a  malloc(g.pagesiz
4900: 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  e);.    memset(z
4910: 4d 61 70 2c 20 27 2e 27 2c 20 67 2e 70 61 67 65  Map, '.', g.page
4920: 73 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65  size);.    memse
4930: 74 28 7a 4d 61 70 2c 20 27 31 27 2c 20 68 64 72  t(zMap, '1', hdr
4940: 53 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65  Size);.    memse
4950: 74 28 26 7a 4d 61 70 5b 68 64 72 53 69 7a 65 5d  t(&zMap[hdrSize]
4960: 2c 20 27 48 27 2c 20 69 43 65 6c 6c 50 74 72 29  , 'H', iCellPtr)
4970: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4d  ;.    memset(&zM
4980: 61 70 5b 68 64 72 53 69 7a 65 2b 69 43 65 6c 6c  ap[hdrSize+iCell
4990: 50 74 72 5d 2c 20 27 50 27 2c 20 32 2a 6e 43 65  Ptr], 'P', 2*nCe
49a0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ll);.  }.  for(i
49b0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
49c0: 29 7b 0a 20 20 20 20 69 6e 74 20 63 6f 66 73 74  ){.    int cofst
49d0: 20 3d 20 69 43 65 6c 6c 50 74 72 20 2b 20 69 2a   = iCellPtr + i*
49e0: 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 65  2;.    char *zDe
49f0: 73 63 3b 0a 20 20 20 20 69 36 34 20 6e 3b 0a 0a  sc;.    i64 n;..
4a00: 20 20 20 20 63 6f 66 73 74 20 3d 20 61 5b 63 6f      cofst = a[co
4a10: 66 73 74 5d 2a 32 35 36 20 2b 20 61 5b 63 6f 66  fst]*256 + a[cof
4a20: 73 74 2b 31 5d 3b 0a 20 20 20 20 6e 20 3d 20 64  st+1];.    n = d
4a30: 65 73 63 72 69 62 65 43 65 6c 6c 28 61 5b 30 5d  escribeCell(a[0]
4a40: 2c 20 26 61 5b 63 6f 66 73 74 2d 68 64 72 53 69  , &a[cofst-hdrSi
4a50: 7a 65 5d 2c 20 73 68 6f 77 43 65 6c 6c 43 6f 6e  ze], showCellCon
4a60: 74 65 6e 74 2c 20 26 7a 44 65 73 63 29 3b 0a 20  tent, &zDesc);. 
4a70: 20 20 20 69 66 28 20 73 68 6f 77 4d 61 70 20 29     if( showMap )
4a80: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75  {.      char zBu
4a90: 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  f[30];.      mem
4aa0: 73 65 74 28 26 7a 4d 61 70 5b 63 6f 66 73 74 5d  set(&zMap[cofst]
4ab0: 2c 20 27 2a 27 2c 20 28 73 69 7a 65 5f 74 29 6e  , '*', (size_t)n
4ac0: 29 3b 0a 20 20 20 20 20 20 7a 4d 61 70 5b 63 6f  );.      zMap[co
4ad0: 66 73 74 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20  fst] = '[';.    
4ae0: 20 20 7a 4d 61 70 5b 63 6f 66 73 74 2b 6e 2d 31    zMap[cofst+n-1
4af0: 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20 73  ] = ']';.      s
4b00: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
4b10: 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 6a 20 3d  ", i);.      j =
4b20: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75   (int)strlen(zBu
4b30: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c  f);.      if( j<
4b40: 3d 6e 2d 32 20 29 20 6d 65 6d 63 70 79 28 26 7a  =n-2 ) memcpy(&z
4b50: 4d 61 70 5b 63 6f 66 73 74 2b 31 5d 2c 20 7a 42  Map[cofst+1], zB
4b60: 75 66 2c 20 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  uf, j);.    }.  
4b70: 20 20 69 66 28 20 63 65 6c 6c 54 6f 44 65 63 6f    if( cellToDeco
4b80: 64 65 3d 3d 28 2d 32 29 20 29 7b 0a 20 20 20 20  de==(-2) ){.    
4b90: 20 20 70 72 69 6e 74 66 28 22 20 25 30 33 78 3a    printf(" %03x:
4ba0: 20 63 65 6c 6c 5b 25 64 5d 20 25 73 5c 6e 22 2c   cell[%d] %s\n",
4bb0: 20 63 6f 66 73 74 2c 20 69 2c 20 7a 44 65 73 63   cofst, i, zDesc
4bc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
4bd0: 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65 3d 3d 28   cellToDecode==(
4be0: 2d 31 29 20 7c 7c 20 63 65 6c 6c 54 6f 44 65 63  -1) || cellToDec
4bf0: 6f 64 65 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  ode==i ){.      
4c00: 64 65 63 6f 64 65 43 65 6c 6c 28 61 2c 20 70 67  decodeCell(a, pg
4c10: 6e 6f 2c 20 69 2c 20 68 64 72 53 69 7a 65 2c 20  no, i, hdrSize, 
4c20: 63 6f 66 73 74 2d 68 64 72 53 69 7a 65 29 3b 0a  cofst-hdrSize);.
4c30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4c40: 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20 70  showMap ){.    p
4c50: 72 69 6e 74 66 28 22 50 61 67 65 20 6d 61 70 3a  rintf("Page map:
4c60: 20 20 28 48 3d 68 65 61 64 65 72 20 50 3d 63 65    (H=header P=ce
4c70: 6c 6c 2d 69 6e 64 65 78 20 31 3d 70 61 67 65 2d  ll-index 1=page-
4c80: 31 2d 68 65 61 64 65 72 20 2e 3d 66 72 65 65 2d  1-header .=free-
4c90: 73 70 61 63 65 29 5c 6e 22 29 3b 0a 20 20 20 20  space)\n");.    
4ca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 67 2e 70 61 67  for(i=0; i<g.pag
4cb0: 65 73 69 7a 65 3b 20 69 2b 3d 36 34 29 7b 0a 20  esize; i+=64){. 
4cc0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 30       printf(" %0
4cd0: 33 78 3a 20 25 2e 36 34 73 5c 6e 22 2c 20 69 2c  3x: %.64s\n", i,
4ce0: 20 26 7a 4d 61 70 5b 69 5d 29 3b 0a 20 20 20 20   &zMap[i]);.    
4cf0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
4d00: 65 65 28 7a 4d 61 70 29 3b 0a 20 20 7d 0a 7d 0a  ee(zMap);.  }.}.
4d10: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
4d20: 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
4d30: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
4d40: 6f 69 64 20 64 65 63 6f 64 65 5f 74 72 75 6e 6b  oid decode_trunk
4d50: 5f 70 61 67 65 28 0a 20 20 69 6e 74 20 70 67 6e  _page(.  int pgn
4d60: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o,             /
4d70: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
4d80: 72 20 2a 2f 0a 20 20 69 6e 74 20 64 65 74 61 69  r */.  int detai
4d90: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l,           /* 
4da0: 53 68 6f 77 20 6c 65 61 66 20 70 61 67 65 73 20  Show leaf pages 
4db0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  if true */.  int
4dc0: 20 72 65 63 75 72 73 69 76 65 20 20 20 20 20 20   recursive      
4dd0: 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 20 74 68 65     /* Follow the
4de0: 20 74 72 75 6e 6b 20 63 68 61 6e 67 65 20 69 66   trunk change if
4df0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
4e00: 74 20 6e 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e  t n, i;.  unsign
4e10: 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 77 68  ed char *a;.  wh
4e20: 69 6c 65 28 20 70 67 6e 6f 3e 30 20 29 7b 0a 20  ile( pgno>0 ){. 
4e30: 20 20 20 61 20 3d 20 66 69 6c 65 52 65 61 64 28     a = fileRead(
4e40: 28 70 67 6e 6f 2d 31 29 2a 67 2e 70 61 67 65 73  (pgno-1)*g.pages
4e50: 69 7a 65 2c 20 67 2e 70 61 67 65 73 69 7a 65 29  ize, g.pagesize)
4e60: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 44 65  ;.    printf("De
4e70: 63 6f 64 65 20 6f 66 20 66 72 65 65 6c 69 73 74  code of freelist
4e80: 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 3a 5c   trunk page %d:\
4e90: 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70  n", pgno);.    p
4ea0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
4eb0: 28 61 2c 20 30 2c 20 34 2c 20 22 4e 65 78 74 20  (a, 0, 4, "Next 
4ec0: 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
4ed0: 61 67 65 22 29 3b 0a 20 20 20 20 70 72 69 6e 74  age");.    print
4ee0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20  _decode_line(a, 
4ef0: 34 2c 20 34 2c 20 22 4e 75 6d 62 65 72 20 6f 66  4, 4, "Number of
4f00: 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73   entries on this
4f10: 20 70 61 67 65 22 29 3b 0a 20 20 20 20 69 66 28   page");.    if(
4f20: 20 64 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 20   detail ){.     
4f30: 20 6e 20 3d 20 28 69 6e 74 29 64 65 63 6f 64 65   n = (int)decode
4f40: 49 6e 74 33 32 28 26 61 5b 34 5d 29 3b 0a 20 20  Int32(&a[4]);.  
4f50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4f60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
4f70: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 20 3d  unsigned int x =
4f80: 20 64 65 63 6f 64 65 49 6e 74 33 32 28 26 61 5b   decodeInt32(&a[
4f90: 38 2b 34 2a 69 5d 29 3b 0a 20 20 20 20 20 20 20  8+4*i]);.       
4fa0: 20 63 68 61 72 20 7a 49 64 78 5b 31 30 5d 3b 0a   char zIdx[10];.
4fb0: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
4fc0: 7a 49 64 78 2c 20 22 5b 25 64 5d 22 2c 20 69 29  zIdx, "[%d]", i)
4fd0: 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  ;.        printf
4fe0: 28 22 20 20 25 35 73 20 25 37 75 22 2c 20 7a 49  ("  %5s %7u", zI
4ff0: 64 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  dx, x);.        
5000: 69 66 28 20 69 25 35 3d 3d 34 20 29 20 70 72 69  if( i%5==4 ) pri
5010: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ntf("\n");.     
5020: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 25 35   }.      if( i%5
5030: 21 3d 30 20 29 20 70 72 69 6e 74 66 28 22 5c 6e  !=0 ) printf("\n
5040: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
5050: 28 20 21 72 65 63 75 72 73 69 76 65 20 29 7b 0a  ( !recursive ){.
5060: 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 30 3b 0a        pgno = 0;.
5070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5080: 20 70 67 6e 6f 20 3d 20 28 69 6e 74 29 64 65 63   pgno = (int)dec
5090: 6f 64 65 49 6e 74 33 32 28 26 61 5b 30 5d 29 3b  odeInt32(&a[0]);
50a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
50b0: 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 7d 0a  e3_free(a);.  }.
50c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 68 6f 72 74  }../*.** A short
50d0: 20 74 65 78 74 20 63 6f 6d 6d 65 6e 74 20 6f 6e   text comment on
50e0: 20 74 68 65 20 75 73 65 20 6f 66 20 65 61 63 68   the use of each
50f0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
5100: 20 63 68 61 72 20 2a 2a 7a 50 61 67 65 55 73 65   char **zPageUse
5110: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 63  ;../*.** Add a c
5120: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 75 73  omment on the us
5130: 65 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2f 0a  e of a page..*/.
5140: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5150: 5f 75 73 61 67 65 5f 6d 73 67 28 69 6e 74 20 70  _usage_msg(int p
5160: 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  gno, const char 
5170: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5180: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5190: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20 20 76  char *zMsg;..  v
51a0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
51b0: 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73  mat);.  zMsg = s
51c0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
51d0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
51e0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
51f0: 28 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20 70 67 6e  ( pgno<=0 || pgn
5200: 6f 3e 67 2e 6d 78 50 61 67 65 20 29 7b 0a 20 20  o>g.mxPage ){.  
5210: 20 20 70 72 69 6e 74 66 28 22 45 52 52 4f 52 3a    printf("ERROR:
5220: 20 70 61 67 65 20 25 64 20 6f 75 74 20 6f 66 20   page %d out of 
5230: 72 61 6e 67 65 20 31 2e 2e 25 64 3a 20 25 73 5c  range 1..%d: %s\
5240: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
5250: 70 67 6e 6f 2c 20 67 2e 6d 78 50 61 67 65 2c 20  pgno, g.mxPage, 
5260: 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  zMsg);.    sqlit
5270: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
5280: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
5290: 20 69 66 28 20 7a 50 61 67 65 55 73 65 5b 70 67   if( zPageUse[pg
52a0: 6e 6f 5d 21 3d 30 20 29 7b 0a 20 20 20 20 70 72  no]!=0 ){.    pr
52b0: 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 70 61 67  intf("ERROR: pag
52c0: 65 20 25 64 20 75 73 65 64 20 6d 75 6c 74 69 70  e %d used multip
52d0: 6c 65 20 74 69 6d 65 73 3a 5c 6e 22 2c 20 70 67  le times:\n", pg
52e0: 6e 6f 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  no);.    printf(
52f0: 22 45 52 52 4f 52 3a 20 20 20 20 70 72 65 76 69  "ERROR:    previ
5300: 6f 75 73 3a 20 25 73 5c 6e 22 2c 20 7a 50 61 67  ous: %s\n", zPag
5310: 65 55 73 65 5b 70 67 6e 6f 5d 29 3b 0a 20 20 20  eUse[pgno]);.   
5320: 20 70 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20   printf("ERROR: 
5330: 20 20 20 63 75 72 72 65 6e 74 3a 20 20 25 73 5c     current:  %s\
5340: 6e 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73  n", zMsg);.    s
5350: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 67  qlite3_free(zPag
5360: 65 55 73 65 5b 70 67 6e 6f 5d 29 3b 0a 20 20 7d  eUse[pgno]);.  }
5370: 0a 20 20 7a 50 61 67 65 55 73 65 5b 70 67 6e 6f  .  zPageUse[pgno
5380: 5d 20 3d 20 7a 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a  ] = zMsg;.}../*.
5390: 2a 2a 20 46 69 6e 64 20 6f 76 65 72 66 6c 6f 77  ** Find overflow
53a0: 20 70 61 67 65 73 20 6f 66 20 61 20 63 65 6c 6c   pages of a cell
53b0: 20 61 6e 64 20 64 65 73 63 72 69 62 65 20 74 68   and describe th
53c0: 65 69 72 20 75 73 61 67 65 2e 0a 2a 2f 0a 73 74  eir usage..*/.st
53d0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 75  atic void page_u
53e0: 73 61 67 65 5f 63 65 6c 6c 28 0a 20 20 75 6e 73  sage_cell(.  uns
53f0: 69 67 6e 65 64 20 63 68 61 72 20 63 54 79 70 65  igned char cType
5400: 2c 20 20 20 20 2f 2a 20 50 61 67 65 20 74 79 70  ,    /* Page typ
5410: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
5420: 63 68 61 72 20 2a 61 2c 20 20 20 20 20 20 20 2f  char *a,       /
5430: 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  * Cell content *
5440: 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20  /.  int pgno,   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
5460: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
5470: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
5480: 20 63 65 6c 6c 6e 6f 20 20 20 20 20 20 20 20 20   cellno         
5490: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
54a0: 20 74 68 65 20 63 65 6c 6c 20 6f 6e 20 74 68 65   the cell on the
54b0: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
54c0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  t i;.  int n = 0
54d0: 3b 0a 20 20 69 36 34 20 6e 50 61 79 6c 6f 61 64  ;.  i64 nPayload
54e0: 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 20  ;.  i64 rowid;. 
54f0: 20 69 36 34 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69   i64 nLocal;.  i
5500: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 54 79 70   = 0;.  if( cTyp
5510: 65 3c 3d 35 20 29 7b 0a 20 20 20 20 61 20 2b 3d  e<=5 ){.    a +=
5520: 20 34 3b 0a 20 20 20 20 6e 20 2b 3d 20 34 3b 0a   4;.    n += 4;.
5530: 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65 21    }.  if( cType!
5540: 3d 35 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65  =5 ){.    i = de
5550: 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 6e  codeVarint(a, &n
5560: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 61 20  Payload);.    a 
5570: 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20 69  += i;.    n += i
5580: 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6c  ;.    nLocal = l
5590: 6f 63 61 6c 50 61 79 6c 6f 61 64 28 6e 50 61 79  ocalPayload(nPay
55a0: 6c 6f 61 64 2c 20 63 54 79 70 65 29 3b 0a 20 20  load, cType);.  
55b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c  }else{.    nPayl
55c0: 6f 61 64 20 3d 20 6e 4c 6f 63 61 6c 20 3d 20 30  oad = nLocal = 0
55d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70  ;.  }.  if( cTyp
55e0: 65 3d 3d 35 20 7c 7c 20 63 54 79 70 65 3d 3d 31  e==5 || cType==1
55f0: 33 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65 63  3 ){.    i = dec
5600: 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 72 6f  odeVarint(a, &ro
5610: 77 69 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69  wid);.    a += i
5620: 3b 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20  ;.    n += i;.  
5630: 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3c 6e  }.  if( nLocal<n
5640: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 69  Payload ){.    i
5650: 6e 74 20 6f 76 66 6c 20 3d 20 64 65 63 6f 64 65  nt ovfl = decode
5660: 49 6e 74 33 32 28 61 2b 6e 4c 6f 63 61 6c 29 3b  Int32(a+nLocal);
5670: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
5680: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 76 66  ;.    while( ovf
5690: 6c 20 26 26 20 28 63 6e 74 2b 2b 29 3c 67 2e 6d  l && (cnt++)<g.m
56a0: 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 70  xPage ){.      p
56b0: 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 6f 76  age_usage_msg(ov
56c0: 66 6c 2c 20 22 6f 76 65 72 66 6c 6f 77 20 25 64  fl, "overflow %d
56d0: 20 66 72 6f 6d 20 63 65 6c 6c 20 25 64 20 6f 66   from cell %d of
56e0: 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20   page %d",.     
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 63 6e 74 2c 20 63 65 6c 6c 6e 6f 2c 20 70 67 6e  cnt, cellno, pgn
5710: 6f 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 66 69  o);.      a = fi
5720: 6c 65 52 65 61 64 28 28 6f 76 66 6c 2d 31 29 2a  leRead((ovfl-1)*
5730: 67 2e 70 61 67 65 73 69 7a 65 2c 20 34 29 3b 0a  g.pagesize, 4);.
5740: 20 20 20 20 20 20 6f 76 66 6c 20 3d 20 64 65 63        ovfl = dec
5750: 6f 64 65 49 6e 74 33 32 28 61 29 3b 0a 20 20 20  odeInt32(a);.   
5760: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5770: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  a);.    }.  }.}.
5780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 63 72 69 62 65  ../*.** Describe
5790: 20 74 68 65 20 75 73 61 67 65 73 20 6f 66 20 61   the usages of a
57a0: 20 62 2d 74 72 65 65 20 70 61 67 65 0a 2a 2f 0a   b-tree page.*/.
57b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
57c0: 5f 75 73 61 67 65 5f 62 74 72 65 65 28 0a 20 20  _usage_btree(.  
57d0: 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  int pgno,       
57e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
57f0: 20 64 65 73 63 72 69 62 65 20 2a 2f 0a 20 20 69   describe */.  i
5800: 6e 74 20 70 61 72 65 6e 74 2c 20 20 20 20 20 20  nt parent,      
5810: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f       /* Parent o
5820: 66 20 74 68 69 73 20 70 61 67 65 2e 20 20 30 20  f this page.  0 
5830: 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a  for root pages *
5840: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
5850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
5860: 63 68 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ch child of the 
5870: 70 61 72 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  parent */.  cons
5880: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
5890: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
58a0: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 75   table */.){.  u
58b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b  nsigned char *a;
58c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
58d0: 54 79 70 65 20 3d 20 22 63 6f 72 72 75 70 74 20  Type = "corrupt 
58e0: 6e 6f 64 65 22 3b 0a 20 20 69 6e 74 20 6e 43 65  node";.  int nCe
58f0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ll;.  int i;.  i
5900: 6e 74 20 68 64 72 20 3d 20 70 67 6e 6f 3d 3d 31  nt hdr = pgno==1
5910: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 0a 20 20 69   ? 100 : 0;..  i
5920: 66 28 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20 70 67  f( pgno<=0 || pg
5930: 6e 6f 3e 67 2e 6d 78 50 61 67 65 20 29 20 72 65  no>g.mxPage ) re
5940: 74 75 72 6e 3b 0a 20 20 61 20 3d 20 66 69 6c 65  turn;.  a = file
5950: 52 65 61 64 28 28 70 67 6e 6f 2d 31 29 2a 67 2e  Read((pgno-1)*g.
5960: 70 61 67 65 73 69 7a 65 2c 20 67 2e 70 61 67 65  pagesize, g.page
5970: 73 69 7a 65 29 3b 0a 20 20 73 77 69 74 63 68 28  size);.  switch(
5980: 20 61 5b 68 64 72 5d 20 29 7b 0a 20 20 20 20 63   a[hdr] ){.    c
5990: 61 73 65 20 32 3a 20 20 7a 54 79 70 65 20 3d 20  ase 2:  zType = 
59a0: 22 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 6f  "interior node o
59b0: 66 20 69 6e 64 65 78 22 3b 20 20 62 72 65 61 6b  f index";  break
59c0: 3b 0a 20 20 20 20 63 61 73 65 20 35 3a 20 20 7a  ;.    case 5:  z
59d0: 54 79 70 65 20 3d 20 22 69 6e 74 65 72 69 6f 72  Type = "interior
59e0: 20 6e 6f 64 65 20 6f 66 20 74 61 62 6c 65 22 3b   node of table";
59f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5a00: 65 20 31 30 3a 20 7a 54 79 70 65 20 3d 20 22 6c  e 10: zType = "l
5a10: 65 61 66 20 6f 66 20 69 6e 64 65 78 22 3b 20 20  eaf of index";  
5a20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5a30: 20 20 20 20 63 61 73 65 20 31 33 3a 20 7a 54 79      case 13: zTy
5a40: 70 65 20 3d 20 22 6c 65 61 66 20 6f 66 20 74 61  pe = "leaf of ta
5a50: 62 6c 65 22 3b 20 20 20 20 20 20 20 20 20 20 20  ble";           
5a60: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
5a70: 20 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 70   parent ){.    p
5a80: 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70 67  age_usage_msg(pg
5a90: 6e 6f 2c 20 22 25 73 20 5b 25 73 5d 2c 20 63 68  no, "%s [%s], ch
5aa0: 69 6c 64 20 25 64 20 6f 66 20 70 61 67 65 20 25  ild %d of page %
5ab0: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
5ac0: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 7a 4e         zType, zN
5ad0: 61 6d 65 2c 20 69 64 78 2c 20 70 61 72 65 6e 74  ame, idx, parent
5ae0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5af0: 70 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70  page_usage_msg(p
5b00: 67 6e 6f 2c 20 22 72 6f 6f 74 20 25 73 20 5b 25  gno, "root %s [%
5b10: 73 5d 22 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d  s]", zType, zNam
5b20: 65 29 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  e);.  }.  nCell 
5b30: 3d 20 61 5b 68 64 72 2b 33 5d 2a 32 35 36 20 2b  = a[hdr+3]*256 +
5b40: 20 61 5b 68 64 72 2b 34 5d 3b 0a 20 20 69 66 28   a[hdr+4];.  if(
5b50: 20 61 5b 68 64 72 5d 3d 3d 32 20 7c 7c 20 61 5b   a[hdr]==2 || a[
5b60: 68 64 72 5d 3d 3d 35 20 29 7b 0a 20 20 20 20 69  hdr]==5 ){.    i
5b70: 6e 74 20 63 65 6c 6c 73 74 61 72 74 20 3d 20 68  nt cellstart = h
5b80: 64 72 2b 31 32 3b 0a 20 20 20 20 75 6e 73 69 67  dr+12;.    unsig
5b90: 6e 65 64 20 69 6e 74 20 63 68 69 6c 64 3b 0a 20  ned int child;. 
5ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
5bb0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
5bc0: 20 69 6e 74 20 6f 66 73 74 3b 0a 0a 20 20 20 20   int ofst;..    
5bd0: 20 20 6f 66 73 74 20 3d 20 63 65 6c 6c 73 74 61    ofst = cellsta
5be0: 72 74 20 2b 20 69 2a 32 3b 0a 20 20 20 20 20 20  rt + i*2;.      
5bf0: 6f 66 73 74 20 3d 20 61 5b 6f 66 73 74 5d 2a 32  ofst = a[ofst]*2
5c00: 35 36 20 2b 20 61 5b 6f 66 73 74 2b 31 5d 3b 0a  56 + a[ofst+1];.
5c10: 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 64 65        child = de
5c20: 63 6f 64 65 49 6e 74 33 32 28 61 2b 6f 66 73 74  codeInt32(a+ofst
5c30: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 75 73  );.      page_us
5c40: 61 67 65 5f 62 74 72 65 65 28 63 68 69 6c 64 2c  age_btree(child,
5c50: 20 70 67 6e 6f 2c 20 69 2c 20 7a 4e 61 6d 65 29   pgno, i, zName)
5c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 68 69 6c  ;.    }.    chil
5c70: 64 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28  d = decodeInt32(
5c80: 61 2b 63 65 6c 6c 73 74 61 72 74 2d 34 29 3b 0a  a+cellstart-4);.
5c90: 20 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 62      page_usage_b
5ca0: 74 72 65 65 28 63 68 69 6c 64 2c 20 70 67 6e 6f  tree(child, pgno
5cb0: 2c 20 69 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  , i, zName);.  }
5cc0: 0a 20 20 69 66 28 20 61 5b 68 64 72 5d 3d 3d 32  .  if( a[hdr]==2
5cd0: 20 7c 7c 20 61 5b 68 64 72 5d 3d 3d 31 30 20 7c   || a[hdr]==10 |
5ce0: 7c 20 61 5b 68 64 72 5d 3d 3d 31 33 20 29 7b 0a  | a[hdr]==13 ){.
5cf0: 20 20 20 20 69 6e 74 20 63 65 6c 6c 73 74 61 72      int cellstar
5d00: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
5d10: 28 61 5b 68 64 72 5d 3c 3d 35 29 3b 0a 20 20 20  (a[hdr]<=5);.   
5d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
5d30: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
5d40: 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 20 20 6f  nt ofst;.      o
5d50: 66 73 74 20 3d 20 63 65 6c 6c 73 74 61 72 74 20  fst = cellstart 
5d60: 2b 20 69 2a 32 3b 0a 20 20 20 20 20 20 6f 66 73  + i*2;.      ofs
5d70: 74 20 3d 20 61 5b 6f 66 73 74 5d 2a 32 35 36 20  t = a[ofst]*256 
5d80: 2b 20 61 5b 6f 66 73 74 2b 31 5d 3b 0a 20 20 20  + a[ofst+1];.   
5d90: 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 63 65     page_usage_ce
5da0: 6c 6c 28 61 5b 68 64 72 5d 2c 20 61 2b 6f 66 73  ll(a[hdr], a+ofs
5db0: 74 2c 20 70 67 6e 6f 2c 20 69 29 3b 0a 20 20 20  t, pgno, i);.   
5dc0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
5dd0: 5f 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(a);.}../*.
5de0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 70 61 67  ** Determine pag
5df0: 65 20 75 73 61 67 65 20 62 79 20 74 68 65 20 66  e usage by the f
5e00: 72 65 65 6c 69 73 74 0a 2a 2f 0a 73 74 61 74 69  reelist.*/.stati
5e10: 63 20 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67  c void page_usag
5e20: 65 5f 66 72 65 65 6c 69 73 74 28 69 6e 74 20 70  e_freelist(int p
5e30: 67 6e 6f 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  gno){.  unsigned
5e40: 20 63 68 61 72 20 2a 61 3b 0a 20 20 69 6e 74 20   char *a;.  int 
5e50: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  cnt = 0;.  int i
5e60: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
5e70: 20 69 4e 65 78 74 3b 0a 20 20 69 6e 74 20 70 61   iNext;.  int pa
5e80: 72 65 6e 74 20 3d 20 31 3b 0a 0a 20 20 77 68 69  rent = 1;..  whi
5e90: 6c 65 28 20 70 67 6e 6f 3e 30 20 26 26 20 70 67  le( pgno>0 && pg
5ea0: 6e 6f 3c 3d 67 2e 6d 78 50 61 67 65 20 26 26 20  no<=g.mxPage && 
5eb0: 28 63 6e 74 2b 2b 29 3c 67 2e 6d 78 50 61 67 65  (cnt++)<g.mxPage
5ec0: 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 75 73 61   ){.    page_usa
5ed0: 67 65 5f 6d 73 67 28 70 67 6e 6f 2c 20 22 66 72  ge_msg(pgno, "fr
5ee0: 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 23 25 64  eelist trunk #%d
5ef0: 20 63 68 69 6c 64 20 6f 66 20 25 64 22 2c 20 63   child of %d", c
5f00: 6e 74 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  nt, parent);.   
5f10: 20 61 20 3d 20 66 69 6c 65 52 65 61 64 28 28 70   a = fileRead((p
5f20: 67 6e 6f 2d 31 29 2a 67 2e 70 61 67 65 73 69 7a  gno-1)*g.pagesiz
5f30: 65 2c 20 67 2e 70 61 67 65 73 69 7a 65 29 3b 0a  e, g.pagesize);.
5f40: 20 20 20 20 69 4e 65 78 74 20 3d 20 64 65 63 6f      iNext = deco
5f50: 64 65 49 6e 74 33 32 28 61 29 3b 0a 20 20 20 20  deInt32(a);.    
5f60: 6e 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28  n = decodeInt32(
5f70: 61 2b 34 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  a+4);.    for(i=
5f80: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
5f90: 20 20 20 20 69 6e 74 20 63 68 69 6c 64 20 3d 20      int child = 
5fa0: 64 65 63 6f 64 65 49 6e 74 33 32 28 61 20 2b 20  decodeInt32(a + 
5fb0: 28 69 2a 34 2b 38 29 29 3b 0a 20 20 20 20 20 20  (i*4+8));.      
5fc0: 70 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 63  page_usage_msg(c
5fd0: 68 69 6c 64 2c 20 22 66 72 65 65 6c 69 73 74 20  hild, "freelist 
5fe0: 6c 65 61 66 2c 20 63 68 69 6c 64 20 25 64 20 6f  leaf, child %d o
5ff0: 66 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 22  f trunk page %d"
6000: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6010: 20 20 20 20 20 20 20 69 2c 20 70 67 6e 6f 29 3b         i, pgno);
6020: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6030: 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20  e3_free(a);.    
6040: 70 61 72 65 6e 74 20 3d 20 70 67 6e 6f 3b 0a 20  parent = pgno;. 
6050: 20 20 20 70 67 6e 6f 20 3d 20 69 4e 65 78 74 3b     pgno = iNext;
6060: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
6070: 74 65 72 6d 69 6e 65 20 70 61 67 65 73 20 75 73  termine pages us
6080: 65 64 20 61 73 20 50 54 52 4d 41 50 20 70 61 67  ed as PTRMAP pag
6090: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
60a0: 64 20 70 61 67 65 5f 75 73 61 67 65 5f 70 74 72  d page_usage_ptr
60b0: 6d 61 70 28 75 6e 73 69 67 6e 65 64 20 63 68 61  map(unsigned cha
60c0: 72 20 2a 61 29 7b 0a 20 20 69 66 28 20 61 5b 35  r *a){.  if( a[5
60d0: 35 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 73  5] ){.    int us
60e0: 61 62 6c 65 20 3d 20 67 2e 70 61 67 65 73 69 7a  able = g.pagesiz
60f0: 65 20 2d 20 61 5b 32 30 5d 3b 0a 20 20 20 20 69  e - a[20];.    i
6100: 6e 74 20 70 67 6e 6f 20 3d 20 32 3b 0a 20 20 20  nt pgno = 2;.   
6110: 20 69 6e 74 20 70 65 72 50 61 67 65 20 3d 20 75   int perPage = u
6120: 73 61 62 6c 65 2f 35 3b 0a 20 20 20 20 77 68 69  sable/5;.    whi
6130: 6c 65 28 20 70 67 6e 6f 3c 3d 67 2e 6d 78 50 61  le( pgno<=g.mxPa
6140: 67 65 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  ge ){.      page
6150: 5f 75 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f 2c  _usage_msg(pgno,
6160: 20 22 50 54 52 4d 41 50 20 70 61 67 65 20 63 6f   "PTRMAP page co
6170: 76 65 72 69 6e 67 20 25 64 2e 2e 25 64 22 2c 0a  vering %d..%d",.
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 2b             pgno+
61a0: 31 2c 20 70 67 6e 6f 2b 70 65 72 50 61 67 65 29  1, pgno+perPage)
61b0: 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 2b 3d 20  ;.      pgno += 
61c0: 70 65 72 50 61 67 65 20 2b 20 31 3b 0a 20 20 20  perPage + 1;.   
61d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
61e0: 54 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75  Try to figure ou
61f0: 74 20 68 6f 77 20 65 76 65 72 79 20 70 61 67 65  t how every page
6200: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
6210: 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 75   file is being u
6220: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
6230: 6f 69 64 20 70 61 67 65 5f 75 73 61 67 65 5f 72  oid page_usage_r
6240: 65 70 6f 72 74 28 63 6f 6e 73 74 20 63 68 61 72  eport(const char
6250: 20 2a 7a 50 72 67 2c 20 63 6f 6e 73 74 20 63 68   *zPrg, const ch
6260: 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
6270: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
6280: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
6290: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  b;.  sqlite3_stm
62a0: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 75 6e 73 69  t *pStmt;.  unsi
62b0: 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20  gned char *a;.  
62c0: 63 68 61 72 20 7a 51 75 65 72 79 5b 32 30 30 5d  char zQuery[200]
62d0: 3b 0a 0a 20 20 2f 2a 20 41 76 6f 69 64 20 74 68  ;..  /* Avoid th
62e0: 65 20 70 61 74 68 6f 6c 6f 67 69 63 61 6c 20 63  e pathological c
62f0: 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 67 2e 6d  ase */.  if( g.m
6300: 78 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 70  xPage<1 ){.    p
6310: 72 69 6e 74 66 28 22 65 6d 70 74 79 20 64 61 74  rintf("empty dat
6320: 61 62 61 73 65 5c 6e 22 29 3b 0a 20 20 20 20 72  abase\n");.    r
6330: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
6340: 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   Open the databa
6350: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 64 62 20  se file */.  db 
6360: 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
6370: 50 72 67 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 0a  Prg, zDbName);..
6380: 20 20 2f 2a 20 53 65 74 20 75 70 20 67 6c 6f 62    /* Set up glob
6390: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 50 61  al variables zPa
63a0: 67 65 55 73 65 5b 5d 20 61 6e 64 20 67 2e 6d 78  geUse[] and g.mx
63b0: 50 61 67 65 20 74 6f 20 72 65 63 6f 72 64 20 70  Page to record p
63c0: 61 67 65 0a 20 20 2a 2a 20 75 73 61 67 65 73 20  age.  ** usages 
63d0: 2a 2f 0a 20 20 7a 50 61 67 65 55 73 65 20 3d 20  */.  zPageUse = 
63e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
63f0: 73 69 7a 65 6f 66 28 7a 50 61 67 65 55 73 65 5b  sizeof(zPageUse[
6400: 30 5d 29 2a 28 67 2e 6d 78 50 61 67 65 2b 31 29  0])*(g.mxPage+1)
6410: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 67 65 55   );.  if( zPageU
6420: 73 65 3d 3d 30 20 29 20 6f 75 74 5f 6f 66 5f 6d  se==0 ) out_of_m
6430: 65 6d 6f 72 79 28 29 3b 0a 20 20 6d 65 6d 73 65  emory();.  memse
6440: 74 28 7a 50 61 67 65 55 73 65 2c 20 30 2c 20 73  t(zPageUse, 0, s
6450: 69 7a 65 6f 66 28 7a 50 61 67 65 55 73 65 5b 30  izeof(zPageUse[0
6460: 5d 29 2a 28 67 2e 6d 78 50 61 67 65 2b 31 29 29  ])*(g.mxPage+1))
6470: 3b 0a 0a 20 20 2f 2a 20 44 69 73 63 6f 76 65 72  ;..  /* Discover
6480: 20 74 68 65 20 75 73 61 67 65 20 6f 66 20 65 61   the usage of ea
6490: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 61 20 3d  ch page */.  a =
64a0: 20 66 69 6c 65 52 65 61 64 28 30 2c 20 31 30 30   fileRead(0, 100
64b0: 29 3b 0a 20 20 70 61 67 65 5f 75 73 61 67 65 5f  );.  page_usage_
64c0: 66 72 65 65 6c 69 73 74 28 64 65 63 6f 64 65 49  freelist(decodeI
64d0: 6e 74 33 32 28 61 2b 33 32 29 29 3b 0a 20 20 70  nt32(a+32));.  p
64e0: 61 67 65 5f 75 73 61 67 65 5f 70 74 72 6d 61 70  age_usage_ptrmap
64f0: 28 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (a);.  sqlite3_f
6500: 72 65 65 28 61 29 3b 0a 20 20 70 61 67 65 5f 75  ree(a);.  page_u
6510: 73 61 67 65 5f 62 74 72 65 65 28 31 2c 20 30 2c  sage_btree(1, 0,
6520: 20 30 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   0, "sqlite_mast
6530: 65 72 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  er");.  sqlite3_
6540: 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41  exec(db, "PRAGMA
6550: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
6560: 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  =ON", 0, 0, 0);.
6570: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 3b 20    for(j=0; j<2; 
6580: 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  j++){.    sqlite
6590: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
65a0: 66 28 7a 51 75 65 72 79 29 2c 20 7a 51 75 65 72  f(zQuery), zQuer
65b0: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
65c0: 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61  "SELECT type, na
65d0: 6d 65 2c 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  me, rootpage FRO
65e0: 4d 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  M SQLITE_MASTER 
65f0: 57 48 45 52 45 20 72 6f 6f 74 70 61 67 65 22 0a  WHERE rootpage".
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
6610: 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 25 73  RDER BY rowid %s
6620: 22 2c 20 6a 3f 22 44 45 53 43 22 3a 22 22 29 3b  ", j?"DESC":"");
6630: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6640: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
6650: 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 53   zQuery, -1, &pS
6660: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
6670: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6680: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  {.      while( s
6690: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
66a0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
66b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 67  {.        int pg
66c0: 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
66d0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  umn_int(pStmt, 2
66e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
66f0: 75 73 61 67 65 5f 62 74 72 65 65 28 70 67 6e 6f  usage_btree(pgno
6700: 2c 20 30 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63  , 0, 0, (const c
6710: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
6720: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31  umn_text(pStmt,1
6730: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
6740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 69  }else{.      pri
6750: 6e 74 66 28 22 45 52 52 4f 52 3a 20 63 61 6e 6e  ntf("ERROR: cann
6760: 6f 74 20 71 75 65 72 79 20 64 61 74 61 62 61 73  ot query databas
6770: 65 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  e: %s\n", sqlite
6780: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
6790: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
67a0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
67b0: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
67c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c==SQLITE_OK ) b
67d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  reak;.  }.  sqli
67e0: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 0a  te3_close(db);..
67f0: 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 72    /* Print the r
6800: 65 70 6f 72 74 20 61 6e 64 20 66 72 65 65 20 6d  eport and free m
6810: 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20  emory used */.  
6820: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 67 2e 6d 78  for(i=1; i<=g.mx
6830: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
6840: 70 72 69 6e 74 66 28 22 25 35 64 3a 20 25 73 5c  printf("%5d: %s\
6850: 6e 22 2c 20 69 2c 20 7a 50 61 67 65 55 73 65 5b  n", i, zPageUse[
6860: 69 5d 20 3f 20 7a 50 61 67 65 55 73 65 5b 69 5d  i] ? zPageUse[i]
6870: 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20 20 20 20 73   : "???");.    s
6880: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 67  qlite3_free(zPag
6890: 65 55 73 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  eUse[i]);.  }.  
68a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
68b0: 67 65 55 73 65 29 3b 0a 20 20 7a 50 61 67 65 55  geUse);.  zPageU
68c0: 73 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se = 0;.}../*.**
68d0: 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f   Try to figure o
68e0: 75 74 20 68 6f 77 20 65 76 65 72 79 20 70 61 67  ut how every pag
68f0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
6900: 65 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  e file is being 
6910: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
6920: 76 6f 69 64 20 70 74 72 6d 61 70 5f 63 6f 76 65  void ptrmap_cove
6930: 72 61 67 65 5f 72 65 70 6f 72 74 28 63 6f 6e 73  rage_report(cons
6940: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
6950: 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20  {.  int pgno;.  
6960: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
6970: 48 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Hdr;.  unsigned 
6980: 63 68 61 72 20 2a 61 3b 0a 20 20 69 6e 74 20 75  char *a;.  int u
6990: 73 61 62 6c 65 3b 0a 20 20 69 6e 74 20 70 65 72  sable;.  int per
69a0: 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Page;.  int i;..
69b0: 20 20 2f 2a 20 41 76 6f 69 64 20 74 68 65 20 70    /* Avoid the p
69c0: 61 74 68 6f 6c 6f 67 69 63 61 6c 20 63 61 73 65  athological case
69d0: 20 2a 2f 0a 20 20 69 66 28 20 67 2e 6d 78 50 61   */.  if( g.mxPa
69e0: 67 65 3c 31 20 29 7b 0a 20 20 20 20 70 72 69 6e  ge<1 ){.    prin
69f0: 74 66 28 22 65 6d 70 74 79 20 64 61 74 61 62 61  tf("empty databa
6a00: 73 65 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  se\n");.    retu
6a10: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
6a20: 6b 65 20 73 75 72 65 20 50 54 52 4d 41 50 73 20  ke sure PTRMAPs 
6a30: 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 69 73  are used in this
6a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
6a50: 48 64 72 20 3d 20 66 69 6c 65 52 65 61 64 28 30  Hdr = fileRead(0
6a60: 2c 20 31 30 30 29 3b 0a 20 20 69 66 28 20 61 48  , 100);.  if( aH
6a70: 64 72 5b 35 35 5d 3d 3d 30 20 29 7b 0a 20 20 20  dr[55]==0 ){.   
6a80: 20 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73   printf("databas
6a90: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 50  e does not use P
6aa0: 54 52 4d 41 50 20 70 61 67 65 73 5c 6e 22 29 3b  TRMAP pages\n");
6ab0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6ac0: 0a 20 20 75 73 61 62 6c 65 20 3d 20 67 2e 70 61  .  usable = g.pa
6ad0: 67 65 73 69 7a 65 20 2d 20 61 48 64 72 5b 32 30  gesize - aHdr[20
6ae0: 5d 3b 0a 20 20 70 65 72 50 61 67 65 20 3d 20 75  ];.  perPage = u
6af0: 73 61 62 6c 65 2f 35 3b 0a 20 20 73 71 6c 69 74  sable/5;.  sqlit
6b00: 65 33 5f 66 72 65 65 28 61 48 64 72 29 3b 0a 20  e3_free(aHdr);. 
6b10: 20 70 72 69 6e 74 66 28 22 25 35 64 3a 20 72 6f   printf("%5d: ro
6b20: 6f 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73  ot of sqlite_mas
6b30: 74 65 72 5c 6e 22 2c 20 31 29 3b 0a 20 20 66 6f  ter\n", 1);.  fo
6b40: 72 28 70 67 6e 6f 3d 32 3b 20 70 67 6e 6f 3c 3d  r(pgno=2; pgno<=
6b50: 67 2e 6d 78 50 61 67 65 3b 20 70 67 6e 6f 20 2b  g.mxPage; pgno +
6b60: 3d 20 70 65 72 50 61 67 65 2b 31 29 7b 0a 20 20  = perPage+1){.  
6b70: 20 20 70 72 69 6e 74 66 28 22 25 35 64 3a 20 50    printf("%5d: P
6b80: 54 52 4d 41 50 20 70 61 67 65 20 63 6f 76 65 72  TRMAP page cover
6b90: 69 6e 67 20 25 64 2e 2e 25 64 5c 6e 22 2c 20 70  ing %d..%d\n", p
6ba0: 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
6bb0: 70 67 6e 6f 2b 31 2c 20 70 67 6e 6f 2b 70 65 72  pgno+1, pgno+per
6bc0: 50 61 67 65 29 3b 0a 20 20 20 20 61 20 3d 20 66  Page);.    a = f
6bd0: 69 6c 65 52 65 61 64 28 28 70 67 6e 6f 2d 31 29  ileRead((pgno-1)
6be0: 2a 67 2e 70 61 67 65 73 69 7a 65 2c 20 75 73 61  *g.pagesize, usa
6bf0: 62 6c 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ble);.    for(i=
6c00: 30 3b 20 69 2b 35 3c 3d 75 73 61 62 6c 65 20 26  0; i+5<=usable &
6c10: 26 20 70 67 6e 6f 2b 31 2b 69 2f 35 3c 3d 67 2e  & pgno+1+i/5<=g.
6c20: 6d 78 50 61 67 65 3b 20 69 2b 3d 35 29 7b 0a 20  mxPage; i+=5){. 
6c30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
6c40: 2a 7a 54 79 70 65 20 3d 20 22 3f 3f 3f 22 3b 0a  *zType = "???";.
6c50: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
6c60: 6e 74 20 69 46 72 6f 6d 20 3d 20 64 65 63 6f 64  nt iFrom = decod
6c70: 65 49 6e 74 33 32 28 26 61 5b 69 2b 31 5d 29 3b  eInt32(&a[i+1]);
6c80: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 61  .      switch( a
6c90: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  [i] ){.        c
6ca0: 61 73 65 20 31 3a 20 20 7a 54 79 70 65 20 3d 20  ase 1:  zType = 
6cb0: 22 62 2d 74 72 65 65 20 72 6f 6f 74 20 70 61 67  "b-tree root pag
6cc0: 65 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  e";        break
6cd0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
6ce0: 3a 20 20 7a 54 79 70 65 20 3d 20 22 66 72 65 65  :  zType = "free
6cf0: 6c 69 73 74 20 70 61 67 65 22 3b 20 20 20 20 20  list page";     
6d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d10: 20 20 20 20 20 63 61 73 65 20 33 3a 20 20 7a 54       case 3:  zT
6d20: 79 70 65 20 3d 20 22 66 69 72 73 74 20 70 61 67  ype = "first pag
6d30: 65 20 6f 66 20 6f 76 65 72 66 6c 6f 77 22 3b 20  e of overflow"; 
6d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6d50: 63 61 73 65 20 34 3a 20 20 7a 54 79 70 65 20 3d  case 4:  zType =
6d60: 20 22 6c 61 74 65 72 20 70 61 67 65 20 6f 66 20   "later page of 
6d70: 6f 76 65 72 66 6c 6f 77 22 3b 20 20 62 72 65 61  overflow";  brea
6d80: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
6d90: 35 3a 20 20 7a 54 79 70 65 20 3d 20 22 62 2d 74  5:  zType = "b-t
6da0: 72 65 65 20 6e 6f 6e 2d 72 6f 6f 74 20 70 61 67  ree non-root pag
6db0: 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e";    break;.  
6dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
6dd0: 74 66 28 22 25 35 64 3a 20 25 73 2c 20 70 61 72  tf("%5d: %s, par
6de0: 65 6e 74 3d 25 75 5c 6e 22 2c 20 70 67 6e 6f 2b  ent=%u\n", pgno+
6df0: 31 2b 69 2f 35 2c 20 7a 54 79 70 65 2c 20 69 46  1+i/5, zType, iF
6e00: 72 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rom);.    }.    
6e10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
6e20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
6e30: 69 6e 74 20 61 20 75 73 61 67 65 20 63 6f 6d 6d  int a usage comm
6e40: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent.*/.static vo
6e50: 69 64 20 75 73 61 67 65 28 63 6f 6e 73 74 20 63  id usage(const c
6e60: 68 61 72 20 2a 61 72 67 76 30 29 7b 0a 20 20 66  har *argv0){.  f
6e70: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
6e80: 55 73 61 67 65 20 25 73 20 3f 2d 2d 75 72 69 3f  Usage %s ?--uri?
6e90: 20 46 49 4c 45 4e 41 4d 45 20 3f 61 72 67 73 2e   FILENAME ?args.
6ea0: 2e 2e 3f 5c 6e 5c 6e 22 2c 20 61 72 67 76 30 29  ..?\n\n", argv0)
6eb0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
6ec0: 72 72 2c 0a 20 20 20 20 22 73 77 69 74 63 68 65  rr,.    "switche
6ed0: 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 2d  s:\n".    "    -
6ee0: 2d 72 61 77 20 20 20 20 20 20 20 20 20 20 20 52  -raw           R
6ef0: 65 61 64 20 64 62 20 66 69 6c 65 20 64 69 72 65  ead db file dire
6f00: 63 74 6c 79 2c 20 62 79 70 61 73 73 69 6e 67 20  ctly, bypassing 
6f10: 53 51 4c 69 74 65 20 56 46 53 5c 6e 22 0a 20 20  SQLite VFS\n".  
6f20: 20 20 22 61 72 67 73 3a 5c 6e 22 0a 20 20 20 20    "args:\n".    
6f30: 22 20 20 20 20 64 62 68 65 61 64 65 72 20 20 20  "    dbheader   
6f40: 20 20 20 20 20 53 68 6f 77 20 64 61 74 61 62 61       Show databa
6f50: 73 65 20 68 65 61 64 65 72 5c 6e 22 0a 20 20 20  se header\n".   
6f60: 20 22 20 20 20 20 70 67 69 64 78 20 20 20 20 20   "    pgidx     
6f70: 20 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 68        Index of h
6f80: 6f 77 20 65 61 63 68 20 70 61 67 65 20 69 73 20  ow each page is 
6f90: 75 73 65 64 5c 6e 22 0a 20 20 20 20 22 20 20 20  used\n".    "   
6fa0: 20 70 74 72 6d 61 70 20 20 20 20 20 20 20 20 20   ptrmap         
6fb0: 20 53 68 6f 77 20 61 6c 6c 20 50 54 52 4d 41 50   Show all PTRMAP
6fc0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 5c 6e 22   page content\n"
6fd0: 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 2e 2e 4d  .    "    NNN..M
6fe0: 4d 4d 20 20 20 20 20 20 20 20 53 68 6f 77 20 68  MM        Show h
6ff0: 65 78 20 6f 66 20 70 61 67 65 73 20 4e 4e 4e 20  ex of pages NNN 
7000: 74 68 72 6f 75 67 68 20 4d 4d 4d 5c 6e 22 0a 20  through MMM\n". 
7010: 20 20 20 22 20 20 20 20 4e 4e 4e 2e 2e 65 6e 64     "    NNN..end
7020: 20 20 20 20 20 20 20 20 53 68 6f 77 20 68 65 78          Show hex
7030: 20 6f 66 20 70 61 67 65 73 20 4e 4e 4e 20 74 68   of pages NNN th
7040: 72 6f 75 67 68 20 65 6e 64 20 6f 66 20 66 69 6c  rough end of fil
7050: 65 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e  e\n".    "    NN
7060: 4e 62 20 20 20 20 20 20 20 20 20 20 20 20 44 65  Nb            De
7070: 63 6f 64 65 20 62 74 72 65 65 20 70 61 67 65 20  code btree page 
7080: 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  NNN\n".    "    
7090: 4e 4e 4e 62 63 20 20 20 20 20 20 20 20 20 20 20  NNNbc           
70a0: 44 65 63 6f 64 65 20 62 74 72 65 65 20 70 61 67  Decode btree pag
70b0: 65 20 4e 4e 4e 20 61 6e 64 20 73 68 6f 77 20 63  e NNN and show c
70c0: 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 22 20  ontent\n".    " 
70d0: 20 20 20 4e 4e 4e 62 6d 20 20 20 20 20 20 20 20     NNNbm        
70e0: 20 20 20 44 65 63 6f 64 65 20 62 74 72 65 65 20     Decode btree 
70f0: 70 61 67 65 20 4e 4e 4e 20 61 6e 64 20 73 68 6f  page NNN and sho
7100: 77 20 61 20 6c 61 79 6f 75 74 20 6d 61 70 5c 6e  w a layout map\n
7110: 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 62 64  ".    "    NNNbd
7120: 43 43 43 20 20 20 20 20 20 20 20 44 65 63 6f 64  CCC        Decod
7130: 65 20 63 65 6c 6c 20 43 43 43 20 6f 6e 20 62 74  e cell CCC on bt
7140: 72 65 65 20 70 61 67 65 20 4e 4e 4e 5c 6e 22 0a  ree page NNN\n".
7150: 20 20 20 20 22 20 20 20 20 4e 4e 4e 74 20 20 20      "    NNNt   
7160: 20 20 20 20 20 20 20 20 20 44 65 63 6f 64 65 20           Decode 
7170: 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
7180: 61 67 65 20 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22  age NNN\n".    "
7190: 20 20 20 20 4e 4e 4e 74 64 20 20 20 20 20 20 20      NNNtd       
71a0: 20 20 20 20 53 68 6f 77 20 6c 65 61 66 20 66 72      Show leaf fr
71b0: 65 65 6c 69 73 74 20 70 61 67 65 73 20 6f 6e 20  eelist pages on 
71c0: 74 68 65 20 64 65 63 6f 64 65 5c 6e 22 0a 20 20  the decode\n".  
71d0: 20 20 22 20 20 20 20 4e 4e 4e 74 72 20 20 20 20    "    NNNtr    
71e0: 20 20 20 20 20 20 20 52 65 63 75 72 73 69 76 65         Recursive
71f0: 6c 79 20 64 65 63 6f 64 65 20 66 72 65 65 6c 69  ly decode freeli
7200: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 4e  st starting at N
7210: 4e 4e 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 69 6e  NN\n".  );.}..in
7220: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
7230: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
7240: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
7250: 7a 46 69 6c 65 3b 0a 20 20 75 6e 73 69 67 6e 65  zFile;.  unsigne
7260: 64 20 63 68 61 72 20 2a 7a 50 67 53 7a 3b 0a 20  d char *zPgSz;. 
7270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
7280: 67 20 3d 20 61 72 67 76 5b 30 5d 3b 20 20 20 20  g = argv[0];    
7290: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73   /* Name of this
72a0: 20 65 78 65 63 75 74 61 62 6c 65 20 2a 2f 0a 20   executable */. 
72b0: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 20 3d 20   char **azArg = 
72c0: 61 72 67 76 3b 0a 20 20 69 6e 74 20 6e 41 72 67  argv;.  int nArg
72d0: 20 3d 20 61 72 67 63 3b 0a 0a 20 20 2f 2a 20 43   = argc;..  /* C
72e0: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 2d 2d  heck for the "--
72f0: 75 72 69 22 20 6f 72 20 22 2d 75 72 69 22 20 73  uri" or "-uri" s
7300: 77 69 74 63 68 2e 20 2a 2f 0a 20 20 69 66 28 20  witch. */.  if( 
7310: 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 69 66  nArg>1 ){.    if
7320: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
7330: 70 28 22 2d 72 61 77 22 2c 20 61 7a 41 72 67 5b  p("-raw", azArg[
7340: 31 5d 29 3d 3d 30 20 0a 20 20 20 20 20 7c 7c 20  1])==0 .     || 
7350: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
7360: 22 2d 2d 72 61 77 22 2c 20 61 7a 41 72 67 5b 31  "--raw", azArg[1
7370: 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ])==0.    ){.   
7380: 20 20 20 67 2e 62 52 61 77 20 3d 20 31 3b 0a 20     g.bRaw = 1;. 
7390: 20 20 20 20 20 61 7a 41 72 67 2b 2b 3b 0a 20 20       azArg++;.  
73a0: 20 20 20 20 6e 41 72 67 2d 2d 3b 0a 20 20 20 20      nArg--;.    
73b0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 41 72  }.  }..  if( nAr
73c0: 67 3c 32 20 29 7b 0a 20 20 20 20 75 73 61 67 65  g<2 ){.    usage
73d0: 28 7a 50 72 67 29 3b 0a 20 20 20 20 65 78 69 74  (zPrg);.    exit
73e0: 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 69 6c 65  (1);.  }..  file
73f0: 4f 70 65 6e 28 7a 50 72 67 2c 20 61 7a 41 72 67  Open(zPrg, azArg
7400: 5b 31 5d 29 3b 0a 20 20 73 7a 46 69 6c 65 20 3d  [1]);.  szFile =
7410: 20 66 69 6c 65 47 65 74 73 69 7a 65 28 29 3b 0a   fileGetsize();.
7420: 0a 20 20 7a 50 67 53 7a 20 3d 20 66 69 6c 65 52  .  zPgSz = fileR
7430: 65 61 64 28 31 36 2c 20 32 29 3b 0a 20 20 67 2e  ead(16, 2);.  g.
7440: 70 61 67 65 73 69 7a 65 20 3d 20 7a 50 67 53 7a  pagesize = zPgSz
7450: 5b 30 5d 2a 32 35 36 20 2b 20 7a 50 67 53 7a 5b  [0]*256 + zPgSz[
7460: 31 5d 2a 36 35 35 33 36 3b 0a 20 20 69 66 28 20  1]*65536;.  if( 
7470: 67 2e 70 61 67 65 73 69 7a 65 3d 3d 30 20 29 20  g.pagesize==0 ) 
7480: 67 2e 70 61 67 65 73 69 7a 65 20 3d 20 31 30 32  g.pagesize = 102
7490: 34 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  4;.  sqlite3_fre
74a0: 65 28 7a 50 67 53 7a 29 3b 0a 0a 20 20 70 72 69  e(zPgSz);..  pri
74b0: 6e 74 66 28 22 50 61 67 65 73 69 7a 65 3a 20 25  ntf("Pagesize: %
74c0: 64 5c 6e 22 2c 20 67 2e 70 61 67 65 73 69 7a 65  d\n", g.pagesize
74d0: 29 3b 0a 20 20 67 2e 6d 78 50 61 67 65 20 3d 20  );.  g.mxPage = 
74e0: 28 69 6e 74 29 28 28 73 7a 46 69 6c 65 2b 67 2e  (int)((szFile+g.
74f0: 70 61 67 65 73 69 7a 65 2d 31 29 2f 67 2e 70 61  pagesize-1)/g.pa
7500: 67 65 73 69 7a 65 29 3b 0a 0a 20 20 70 72 69 6e  gesize);..  prin
7510: 74 66 28 22 41 76 61 69 6c 61 62 6c 65 20 70 61  tf("Available pa
7520: 67 65 73 3a 20 31 2e 2e 25 64 5c 6e 22 2c 20 67  ges: 1..%d\n", g
7530: 2e 6d 78 50 61 67 65 29 3b 0a 20 20 69 66 28 20  .mxPage);.  if( 
7540: 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 69  nArg==2 ){.    i
7550: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
7560: 31 3b 20 69 3c 3d 67 2e 6d 78 50 61 67 65 3b 20  1; i<=g.mxPage; 
7570: 69 2b 2b 29 20 70 72 69 6e 74 5f 70 61 67 65 28  i++) print_page(
7580: 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  i);.  }else{.   
7590: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
75a0: 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=2; i<nArg; i++
75b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 74  ){.      int iSt
75c0: 61 72 74 2c 20 69 45 6e 64 3b 0a 20 20 20 20 20  art, iEnd;.     
75d0: 20 63 68 61 72 20 2a 7a 4c 65 66 74 3b 0a 20 20   char *zLeft;.  
75e0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
75f0: 7a 41 72 67 5b 69 5d 2c 20 22 64 62 68 65 61 64  zArg[i], "dbhead
7600: 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
7610: 20 20 20 70 72 69 6e 74 5f 64 62 5f 68 65 61 64     print_db_head
7620: 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  er();.        co
7630: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
7640: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
7650: 28 61 7a 41 72 67 5b 69 5d 2c 20 22 70 67 69 64  (azArg[i], "pgid
7660: 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
7670: 20 20 70 61 67 65 5f 75 73 61 67 65 5f 72 65 70    page_usage_rep
7680: 6f 72 74 28 7a 50 72 67 2c 20 61 7a 41 72 67 5b  ort(zPrg, azArg[
7690: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  1]);.        con
76a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
76b0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
76c0: 61 7a 41 72 67 5b 69 5d 2c 20 22 70 74 72 6d 61  azArg[i], "ptrma
76d0: 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
76e0: 20 20 70 74 72 6d 61 70 5f 63 6f 76 65 72 61 67    ptrmap_coverag
76f0: 65 5f 72 65 70 6f 72 74 28 61 7a 41 72 67 5b 31  e_report(azArg[1
7700: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ]);.        cont
7710: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
7720: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
7730: 7a 41 72 67 5b 69 5d 2c 20 22 68 65 6c 70 22 29  zArg[i], "help")
7740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
7750: 73 61 67 65 28 7a 50 72 67 29 3b 0a 20 20 20 20  sage(zPrg);.    
7760: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7770: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7780: 21 49 53 44 49 47 49 54 28 61 7a 41 72 67 5b 69  !ISDIGIT(azArg[i
7790: 5d 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  ][0]) ){.       
77a0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
77b0: 20 22 25 73 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70   "%s: unknown op
77c0: 74 69 6f 6e 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  tion: [%s]\n", z
77d0: 50 72 67 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  Prg, azArg[i]);.
77e0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
77f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7800: 69 53 74 61 72 74 20 3d 20 73 74 72 74 6f 6c 28  iStart = strtol(
7810: 61 7a 41 72 67 5b 69 5d 2c 20 26 7a 4c 65 66 74  azArg[i], &zLeft
7820: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7830: 7a 4c 65 66 74 20 26 26 20 73 74 72 63 6d 70 28  zLeft && strcmp(
7840: 7a 4c 65 66 74 2c 22 2e 2e 65 6e 64 22 29 3d 3d  zLeft,"..end")==
7850: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 45 6e  0 ){.        iEn
7860: 64 20 3d 20 67 2e 6d 78 50 61 67 65 3b 0a 20 20  d = g.mxPage;.  
7870: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
7880: 65 66 74 20 26 26 20 7a 4c 65 66 74 5b 30 5d 3d  eft && zLeft[0]=
7890: 3d 27 2e 27 20 26 26 20 7a 4c 65 66 74 5b 31 5d  ='.' && zLeft[1]
78a0: 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
78b0: 20 69 45 6e 64 20 3d 20 73 74 72 74 6f 6c 28 26   iEnd = strtol(&
78c0: 7a 4c 65 66 74 5b 32 5d 2c 20 30 2c 20 30 29 3b  zLeft[2], 0, 0);
78d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
78e0: 20 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66 74 5b   zLeft && zLeft[
78f0: 30 5d 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20  0]=='b' ){.     
7900: 20 20 20 69 6e 74 20 6f 66 73 74 2c 20 6e 42 79     int ofst, nBy
7910: 74 65 2c 20 68 64 72 53 69 7a 65 3b 0a 20 20 20  te, hdrSize;.   
7920: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
7930: 61 72 20 2a 61 3b 0a 20 20 20 20 20 20 20 20 69  ar *a;.        i
7940: 66 28 20 69 53 74 61 72 74 3d 3d 31 20 29 7b 0a  f( iStart==1 ){.
7950: 20 20 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d            ofst =
7960: 20 68 64 72 53 69 7a 65 20 3d 20 31 30 30 3b 0a   hdrSize = 100;.
7970: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
7980: 3d 20 67 2e 70 61 67 65 73 69 7a 65 2d 31 30 30  = g.pagesize-100
7990: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
79a0: 0a 20 20 20 20 20 20 20 20 20 20 68 64 72 53 69  .          hdrSi
79b0: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
79c0: 20 20 6f 66 73 74 20 3d 20 28 69 53 74 61 72 74    ofst = (iStart
79d0: 2d 31 29 2a 67 2e 70 61 67 65 73 69 7a 65 3b 0a  -1)*g.pagesize;.
79e0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
79f0: 3d 20 67 2e 70 61 67 65 73 69 7a 65 3b 0a 20 20  = g.pagesize;.  
7a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7a10: 61 20 3d 20 66 69 6c 65 52 65 61 64 28 6f 66 73  a = fileRead(ofs
7a20: 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  t, nByte);.     
7a30: 20 20 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f     decode_btree_
7a40: 70 61 67 65 28 61 2c 20 69 53 74 61 72 74 2c 20  page(a, iStart, 
7a50: 68 64 72 53 69 7a 65 2c 20 26 7a 4c 65 66 74 5b  hdrSize, &zLeft[
7a60: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1]);.        sql
7a70: 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
7a80: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7a90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7aa0: 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66 74 5b 30  zLeft && zLeft[0
7ab0: 5d 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  ]=='t' ){.      
7ac0: 20 20 69 6e 74 20 64 65 74 61 69 6c 20 3d 20 30    int detail = 0
7ad0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
7ae0: 63 75 72 73 69 76 65 20 3d 20 30 3b 0a 20 20 20  cursive = 0;.   
7af0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
7b00: 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 7a 4c 65      for(j=1; zLe
7b10: 66 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ft[j]; j++){.   
7b20: 20 20 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74         if( zLeft
7b30: 5b 6a 5d 3d 3d 27 72 27 20 29 20 72 65 63 75 72  [j]=='r' ) recur
7b40: 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
7b50: 20 20 20 20 69 66 28 20 7a 4c 65 66 74 5b 6a 5d      if( zLeft[j]
7b60: 3d 3d 27 64 27 20 29 20 64 65 74 61 69 6c 20 3d  =='d' ) detail =
7b70: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7b80: 20 20 20 20 20 20 64 65 63 6f 64 65 5f 74 72 75        decode_tru
7b90: 6e 6b 5f 70 61 67 65 28 69 53 74 61 72 74 2c 20  nk_page(iStart, 
7ba0: 64 65 74 61 69 6c 2c 20 72 65 63 75 72 73 69 76  detail, recursiv
7bb0: 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  e);.        cont
7bc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
7bd0: 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20  e{.        iEnd 
7be0: 3d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = iStart;.      
7bf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53 74 61  }.      if( iSta
7c00: 72 74 3c 31 20 7c 7c 20 69 45 6e 64 3c 69 53 74  rt<1 || iEnd<iSt
7c10: 61 72 74 20 7c 7c 20 69 45 6e 64 3e 67 2e 6d 78  art || iEnd>g.mx
7c20: 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
7c30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
7c40: 20 20 20 20 20 20 20 20 20 20 22 50 61 67 65 20            "Page 
7c50: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
7c60: 62 65 20 4c 4f 57 45 52 3f 2e 2e 55 50 50 45 52  be LOWER?..UPPER
7c70: 3f 2e 20 20 52 61 6e 67 65 20 31 20 74 6f 20 25  ?.  Range 1 to %
7c80: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
7c90: 67 2e 6d 78 50 61 67 65 29 3b 0a 20 20 20 20 20  g.mxPage);.     
7ca0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
7cb0: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
7cc0: 20 69 53 74 61 72 74 3c 3d 69 45 6e 64 20 29 7b   iStart<=iEnd ){
7cd0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 5f 70  .        print_p
7ce0: 61 67 65 28 69 53 74 61 72 74 29 3b 0a 20 20 20  age(iStart);.   
7cf0: 20 20 20 20 20 69 53 74 61 72 74 2b 2b 3b 0a 20       iStart++;. 
7d00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7d10: 0a 20 20 66 69 6c 65 43 6c 6f 73 65 28 29 3b 0a  .  fileClose();.
7d20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a          return 0;.}.