/ Hex Artifact Content
Login

Artifact c695a5d5c8110640e0d9fadf5e254da90c79c36e:


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 65 6e     while( x+j<en
3700: 64 20 26 26 20 6a 3c 6e 48 64 72 20 29 7b 0a 20  d && j<nHdr ){. 
3710: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
3720: 20 2a 7a 54 79 70 65 4e 61 6d 65 3b 0a 20 20 20   *zTypeName;.   
3730: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 30 3b 0a      int sz = 0;.
3740: 20 20 20 20 20 20 20 63 68 61 72 20 7a 4e 6d 5b         char zNm[
3750: 33 30 5d 3b 0a 20 20 20 20 20 20 20 69 20 3d 20  30];.       i = 
3760: 64 65 63 6f 64 65 56 61 72 69 6e 74 28 78 2b 6a  decodeVarint(x+j
3770: 2c 20 26 69 54 79 70 65 29 3b 0a 20 20 20 20 20  , &iType);.     
3780: 20 20 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20    printBytes(a, 
3790: 78 2b 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  x+j, i);.       
37a0: 70 72 69 6e 74 66 28 22 74 79 70 65 63 6f 64 65  printf("typecode
37b0: 5b 25 64 5d 3a 20 25 64 20 2d 20 22 2c 20 6e 43  [%d]: %d - ", nC
37c0: 6f 6c 2c 20 28 69 6e 74 29 69 54 79 70 65 29 3b  ol, (int)iType);
37d0: 0a 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20  .       switch( 
37e0: 69 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20  iType ){.       
37f0: 20 20 63 61 73 65 20 30 3a 20 20 7a 54 79 70 65    case 0:  zType
3800: 4e 61 6d 65 20 3d 20 22 4e 55 4c 4c 22 3b 20 20  Name = "NULL";  
3810: 20 20 73 7a 20 3d 20 30 3b 20 20 62 72 65 61 6b    sz = 0;  break
3820: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
3830: 31 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20  1:  zTypeName = 
3840: 22 69 6e 74 38 22 3b 20 20 20 20 73 7a 20 3d 20  "int8";    sz = 
3850: 31 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  1;  break;.     
3860: 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a 54 79      case 2:  zTy
3870: 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74 31 36 22  peName = "int16"
3880: 3b 20 20 20 73 7a 20 3d 20 32 3b 20 20 62 72 65  ;   sz = 2;  bre
3890: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
38a0: 65 20 33 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20  e 3:  zTypeName 
38b0: 3d 20 22 69 6e 74 32 34 22 3b 20 20 20 73 7a 20  = "int24";   sz 
38c0: 3d 20 33 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  = 3;  break;.   
38d0: 20 20 20 20 20 20 63 61 73 65 20 34 3a 20 20 7a        case 4:  z
38e0: 54 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74 33  TypeName = "int3
38f0: 32 22 3b 20 20 20 73 7a 20 3d 20 34 3b 20 20 62  2";   sz = 4;  b
3900: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
3910: 61 73 65 20 35 3a 20 20 7a 54 79 70 65 4e 61 6d  ase 5:  zTypeNam
3920: 65 20 3d 20 22 69 6e 74 34 38 22 3b 20 20 20 73  e = "int48";   s
3930: 7a 20 3d 20 36 3b 20 20 62 72 65 61 6b 3b 0a 20  z = 6;  break;. 
3940: 20 20 20 20 20 20 20 20 63 61 73 65 20 36 3a 20          case 6: 
3950: 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e   zTypeName = "in
3960: 74 36 34 22 3b 20 20 20 73 7a 20 3d 20 38 3b 20  t64";   sz = 8; 
3970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3980: 20 63 61 73 65 20 37 3a 20 20 7a 54 79 70 65 4e   case 7:  zTypeN
3990: 61 6d 65 20 3d 20 22 64 6f 75 62 6c 65 22 3b 20  ame = "double"; 
39a0: 20 73 7a 20 3d 20 38 3b 20 20 62 72 65 61 6b 3b   sz = 8;  break;
39b0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 38  .         case 8
39c0: 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22  :  zTypeName = "
39d0: 7a 65 72 6f 22 3b 20 20 20 20 73 7a 20 3d 20 30  zero";    sz = 0
39e0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
39f0: 20 20 20 63 61 73 65 20 39 3a 20 20 7a 54 79 70     case 9:  zTyp
3a00: 65 4e 61 6d 65 20 3d 20 22 6f 6e 65 22 3b 20 20  eName = "one";  
3a10: 20 20 20 73 7a 20 3d 20 30 3b 20 20 62 72 65 61     sz = 0;  brea
3a20: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
3a30: 20 31 30 3a 0a 20 20 20 20 20 20 20 20 20 63 61   10:.         ca
3a40: 73 65 20 31 31 3a 20 7a 54 79 70 65 4e 61 6d 65  se 11: zTypeName
3a50: 20 3d 20 22 65 72 72 6f 72 22 3b 20 20 20 73 7a   = "error";   sz
3a60: 20 3d 20 30 3b 20 20 62 72 65 61 6b 3b 0a 20 20   = 0;  break;.  
3a70: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
3a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 73 7a 20  {.           sz 
3a90: 3d 20 28 69 6e 74 29 28 69 54 79 70 65 2d 31 32  = (int)(iType-12
3aa0: 29 2f 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )/2;.           
3ab0: 73 70 72 69 6e 74 66 28 7a 4e 6d 2c 20 28 69 54  sprintf(zNm, (iT
3ac0: 79 70 65 26 31 29 3d 3d 30 20 3f 20 22 62 6c 6f  ype&1)==0 ? "blo
3ad0: 62 28 25 64 29 22 20 3a 20 22 74 65 78 74 28 25  b(%d)" : "text(%
3ae0: 64 29 22 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  d)", sz);.      
3af0: 20 20 20 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d       zTypeName =
3b00: 20 7a 4e 6d 3b 0a 20 20 20 20 20 20 20 20 20 20   zNm;.          
3b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3b20: 20 7d 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20   }.       }.    
3b30: 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22     printf("%s\n"
3b40: 2c 20 7a 54 79 70 65 4e 61 6d 65 29 3b 0a 20 20  , zTypeName);.  
3b50: 20 20 20 20 20 73 7a 43 6f 6c 5b 6e 43 6f 6c 5d       szCol[nCol]
3b60: 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 6f 66   = sz;.       of
3b70: 73 74 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 28 69  stCol[nCol] = (i
3b80: 6e 74 29 6b 3b 0a 20 20 20 20 20 20 20 74 79 70  nt)k;.       typ
3b90: 65 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 28 69 6e  eCol[nCol] = (in
3ba0: 74 29 69 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t)iType;.       
3bb0: 6b 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  k += sz;.       
3bc0: 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 6a  nCol++;.       j
3bd0: 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20   += i;.    }.   
3be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3bf0: 20 26 26 20 6f 66 73 74 43 6f 6c 5b 69 5d 2b 73   && ofstCol[i]+s
3c00: 7a 43 6f 6c 5b 69 5d 3c 3d 6e 4c 6f 63 61 6c 3b  zCol[i]<=nLocal;
3c10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 6e   i++){.       in
3c20: 74 20 73 20 3d 20 6f 66 73 74 43 6f 6c 5b 69 5d  t s = ofstCol[i]
3c30: 3b 0a 20 20 20 20 20 20 20 69 36 34 20 76 3b 0a  ;.       i64 v;.
3c40: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73         const uns
3c50: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
3c60: 61 3b 0a 20 20 20 20 20 20 20 69 66 28 20 73 7a  a;.       if( sz
3c70: 43 6f 6c 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  Col[i]==0 ) cont
3c80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 70 72 69  inue;.       pri
3c90: 6e 74 42 79 74 65 73 28 61 2c 20 78 2b 73 2c 20  ntBytes(a, x+s, 
3ca0: 73 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  szCol[i]);.     
3cb0: 20 20 70 72 69 6e 74 66 28 22 64 61 74 61 5b 25    printf("data[%
3cc0: 64 5d 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20 20  d]: ", i);.     
3cd0: 20 20 70 44 61 74 61 20 3d 20 78 2b 73 3b 0a 20    pData = x+s;. 
3ce0: 20 20 20 20 20 20 69 66 28 20 74 79 70 65 43 6f        if( typeCo
3cf0: 6c 5b 69 5d 3c 3d 37 20 29 7b 0a 20 20 20 20 20  l[i]<=7 ){.     
3d00: 20 20 20 20 76 20 3d 20 28 73 69 67 6e 65 64 20      v = (signed 
3d10: 63 68 61 72 29 70 44 61 74 61 5b 30 5d 3b 0a 20  char)pData[0];. 
3d20: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b          for(k=1;
3d30: 20 6b 3c 73 7a 43 6f 6c 5b 69 5d 3b 20 6b 2b 2b   k<szCol[i]; k++
3d40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 76 20  ){.           v 
3d50: 3d 20 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61  = (v<<8) + pData
3d60: 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a  [k];.         }.
3d70: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 79 70           if( typ
3d80: 65 43 6f 6c 5b 69 5d 3d 3d 37 20 29 7b 0a 20 20  eCol[i]==7 ){.  
3d90: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
3da0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 6d 65  r;.           me
3db0: 6d 63 70 79 28 26 72 2c 20 26 76 2c 20 73 69 7a  mcpy(&r, &v, siz
3dc0: 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20 20  eof(r));.       
3dd0: 20 20 20 20 70 72 69 6e 74 66 28 22 25 23 67 5c      printf("%#g\
3de0: 6e 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  n", r);.        
3df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3e00: 20 20 20 70 72 69 6e 74 66 28 22 25 6c 6c 64 5c     printf("%lld\
3e10: 6e 22 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20  n", v);.        
3e20: 20 7d 0a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b   }.       }else{
3e30: 0a 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  .         int ii
3e40: 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 63  , jj;.         c
3e50: 68 61 72 20 7a 43 6f 6e 73 74 5b 33 32 5d 3b 0a  har zConst[32];.
3e60: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 74 79           if( (ty
3e70: 70 65 43 6f 6c 5b 69 5d 26 31 29 3d 3d 30 20 29  peCol[i]&1)==0 )
3e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  {.           zCo
3e90: 6e 73 74 5b 30 5d 20 3d 20 27 78 27 3b 0a 20 20  nst[0] = 'x';.  
3ea0: 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 73 74 5b           zConst[
3eb0: 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20  1] = '\'';.     
3ec0: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 2c 20        for(ii=2, 
3ed0: 6a 6a 3d 30 3b 20 6a 6a 3c 73 7a 43 6f 6c 5b 69  jj=0; jj<szCol[i
3ee0: 5d 20 26 26 20 69 69 3c 32 34 3b 20 6a 6a 2b 2b  ] && ii<24; jj++
3ef0: 2c 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  , ii+=2){.      
3f00: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
3f10: 43 6f 6e 73 74 2b 69 69 2c 20 22 25 30 32 78 22  Const+ii, "%02x"
3f20: 2c 20 70 44 61 74 61 5b 6a 6a 5d 29 3b 0a 20 20  , pData[jj]);.  
3f30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3f40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3f50: 20 20 20 20 20 20 7a 43 6f 6e 73 74 5b 30 5d 20        zConst[0] 
3f60: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
3f70: 20 20 20 66 6f 72 28 69 69 3d 31 2c 20 6a 6a 3d     for(ii=1, jj=
3f80: 30 3b 20 6a 6a 3c 73 7a 43 6f 6c 5b 69 5d 20 26  0; jj<szCol[i] &
3f90: 26 20 69 69 3c 32 34 3b 20 6a 6a 2b 2b 2c 20 69  & ii<24; jj++, i
3fa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
3fb0: 20 20 20 7a 43 6f 6e 73 74 5b 69 69 5d 20 3d 20     zConst[ii] = 
3fc0: 49 53 50 52 49 4e 54 28 70 44 61 74 61 5b 6a 6a  ISPRINT(pData[jj
3fd0: 5d 29 20 3f 20 70 44 61 74 61 5b 6a 6a 5d 20 3a  ]) ? pData[jj] :
3fe0: 20 27 2e 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '.';.          
3ff0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 7a 43   }.           zC
4000: 6f 6e 73 74 5b 69 69 5d 20 3d 20 30 3b 0a 20 20  onst[ii] = 0;.  
4010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4020: 20 20 69 66 28 20 6a 6a 3c 73 7a 43 6f 6c 5b 69    if( jj<szCol[i
4030: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
4040: 6d 65 6d 63 70 79 28 7a 43 6f 6e 73 74 2b 69 69  memcpy(zConst+ii
4050: 2c 20 22 2e 2e 2e 27 22 2c 20 35 29 3b 0a 20 20  , "...'", 5);.  
4060: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4070: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
4080: 7a 43 6f 6e 73 74 2b 69 69 2c 20 22 27 22 2c 20  zConst+ii, "'", 
4090: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  2);.         }. 
40a0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
40b0: 25 73 5c 6e 22 2c 20 7a 43 6f 6e 73 74 29 3b 0a  %s\n", zConst);.
40c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
40d0: 6a 20 3d 20 6f 66 73 74 43 6f 6c 5b 69 5d 20 2b  j = ofstCol[i] +
40e0: 20 73 7a 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7d   szCol[i];.    }
40f0: 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 6e 4c 6f  .  }.  if( j<nLo
4100: 63 61 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  cal ){.    print
4110: 42 79 74 65 73 28 61 2c 20 78 2b 6a 2c 20 30 29  Bytes(a, x+j, 0)
4120: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 2e  ;.    printf("..
4130: 2e 20 25 6c 6c 64 20 62 79 74 65 73 20 6f 66 20  . %lld bytes of 
4140: 63 6f 6e 74 65 6e 74 20 2e 2e 2e 5c 6e 22 2c 20  content ...\n", 
4150: 6e 4c 6f 63 61 6c 2d 6a 29 3b 0a 20 20 7d 0a 20  nLocal-j);.  }. 
4160: 20 69 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79   if( nLocal<nPay
4170: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 72 69 6e  load ){.    prin
4180: 74 42 79 74 65 73 28 61 2c 20 78 2b 6e 4c 6f 63  tBytes(a, x+nLoc
4190: 61 6c 2c 20 34 29 3b 0a 20 20 20 20 70 72 69 6e  al, 4);.    prin
41a0: 74 66 28 22 6f 76 65 72 66 6c 6f 77 2d 70 61 67  tf("overflow-pag
41b0: 65 3a 20 25 64 5c 6e 22 2c 20 64 65 63 6f 64 65  e: %d\n", decode
41c0: 49 6e 74 33 32 28 78 2b 6e 4c 6f 63 61 6c 29 29  Int32(x+nLocal))
41d0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
41e0: 44 65 63 6f 64 65 20 61 20 62 74 72 65 65 20 70  Decode a btree p
41f0: 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  age.*/.static vo
4200: 69 64 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f  id decode_btree_
4210: 70 61 67 65 28 0a 20 20 75 6e 73 69 67 6e 65 64  page(.  unsigned
4220: 20 63 68 61 72 20 2a 61 2c 20 20 20 2f 2a 20 50   char *a,   /* P
4230: 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  age content */. 
4240: 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20   int pgno,      
4250: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
4260: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ber */.  int hdr
4270: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Size,        /* 
4280: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4290: 20 68 65 61 64 65 72 2e 20 20 30 20 6f 72 20 31   header.  0 or 1
42a0: 30 30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  00 */.  char *zA
42b0: 72 67 73 20 20 20 20 20 20 20 20 20 2f 2a 20 46  rgs         /* F
42c0: 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
42d0: 66 6f 72 6d 61 74 74 69 6e 67 20 2a 2f 0a 29 7b  formatting */.){
42e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
42f0: 54 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  Type = "unknown"
4300: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
4310: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
4320: 20 69 43 65 6c 6c 50 74 72 3b 0a 20 20 69 6e 74   iCellPtr;.  int
4330: 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74   showCellContent
4340: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 68 6f 77   = 0;.  int show
4350: 4d 61 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  Map = 0;.  int c
4360: 65 6c 6c 54 6f 44 65 63 6f 64 65 20 3d 20 2d 32  ellToDecode = -2
4370: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 70 20 3d  ;.  char *zMap =
4380: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 61 5b   0;.  switch( a[
4390: 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20 32  0] ){.    case 2
43a0: 3a 20 20 7a 54 79 70 65 20 3d 20 22 69 6e 64 65  :  zType = "inde
43b0: 78 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 22  x interior node"
43c0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
43d0: 73 65 20 35 3a 20 20 7a 54 79 70 65 20 3d 20 22  se 5:  zType = "
43e0: 74 61 62 6c 65 20 69 6e 74 65 72 69 6f 72 20 6e  table interior n
43f0: 6f 64 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ode";  break;.  
4400: 20 20 63 61 73 65 20 31 30 3a 20 7a 54 79 70 65    case 10: zType
4410: 20 3d 20 22 69 6e 64 65 78 20 6c 65 61 66 22 3b   = "index leaf";
4420: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
4430: 3b 0a 20 20 20 20 63 61 73 65 20 31 33 3a 20 7a  ;.    case 13: z
4440: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 20 6c 65  Type = "table le
4450: 61 66 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  af";           b
4460: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  reak;.  }.  whil
4470: 65 28 20 7a 41 72 67 73 5b 30 5d 20 29 7b 0a 20  e( zArgs[0] ){. 
4480: 20 20 20 73 77 69 74 63 68 28 20 7a 41 72 67 73     switch( zArgs
4490: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73  [0] ){.      cas
44a0: 65 20 27 63 27 3a 20 73 68 6f 77 43 65 6c 6c 43  e 'c': showCellC
44b0: 6f 6e 74 65 6e 74 20 3d 20 31 3b 20 20 62 72 65  ontent = 1;  bre
44c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27  ak;.      case '
44d0: 6d 27 3a 20 73 68 6f 77 4d 61 70 20 3d 20 31 3b  m': showMap = 1;
44e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
44f0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a  .      case 'd':
4500: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   {.        if( !
4510: 49 53 44 49 47 49 54 28 7a 41 72 67 73 5b 31 5d  ISDIGIT(zArgs[1]
4520: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
4530: 65 6c 6c 54 6f 44 65 63 6f 64 65 20 3d 20 2d 31  ellToDecode = -1
4540: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
4550: 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 54  .          cellT
4560: 6f 44 65 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  oDecode = 0;.   
4570: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 53         while( IS
4580: 44 49 47 49 54 28 7a 41 72 67 73 5b 31 5d 29 20  DIGIT(zArgs[1]) 
4590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
45a0: 41 72 67 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Args++;.        
45b0: 20 20 20 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65      cellToDecode
45c0: 20 3d 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65 2a   = cellToDecode*
45d0: 31 30 20 2b 20 7a 41 72 67 73 5b 30 5d 20 2d 20  10 + zArgs[0] - 
45e0: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '0';.          }
45f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4610: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 41 72 67  }.    }.    zArg
4620: 73 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  s++;.  }.  nCell
4630: 20 3d 20 61 5b 33 5d 2a 32 35 36 20 2b 20 61 5b   = a[3]*256 + a[
4640: 34 5d 3b 0a 20 20 69 43 65 6c 6c 50 74 72 20 3d  4];.  iCellPtr =
4650: 20 28 61 5b 30 5d 3d 3d 32 20 7c 7c 20 61 5b 30   (a[0]==2 || a[0
4660: 5d 3d 3d 35 29 20 3f 20 31 32 20 3a 20 38 3b 0a  ]==5) ? 12 : 8;.
4670: 20 20 69 66 28 20 63 65 6c 6c 54 6f 44 65 63 6f    if( cellToDeco
4680: 64 65 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  de>=nCell ){.   
4690: 20 70 72 69 6e 74 66 28 22 50 61 67 65 20 25 64   printf("Page %d
46a0: 20 68 61 73 20 6f 6e 6c 79 20 25 64 20 63 65 6c   has only %d cel
46b0: 6c 73 5c 6e 22 2c 20 70 67 6e 6f 2c 20 6e 43 65  ls\n", pgno, nCe
46c0: 6c 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ll);.    return;
46d0: 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 48  .  }.  printf("H
46e0: 65 61 64 65 72 20 6f 6e 20 62 74 72 65 65 20 70  eader on btree p
46f0: 61 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67 6e 6f  age %d:\n", pgno
4700: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
4710: 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 31 2c 20  e_line(a, 0, 1, 
4720: 7a 54 79 70 65 29 3b 0a 20 20 70 72 69 6e 74 5f  zType);.  print_
4730: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 31  decode_line(a, 1
4740: 2c 20 32 2c 20 22 4f 66 66 73 65 74 20 74 6f 20  , 2, "Offset to 
4750: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 22  first freeblock"
4760: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
4770: 65 5f 6c 69 6e 65 28 61 2c 20 33 2c 20 32 2c 20  e_line(a, 3, 2, 
4780: 22 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73  "Number of cells
4790: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 22 29 3b   on this page");
47a0: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
47b0: 6c 69 6e 65 28 61 2c 20 35 2c 20 32 2c 20 22 4f  line(a, 5, 2, "O
47c0: 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
47d0: 6e 74 65 6e 74 20 61 72 65 61 22 29 3b 0a 20 20  ntent area");.  
47e0: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
47f0: 65 28 61 2c 20 37 2c 20 31 2c 20 22 46 72 61 67  e(a, 7, 1, "Frag
4800: 6d 65 6e 74 65 64 20 62 79 74 65 20 63 6f 75 6e  mented byte coun
4810: 74 22 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3d  t");.  if( a[0]=
4820: 3d 32 20 7c 7c 20 61 5b 30 5d 3d 3d 35 20 29 7b  =2 || a[0]==5 ){
4830: 0a 20 20 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  .    print_decod
4840: 65 5f 6c 69 6e 65 28 61 2c 20 38 2c 20 34 2c 20  e_line(a, 8, 4, 
4850: 22 52 69 67 68 74 20 63 68 69 6c 64 22 29 3b 0a  "Right child");.
4860: 20 20 7d 0a 20 20 69 66 28 20 63 65 6c 6c 54 6f    }.  if( cellTo
4870: 44 65 63 6f 64 65 3d 3d 28 2d 32 29 20 26 26 20  Decode==(-2) && 
4880: 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
4890: 72 69 6e 74 66 28 22 20 6b 65 79 3a 20 6c 78 3d  rintf(" key: lx=
48a0: 6c 65 66 74 2d 63 68 69 6c 64 20 6e 3d 70 61 79  left-child n=pay
48b0: 6c 6f 61 64 2d 73 69 7a 65 20 72 3d 72 6f 77 69  load-size r=rowi
48c0: 64 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  d\n");.  }.  if(
48d0: 20 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20   showMap ){.    
48e0: 7a 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMap = sqlite3_m
48f0: 61 6c 6c 6f 63 28 67 2e 70 61 67 65 73 69 7a 65  alloc(g.pagesize
4900: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 4d  );.    memset(zM
4910: 61 70 2c 20 27 2e 27 2c 20 67 2e 70 61 67 65 73  ap, '.', g.pages
4920: 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ize);.    memset
4930: 28 7a 4d 61 70 2c 20 27 31 27 2c 20 68 64 72 53  (zMap, '1', hdrS
4940: 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ize);.    memset
4950: 28 26 7a 4d 61 70 5b 68 64 72 53 69 7a 65 5d 2c  (&zMap[hdrSize],
4960: 20 27 48 27 2c 20 69 43 65 6c 6c 50 74 72 29 3b   'H', iCellPtr);
4970: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4d 61  .    memset(&zMa
4980: 70 5b 68 64 72 53 69 7a 65 2b 69 43 65 6c 6c 50  p[hdrSize+iCellP
4990: 74 72 5d 2c 20 27 50 27 2c 20 32 2a 6e 43 65 6c  tr], 'P', 2*nCel
49a0: 6c 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  l);.  }.  for(i=
49b0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
49c0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 66 73 74 20  {.    int cofst 
49d0: 3d 20 69 43 65 6c 6c 50 74 72 20 2b 20 69 2a 32  = iCellPtr + i*2
49e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 65 73  ;.    char *zDes
49f0: 63 3b 0a 20 20 20 20 69 36 34 20 6e 3b 0a 0a 20  c;.    i64 n;.. 
4a00: 20 20 20 63 6f 66 73 74 20 3d 20 61 5b 63 6f 66     cofst = a[cof
4a10: 73 74 5d 2a 32 35 36 20 2b 20 61 5b 63 6f 66 73  st]*256 + a[cofs
4a20: 74 2b 31 5d 3b 0a 20 20 20 20 6e 20 3d 20 64 65  t+1];.    n = de
4a30: 73 63 72 69 62 65 43 65 6c 6c 28 61 5b 30 5d 2c  scribeCell(a[0],
4a40: 20 26 61 5b 63 6f 66 73 74 2d 68 64 72 53 69 7a   &a[cofst-hdrSiz
4a50: 65 5d 2c 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74  e], showCellCont
4a60: 65 6e 74 2c 20 26 7a 44 65 73 63 29 3b 0a 20 20  ent, &zDesc);.  
4a70: 20 20 69 66 28 20 73 68 6f 77 4d 61 70 20 29 7b    if( showMap ){
4a80: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
4a90: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  [30];.      mems
4aa0: 65 74 28 26 7a 4d 61 70 5b 63 6f 66 73 74 5d 2c  et(&zMap[cofst],
4ab0: 20 27 2a 27 2c 20 28 73 69 7a 65 5f 74 29 6e 29   '*', (size_t)n)
4ac0: 3b 0a 20 20 20 20 20 20 7a 4d 61 70 5b 63 6f 66  ;.      zMap[cof
4ad0: 73 74 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20  st] = '[';.     
4ae0: 20 7a 4d 61 70 5b 63 6f 66 73 74 2b 6e 2d 31 5d   zMap[cofst+n-1]
4af0: 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20 73 70   = ']';.      sp
4b00: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
4b10: 2c 20 69 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20  , i);.      j = 
4b20: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
4b30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 3d  );.      if( j<=
4b40: 6e 2d 32 20 29 20 6d 65 6d 63 70 79 28 26 7a 4d  n-2 ) memcpy(&zM
4b50: 61 70 5b 63 6f 66 73 74 2b 31 5d 2c 20 7a 42 75  ap[cofst+1], zBu
4b60: 66 2c 20 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  f, j);.    }.   
4b70: 20 69 66 28 20 63 65 6c 6c 54 6f 44 65 63 6f 64   if( cellToDecod
4b80: 65 3d 3d 28 2d 32 29 20 29 7b 0a 20 20 20 20 20  e==(-2) ){.     
4b90: 20 70 72 69 6e 74 66 28 22 20 25 30 33 78 3a 20   printf(" %03x: 
4ba0: 63 65 6c 6c 5b 25 64 5d 20 25 73 5c 6e 22 2c 20  cell[%d] %s\n", 
4bb0: 63 6f 66 73 74 2c 20 69 2c 20 7a 44 65 73 63 29  cofst, i, zDesc)
4bc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4bd0: 63 65 6c 6c 54 6f 44 65 63 6f 64 65 3d 3d 28 2d  cellToDecode==(-
4be0: 31 29 20 7c 7c 20 63 65 6c 6c 54 6f 44 65 63 6f  1) || cellToDeco
4bf0: 64 65 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 64  de==i ){.      d
4c00: 65 63 6f 64 65 43 65 6c 6c 28 61 2c 20 70 67 6e  ecodeCell(a, pgn
4c10: 6f 2c 20 69 2c 20 68 64 72 53 69 7a 65 2c 20 63  o, i, hdrSize, c
4c20: 6f 66 73 74 2d 68 64 72 53 69 7a 65 29 3b 0a 20  ofst-hdrSize);. 
4c30: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
4c40: 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20 70 72  howMap ){.    pr
4c50: 69 6e 74 66 28 22 50 61 67 65 20 6d 61 70 3a 20  intf("Page map: 
4c60: 20 28 48 3d 68 65 61 64 65 72 20 50 3d 63 65 6c   (H=header P=cel
4c70: 6c 2d 69 6e 64 65 78 20 31 3d 70 61 67 65 2d 31  l-index 1=page-1
4c80: 2d 68 65 61 64 65 72 20 2e 3d 66 72 65 65 2d 73  -header .=free-s
4c90: 70 61 63 65 29 5c 6e 22 29 3b 0a 20 20 20 20 66  pace)\n");.    f
4ca0: 6f 72 28 69 3d 30 3b 20 69 3c 67 2e 70 61 67 65  or(i=0; i<g.page
4cb0: 73 69 7a 65 3b 20 69 2b 3d 36 34 29 7b 0a 20 20  size; i+=64){.  
4cc0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 30 33      printf(" %03
4cd0: 78 3a 20 25 2e 36 34 73 5c 6e 22 2c 20 69 2c 20  x: %.64s\n", i, 
4ce0: 26 7a 4d 61 70 5b 69 5d 29 3b 0a 20 20 20 20 7d  &zMap[i]);.    }
4cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4d00: 65 28 7a 4d 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zMap);.  }.}..
4d10: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 66  /*.** Decode a f
4d20: 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
4d30: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
4d40: 69 64 20 64 65 63 6f 64 65 5f 74 72 75 6e 6b 5f  id decode_trunk_
4d50: 70 61 67 65 28 0a 20 20 69 6e 74 20 70 67 6e 6f  page(.  int pgno
4d60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4d70: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
4d80: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 74 61 69 6c   */.  int detail
4d90: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
4da0: 68 6f 77 20 6c 65 61 66 20 70 61 67 65 73 20 69  how leaf pages i
4db0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
4dc0: 72 65 63 75 72 73 69 76 65 20 20 20 20 20 20 20  recursive       
4dd0: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 20 74 68 65 20    /* Follow the 
4de0: 74 72 75 6e 6b 20 63 68 61 6e 67 65 20 69 66 20  trunk change if 
4df0: 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
4e00: 20 6e 2c 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65   n, i;.  unsigne
4e10: 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 77 68 69  d char *a;.  whi
4e20: 6c 65 28 20 70 67 6e 6f 3e 30 20 29 7b 0a 20 20  le( pgno>0 ){.  
4e30: 20 20 61 20 3d 20 66 69 6c 65 52 65 61 64 28 28    a = fileRead((
4e40: 70 67 6e 6f 2d 31 29 2a 67 2e 70 61 67 65 73 69  pgno-1)*g.pagesi
4e50: 7a 65 2c 20 67 2e 70 61 67 65 73 69 7a 65 29 3b  ze, g.pagesize);
4e60: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 44 65 63  .    printf("Dec
4e70: 6f 64 65 20 6f 66 20 66 72 65 65 6c 69 73 74 20  ode of freelist 
4e80: 74 72 75 6e 6b 20 70 61 67 65 20 25 64 3a 5c 6e  trunk page %d:\n
4e90: 22 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70 72  ", pgno);.    pr
4ea0: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
4eb0: 61 2c 20 30 2c 20 34 2c 20 22 4e 65 78 74 20 66  a, 0, 4, "Next f
4ec0: 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
4ed0: 67 65 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 5f  ge");.    print_
4ee0: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 34  decode_line(a, 4
4ef0: 2c 20 34 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  , 4, "Number of 
4f00: 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 69 73 20  entries on this 
4f10: 70 61 67 65 22 29 3b 0a 20 20 20 20 69 66 28 20  page");.    if( 
4f20: 64 65 74 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  detail ){.      
4f30: 6e 20 3d 20 28 69 6e 74 29 64 65 63 6f 64 65 49  n = (int)decodeI
4f40: 6e 74 33 32 28 26 61 5b 34 5d 29 3b 0a 20 20 20  nt32(&a[4]);.   
4f50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
4f60: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
4f70: 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 20 3d 20  nsigned int x = 
4f80: 64 65 63 6f 64 65 49 6e 74 33 32 28 26 61 5b 38  decodeInt32(&a[8
4f90: 2b 34 2a 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  +4*i]);.        
4fa0: 63 68 61 72 20 7a 49 64 78 5b 31 30 5d 3b 0a 20  char zIdx[10];. 
4fb0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
4fc0: 49 64 78 2c 20 22 5b 25 64 5d 22 2c 20 69 29 3b  Idx, "[%d]", i);
4fd0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
4fe0: 22 20 20 25 35 73 20 25 37 75 22 2c 20 7a 49 64  "  %5s %7u", zId
4ff0: 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 69  x, x);.        i
5000: 66 28 20 69 25 35 3d 3d 34 20 29 20 70 72 69 6e  f( i%5==4 ) prin
5010: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  tf("\n");.      
5020: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 25 35 21  }.      if( i%5!
5030: 3d 30 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  =0 ) printf("\n"
5040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5050: 20 21 72 65 63 75 72 73 69 76 65 20 29 7b 0a 20   !recursive ){. 
5060: 20 20 20 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20       pgno = 0;. 
5070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5080: 70 67 6e 6f 20 3d 20 28 69 6e 74 29 64 65 63 6f  pgno = (int)deco
5090: 64 65 49 6e 74 33 32 28 26 61 5b 30 5d 29 3b 0a  deInt32(&a[0]);.
50a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
50b0: 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 7d 0a 7d  3_free(a);.  }.}
50c0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 68 6f 72 74 20  ../*.** A short 
50d0: 74 65 78 74 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  text comment on 
50e0: 74 68 65 20 75 73 65 20 6f 66 20 65 61 63 68 20  the use of each 
50f0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
5100: 63 68 61 72 20 2a 2a 7a 50 61 67 65 55 73 65 3b  char **zPageUse;
5110: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 63 6f  ../*.** Add a co
5120: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 75 73 65  mment on the use
5130: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2f 0a 73   of a page..*/.s
5140: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
5150: 75 73 61 67 65 5f 6d 73 67 28 69 6e 74 20 70 67  usage_msg(int pg
5160: 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  no, const char *
5170: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5180: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
5190: 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20 20 76 61  har *zMsg;..  va
51a0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
51b0: 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71  at);.  zMsg = sq
51c0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
51d0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
51e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
51f0: 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f   pgno<=0 || pgno
5200: 3e 67 2e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  >g.mxPage ){.   
5210: 20 70 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20   printf("ERROR: 
5220: 70 61 67 65 20 25 64 20 6f 75 74 20 6f 66 20 72  page %d out of r
5230: 61 6e 67 65 20 31 2e 2e 25 64 3a 20 25 73 5c 6e  ange 1..%d: %s\n
5240: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
5250: 67 6e 6f 2c 20 67 2e 6d 78 50 61 67 65 2c 20 7a  gno, g.mxPage, z
5260: 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
5270: 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20  3_free(zMsg);.  
5280: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5290: 69 66 28 20 7a 50 61 67 65 55 73 65 5b 70 67 6e  if( zPageUse[pgn
52a0: 6f 5d 21 3d 30 20 29 7b 0a 20 20 20 20 70 72 69  o]!=0 ){.    pri
52b0: 6e 74 66 28 22 45 52 52 4f 52 3a 20 70 61 67 65  ntf("ERROR: page
52c0: 20 25 64 20 75 73 65 64 20 6d 75 6c 74 69 70 6c   %d used multipl
52d0: 65 20 74 69 6d 65 73 3a 5c 6e 22 2c 20 70 67 6e  e times:\n", pgn
52e0: 6f 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  o);.    printf("
52f0: 45 52 52 4f 52 3a 20 20 20 20 70 72 65 76 69 6f  ERROR:    previo
5300: 75 73 3a 20 25 73 5c 6e 22 2c 20 7a 50 61 67 65  us: %s\n", zPage
5310: 55 73 65 5b 70 67 6e 6f 5d 29 3b 0a 20 20 20 20  Use[pgno]);.    
5320: 70 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 20  printf("ERROR:  
5330: 20 20 63 75 72 72 65 6e 74 3a 20 20 25 73 5c 6e    current:  %s\n
5340: 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71  ", zMsg);.    sq
5350: 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 67 65  lite3_free(zPage
5360: 55 73 65 5b 70 67 6e 6f 5d 29 3b 0a 20 20 7d 0a  Use[pgno]);.  }.
5370: 20 20 7a 50 61 67 65 55 73 65 5b 70 67 6e 6f 5d    zPageUse[pgno]
5380: 20 3d 20 7a 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a   = zMsg;.}../*.*
5390: 2a 20 46 69 6e 64 20 6f 76 65 72 66 6c 6f 77 20  * Find overflow 
53a0: 70 61 67 65 73 20 6f 66 20 61 20 63 65 6c 6c 20  pages of a cell 
53b0: 61 6e 64 20 64 65 73 63 72 69 62 65 20 74 68 65  and describe the
53c0: 69 72 20 75 73 61 67 65 2e 0a 2a 2f 0a 73 74 61  ir usage..*/.sta
53d0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 75 73  tic void page_us
53e0: 61 67 65 5f 63 65 6c 6c 28 0a 20 20 75 6e 73 69  age_cell(.  unsi
53f0: 67 6e 65 64 20 63 68 61 72 20 63 54 79 70 65 2c  gned char cType,
5400: 20 20 20 20 2f 2a 20 50 61 67 65 20 74 79 70 65      /* Page type
5410: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
5420: 68 61 72 20 2a 61 2c 20 20 20 20 20 20 20 2f 2a  har *a,       /*
5430: 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   Cell content */
5440: 0a 20 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20  .  int pgno,    
5450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61             /* pa
5460: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
5470: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
5480: 63 65 6c 6c 6e 6f 20 20 20 20 20 20 20 20 20 20  cellno          
5490: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
54a0: 74 68 65 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  the cell on the 
54b0: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
54c0: 20 69 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b   i;.  int n = 0;
54d0: 0a 20 20 69 36 34 20 6e 50 61 79 6c 6f 61 64 3b  .  i64 nPayload;
54e0: 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 20 20  .  i64 rowid;.  
54f0: 69 36 34 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69 20  i64 nLocal;.  i 
5500: 3d 20 30 3b 0a 20 20 69 66 28 20 63 54 79 70 65  = 0;.  if( cType
5510: 3c 3d 35 20 29 7b 0a 20 20 20 20 61 20 2b 3d 20  <=5 ){.    a += 
5520: 34 3b 0a 20 20 20 20 6e 20 2b 3d 20 34 3b 0a 20  4;.    n += 4;. 
5530: 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65 21 3d   }.  if( cType!=
5540: 35 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65 63  5 ){.    i = dec
5550: 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26 6e 50  odeVarint(a, &nP
5560: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 61 20 2b  ayload);.    a +
5570: 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20 69 3b  = i;.    n += i;
5580: 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6c 6f  .    nLocal = lo
5590: 63 61 6c 50 61 79 6c 6f 61 64 28 6e 50 61 79 6c  calPayload(nPayl
55a0: 6f 61 64 2c 20 63 54 79 70 65 29 3b 0a 20 20 7d  oad, cType);.  }
55b0: 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  else{.    nPaylo
55c0: 61 64 20 3d 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b  ad = nLocal = 0;
55d0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65  .  }.  if( cType
55e0: 3d 3d 35 20 7c 7c 20 63 54 79 70 65 3d 3d 31 33  ==5 || cType==13
55f0: 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65 63 6f   ){.    i = deco
5600: 64 65 56 61 72 69 6e 74 28 61 2c 20 26 72 6f 77  deVarint(a, &row
5610: 69 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b  id);.    a += i;
5620: 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 7d  .    n += i;.  }
5630: 0a 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50  .  if( nLocal<nP
5640: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  ayload ){.    in
5650: 74 20 6f 76 66 6c 20 3d 20 64 65 63 6f 64 65 49  t ovfl = decodeI
5660: 6e 74 33 32 28 61 2b 6e 4c 6f 63 61 6c 29 3b 0a  nt32(a+nLocal);.
5670: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
5680: 0a 20 20 20 20 77 68 69 6c 65 28 20 6f 76 66 6c  .    while( ovfl
5690: 20 26 26 20 28 63 6e 74 2b 2b 29 3c 67 2e 6d 78   && (cnt++)<g.mx
56a0: 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 70 61  Page ){.      pa
56b0: 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 6f 76 66  ge_usage_msg(ovf
56c0: 6c 2c 20 22 6f 76 65 72 66 6c 6f 77 20 25 64 20  l, "overflow %d 
56d0: 66 72 6f 6d 20 63 65 6c 6c 20 25 64 20 6f 66 20  from cell %d of 
56e0: 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20  page %d",.      
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
5700: 6e 74 2c 20 63 65 6c 6c 6e 6f 2c 20 70 67 6e 6f  nt, cellno, pgno
5710: 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 66 69 6c  );.      a = fil
5720: 65 52 65 61 64 28 28 6f 76 66 6c 2d 31 29 2a 67  eRead((ovfl-1)*g
5730: 2e 70 61 67 65 73 69 7a 65 2c 20 34 29 3b 0a 20  .pagesize, 4);. 
5740: 20 20 20 20 20 6f 76 66 6c 20 3d 20 64 65 63 6f       ovfl = deco
5750: 64 65 49 6e 74 33 32 28 61 29 3b 0a 20 20 20 20  deInt32(a);.    
5760: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
5770: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
5780: 0a 2f 2a 0a 2a 2a 20 44 65 73 63 72 69 62 65 20  ./*.** Describe 
5790: 74 68 65 20 75 73 61 67 65 73 20 6f 66 20 61 20  the usages of a 
57a0: 62 2d 74 72 65 65 20 70 61 67 65 0a 2a 2f 0a 73  b-tree page.*/.s
57b0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
57c0: 75 73 61 67 65 5f 62 74 72 65 65 28 0a 20 20 69  usage_btree(.  i
57d0: 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  nt pgno,        
57e0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
57f0: 64 65 73 63 72 69 62 65 20 2a 2f 0a 20 20 69 6e  describe */.  in
5800: 74 20 70 61 72 65 6e 74 2c 20 20 20 20 20 20 20  t parent,       
5810: 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66      /* Parent of
5820: 20 74 68 69 73 20 70 61 67 65 2e 20 20 30 20 66   this page.  0 f
5830: 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f  or root pages */
5840: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
5850: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
5860: 68 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  h child of the p
5870: 61 72 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  arent */.  const
5880: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
5890: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
58a0: 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  table */.){.  un
58b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a  signed char *a;.
58c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
58d0: 79 70 65 20 3d 20 22 63 6f 72 72 75 70 74 20 6e  ype = "corrupt n
58e0: 6f 64 65 22 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  ode";.  int nCel
58f0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  l;.  int i;.  in
5900: 74 20 68 64 72 20 3d 20 70 67 6e 6f 3d 3d 31 20  t hdr = pgno==1 
5910: 3f 20 31 30 30 20 3a 20 30 3b 0a 0a 20 20 69 66  ? 100 : 0;..  if
5920: 28 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20 70 67 6e  ( pgno<=0 || pgn
5930: 6f 3e 67 2e 6d 78 50 61 67 65 20 29 20 72 65 74  o>g.mxPage ) ret
5940: 75 72 6e 3b 0a 20 20 61 20 3d 20 66 69 6c 65 52  urn;.  a = fileR
5950: 65 61 64 28 28 70 67 6e 6f 2d 31 29 2a 67 2e 70  ead((pgno-1)*g.p
5960: 61 67 65 73 69 7a 65 2c 20 67 2e 70 61 67 65 73  agesize, g.pages
5970: 69 7a 65 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ize);.  switch( 
5980: 61 5b 68 64 72 5d 20 29 7b 0a 20 20 20 20 63 61  a[hdr] ){.    ca
5990: 73 65 20 32 3a 20 20 7a 54 79 70 65 20 3d 20 22  se 2:  zType = "
59a0: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 6f 66  interior node of
59b0: 20 69 6e 64 65 78 22 3b 20 20 62 72 65 61 6b 3b   index";  break;
59c0: 0a 20 20 20 20 63 61 73 65 20 35 3a 20 20 7a 54  .    case 5:  zT
59d0: 79 70 65 20 3d 20 22 69 6e 74 65 72 69 6f 72 20  ype = "interior 
59e0: 6e 6f 64 65 20 6f 66 20 74 61 62 6c 65 22 3b 20  node of table"; 
59f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5a00: 20 31 30 3a 20 7a 54 79 70 65 20 3d 20 22 6c 65   10: zType = "le
5a10: 61 66 20 6f 66 20 69 6e 64 65 78 22 3b 20 20 20  af of index";   
5a20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5a30: 20 20 20 63 61 73 65 20 31 33 3a 20 7a 54 79 70     case 13: zTyp
5a40: 65 20 3d 20 22 6c 65 61 66 20 6f 66 20 74 61 62  e = "leaf of tab
5a50: 6c 65 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  le";           b
5a60: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
5a70: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 70 61  parent ){.    pa
5a80: 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70 67 6e  ge_usage_msg(pgn
5a90: 6f 2c 20 22 25 73 20 5b 25 73 5d 2c 20 63 68 69  o, "%s [%s], chi
5aa0: 6c 64 20 25 64 20 6f 66 20 70 61 67 65 20 25 64  ld %d of page %d
5ab0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
5ac0: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 7a 4e 61        zType, zNa
5ad0: 6d 65 2c 20 69 64 78 2c 20 70 61 72 65 6e 74 29  me, idx, parent)
5ae0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5af0: 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70 67  age_usage_msg(pg
5b00: 6e 6f 2c 20 22 72 6f 6f 74 20 25 73 20 5b 25 73  no, "root %s [%s
5b10: 5d 22 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65  ]", zType, zName
5b20: 29 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  );.  }.  nCell =
5b30: 20 61 5b 68 64 72 2b 33 5d 2a 32 35 36 20 2b 20   a[hdr+3]*256 + 
5b40: 61 5b 68 64 72 2b 34 5d 3b 0a 20 20 69 66 28 20  a[hdr+4];.  if( 
5b50: 61 5b 68 64 72 5d 3d 3d 32 20 7c 7c 20 61 5b 68  a[hdr]==2 || a[h
5b60: 64 72 5d 3d 3d 35 20 29 7b 0a 20 20 20 20 69 6e  dr]==5 ){.    in
5b70: 74 20 63 65 6c 6c 73 74 61 72 74 20 3d 20 68 64  t cellstart = hd
5b80: 72 2b 31 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e  r+12;.    unsign
5b90: 65 64 20 69 6e 74 20 63 68 69 6c 64 3b 0a 20 20  ed int child;.  
5ba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
5bb0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
5bc0: 69 6e 74 20 6f 66 73 74 3b 0a 0a 20 20 20 20 20  int ofst;..     
5bd0: 20 6f 66 73 74 20 3d 20 63 65 6c 6c 73 74 61 72   ofst = cellstar
5be0: 74 20 2b 20 69 2a 32 3b 0a 20 20 20 20 20 20 6f  t + i*2;.      o
5bf0: 66 73 74 20 3d 20 61 5b 6f 66 73 74 5d 2a 32 35  fst = a[ofst]*25
5c00: 36 20 2b 20 61 5b 6f 66 73 74 2b 31 5d 3b 0a 20  6 + a[ofst+1];. 
5c10: 20 20 20 20 20 63 68 69 6c 64 20 3d 20 64 65 63       child = dec
5c20: 6f 64 65 49 6e 74 33 32 28 61 2b 6f 66 73 74 29  odeInt32(a+ofst)
5c30: 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 75 73 61  ;.      page_usa
5c40: 67 65 5f 62 74 72 65 65 28 63 68 69 6c 64 2c 20  ge_btree(child, 
5c50: 70 67 6e 6f 2c 20 69 2c 20 7a 4e 61 6d 65 29 3b  pgno, i, zName);
5c60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 68 69 6c 64  .    }.    child
5c70: 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28 61   = decodeInt32(a
5c80: 2b 63 65 6c 6c 73 74 61 72 74 2d 34 29 3b 0a 20  +cellstart-4);. 
5c90: 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 62 74     page_usage_bt
5ca0: 72 65 65 28 63 68 69 6c 64 2c 20 70 67 6e 6f 2c  ree(child, pgno,
5cb0: 20 69 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a   i, zName);.  }.
5cc0: 20 20 69 66 28 20 61 5b 68 64 72 5d 3d 3d 32 20    if( a[hdr]==2 
5cd0: 7c 7c 20 61 5b 68 64 72 5d 3d 3d 31 30 20 7c 7c  || a[hdr]==10 ||
5ce0: 20 61 5b 68 64 72 5d 3d 3d 31 33 20 29 7b 0a 20   a[hdr]==13 ){. 
5cf0: 20 20 20 69 6e 74 20 63 65 6c 6c 73 74 61 72 74     int cellstart
5d00: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
5d10: 61 5b 68 64 72 5d 3c 3d 35 29 3b 0a 20 20 20 20  a[hdr]<=5);.    
5d20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
5d30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
5d40: 74 20 6f 66 73 74 3b 0a 20 20 20 20 20 20 6f 66  t ofst;.      of
5d50: 73 74 20 3d 20 63 65 6c 6c 73 74 61 72 74 20 2b  st = cellstart +
5d60: 20 69 2a 32 3b 0a 20 20 20 20 20 20 6f 66 73 74   i*2;.      ofst
5d70: 20 3d 20 61 5b 6f 66 73 74 5d 2a 32 35 36 20 2b   = a[ofst]*256 +
5d80: 20 61 5b 6f 66 73 74 2b 31 5d 3b 0a 20 20 20 20   a[ofst+1];.    
5d90: 20 20 70 61 67 65 5f 75 73 61 67 65 5f 63 65 6c    page_usage_cel
5da0: 6c 28 61 5b 68 64 72 5d 2c 20 61 2b 6f 66 73 74  l(a[hdr], a+ofst
5db0: 2c 20 70 67 6e 6f 2c 20 69 29 3b 0a 20 20 20 20  , pgno, i);.    
5dc0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
5dd0: 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(a);.}../*.*
5de0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 70 61 67 65  * Determine page
5df0: 20 75 73 61 67 65 20 62 79 20 74 68 65 20 66 72   usage by the fr
5e00: 65 65 6c 69 73 74 0a 2a 2f 0a 73 74 61 74 69 63  eelist.*/.static
5e10: 20 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67 65   void page_usage
5e20: 5f 66 72 65 65 6c 69 73 74 28 69 6e 74 20 70 67  _freelist(int pg
5e30: 6e 6f 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  no){.  unsigned 
5e40: 63 68 61 72 20 2a 61 3b 0a 20 20 69 6e 74 20 63  char *a;.  int c
5e50: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  nt = 0;.  int i;
5e60: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
5e70: 69 4e 65 78 74 3b 0a 20 20 69 6e 74 20 70 61 72  iNext;.  int par
5e80: 65 6e 74 20 3d 20 31 3b 0a 0a 20 20 77 68 69 6c  ent = 1;..  whil
5e90: 65 28 20 70 67 6e 6f 3e 30 20 26 26 20 70 67 6e  e( pgno>0 && pgn
5ea0: 6f 3c 3d 67 2e 6d 78 50 61 67 65 20 26 26 20 28  o<=g.mxPage && (
5eb0: 63 6e 74 2b 2b 29 3c 67 2e 6d 78 50 61 67 65 20  cnt++)<g.mxPage 
5ec0: 29 7b 0a 20 20 20 20 70 61 67 65 5f 75 73 61 67  ){.    page_usag
5ed0: 65 5f 6d 73 67 28 70 67 6e 6f 2c 20 22 66 72 65  e_msg(pgno, "fre
5ee0: 65 6c 69 73 74 20 74 72 75 6e 6b 20 23 25 64 20  elist trunk #%d 
5ef0: 63 68 69 6c 64 20 6f 66 20 25 64 22 2c 20 63 6e  child of %d", cn
5f00: 74 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  t, parent);.    
5f10: 61 20 3d 20 66 69 6c 65 52 65 61 64 28 28 70 67  a = fileRead((pg
5f20: 6e 6f 2d 31 29 2a 67 2e 70 61 67 65 73 69 7a 65  no-1)*g.pagesize
5f30: 2c 20 67 2e 70 61 67 65 73 69 7a 65 29 3b 0a 20  , g.pagesize);. 
5f40: 20 20 20 69 4e 65 78 74 20 3d 20 64 65 63 6f 64     iNext = decod
5f50: 65 49 6e 74 33 32 28 61 29 3b 0a 20 20 20 20 6e  eInt32(a);.    n
5f60: 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28 61   = decodeInt32(a
5f70: 2b 34 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  +4);.    for(i=0
5f80: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
5f90: 20 20 20 69 6e 74 20 63 68 69 6c 64 20 3d 20 64     int child = d
5fa0: 65 63 6f 64 65 49 6e 74 33 32 28 61 20 2b 20 28  ecodeInt32(a + (
5fb0: 69 2a 34 2b 38 29 29 3b 0a 20 20 20 20 20 20 70  i*4+8));.      p
5fc0: 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 63 68  age_usage_msg(ch
5fd0: 69 6c 64 2c 20 22 66 72 65 65 6c 69 73 74 20 6c  ild, "freelist l
5fe0: 65 61 66 2c 20 63 68 69 6c 64 20 25 64 20 6f 66  eaf, child %d of
5ff0: 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 22 2c   trunk page %d",
6000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6010: 20 20 20 20 20 20 69 2c 20 70 67 6e 6f 29 3b 0a        i, pgno);.
6020: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6030: 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20 70  3_free(a);.    p
6040: 61 72 65 6e 74 20 3d 20 70 67 6e 6f 3b 0a 20 20  arent = pgno;.  
6050: 20 20 70 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a    pgno = iNext;.
6060: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
6070: 65 72 6d 69 6e 65 20 70 61 67 65 73 20 75 73 65  ermine pages use
6080: 64 20 61 73 20 50 54 52 4d 41 50 20 70 61 67 65  d as PTRMAP page
6090: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
60a0: 20 70 61 67 65 5f 75 73 61 67 65 5f 70 74 72 6d   page_usage_ptrm
60b0: 61 70 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ap(unsigned char
60c0: 20 2a 61 29 7b 0a 20 20 69 66 28 20 61 5b 35 35   *a){.  if( a[55
60d0: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 73 61  ] ){.    int usa
60e0: 62 6c 65 20 3d 20 67 2e 70 61 67 65 73 69 7a 65  ble = g.pagesize
60f0: 20 2d 20 61 5b 32 30 5d 3b 0a 20 20 20 20 69 6e   - a[20];.    in
6100: 74 20 70 67 6e 6f 20 3d 20 32 3b 0a 20 20 20 20  t pgno = 2;.    
6110: 69 6e 74 20 70 65 72 50 61 67 65 20 3d 20 75 73  int perPage = us
6120: 61 62 6c 65 2f 35 3b 0a 20 20 20 20 77 68 69 6c  able/5;.    whil
6130: 65 28 20 70 67 6e 6f 3c 3d 67 2e 6d 78 50 61 67  e( pgno<=g.mxPag
6140: 65 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  e ){.      page_
6150: 75 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f 2c 20  usage_msg(pgno, 
6160: 22 50 54 52 4d 41 50 20 70 61 67 65 20 63 6f 76  "PTRMAP page cov
6170: 65 72 69 6e 67 20 25 64 2e 2e 25 64 22 2c 0a 20  ering %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 70 67 6e 6f 2b 31            pgno+1
61a0: 2c 20 70 67 6e 6f 2b 70 65 72 50 61 67 65 29 3b  , pgno+perPage);
61b0: 0a 20 20 20 20 20 20 70 67 6e 6f 20 2b 3d 20 70  .      pgno += p
61c0: 65 72 50 61 67 65 20 2b 20 31 3b 0a 20 20 20 20  erPage + 1;.    
61d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
61e0: 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ry to figure out
61f0: 20 68 6f 77 20 65 76 65 72 79 20 70 61 67 65 20   how every page 
6200: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
6210: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 75 73  file is being us
6220: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
6230: 69 64 20 70 61 67 65 5f 75 73 61 67 65 5f 72 65  id page_usage_re
6240: 70 6f 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20  port(const char 
6250: 2a 7a 50 72 67 2c 20 63 6f 6e 73 74 20 63 68 61  *zPrg, const cha
6260: 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
6270: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 72  nt i, j;.  int r
6280: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
6290: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
62a0: 20 2a 70 53 74 6d 74 3b 0a 20 20 75 6e 73 69 67   *pStmt;.  unsig
62b0: 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 63  ned char *a;.  c
62c0: 68 61 72 20 7a 51 75 65 72 79 5b 32 30 30 5d 3b  har zQuery[200];
62d0: 0a 0a 20 20 2f 2a 20 41 76 6f 69 64 20 74 68 65  ..  /* Avoid the
62e0: 20 70 61 74 68 6f 6c 6f 67 69 63 61 6c 20 63 61   pathological ca
62f0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 67 2e 6d 78  se */.  if( g.mx
6300: 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 70 72  Page<1 ){.    pr
6310: 69 6e 74 66 28 22 65 6d 70 74 79 20 64 61 74 61  intf("empty data
6320: 62 61 73 65 5c 6e 22 29 3b 0a 20 20 20 20 72 65  base\n");.    re
6330: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
6340: 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
6350: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 64 62 20 3d  e file */.  db =
6360: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 50   openDatabase(zP
6370: 72 67 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 0a 20  rg, zDbName);.. 
6380: 20 2f 2a 20 53 65 74 20 75 70 20 67 6c 6f 62 61   /* Set up globa
6390: 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 50 61 67  l variables zPag
63a0: 65 55 73 65 5b 5d 20 61 6e 64 20 67 2e 6d 78 50  eUse[] and g.mxP
63b0: 61 67 65 20 74 6f 20 72 65 63 6f 72 64 20 70 61  age to record pa
63c0: 67 65 0a 20 20 2a 2a 20 75 73 61 67 65 73 20 2a  ge.  ** usages *
63d0: 2f 0a 20 20 7a 50 61 67 65 55 73 65 20 3d 20 73  /.  zPageUse = s
63e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
63f0: 69 7a 65 6f 66 28 7a 50 61 67 65 55 73 65 5b 30  izeof(zPageUse[0
6400: 5d 29 2a 28 67 2e 6d 78 50 61 67 65 2b 31 29 20  ])*(g.mxPage+1) 
6410: 29 3b 0a 20 20 69 66 28 20 7a 50 61 67 65 55 73  );.  if( zPageUs
6420: 65 3d 3d 30 20 29 20 6f 75 74 5f 6f 66 5f 6d 65  e==0 ) out_of_me
6430: 6d 6f 72 79 28 29 3b 0a 20 20 6d 65 6d 73 65 74  mory();.  memset
6440: 28 7a 50 61 67 65 55 73 65 2c 20 30 2c 20 73 69  (zPageUse, 0, si
6450: 7a 65 6f 66 28 7a 50 61 67 65 55 73 65 5b 30 5d  zeof(zPageUse[0]
6460: 29 2a 28 67 2e 6d 78 50 61 67 65 2b 31 29 29 3b  )*(g.mxPage+1));
6470: 0a 0a 20 20 2f 2a 20 44 69 73 63 6f 76 65 72 20  ..  /* Discover 
6480: 74 68 65 20 75 73 61 67 65 20 6f 66 20 65 61 63  the usage of eac
6490: 68 20 70 61 67 65 20 2a 2f 0a 20 20 61 20 3d 20  h page */.  a = 
64a0: 66 69 6c 65 52 65 61 64 28 30 2c 20 31 30 30 29  fileRead(0, 100)
64b0: 3b 0a 20 20 70 61 67 65 5f 75 73 61 67 65 5f 66  ;.  page_usage_f
64c0: 72 65 65 6c 69 73 74 28 64 65 63 6f 64 65 49 6e  reelist(decodeIn
64d0: 74 33 32 28 61 2b 33 32 29 29 3b 0a 20 20 70 61  t32(a+32));.  pa
64e0: 67 65 5f 75 73 61 67 65 5f 70 74 72 6d 61 70 28  ge_usage_ptrmap(
64f0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  a);.  sqlite3_fr
6500: 65 65 28 61 29 3b 0a 20 20 70 61 67 65 5f 75 73  ee(a);.  page_us
6510: 61 67 65 5f 62 74 72 65 65 28 31 2c 20 30 2c 20  age_btree(1, 0, 
6520: 30 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  0, "sqlite_maste
6530: 72 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  r");.  sqlite3_e
6540: 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41 20  xec(db, "PRAGMA 
6550: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
6560: 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ON", 0, 0, 0);. 
6570: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 3b 20 6a   for(j=0; j<2; j
6580: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
6590: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
65a0: 28 7a 51 75 65 72 79 29 2c 20 7a 51 75 65 72 79  (zQuery), zQuery
65b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
65c0: 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d  SELECT type, nam
65d0: 65 2c 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  e, rootpage FROM
65e0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 57   SQLITE_MASTER W
65f0: 48 45 52 45 20 72 6f 6f 74 70 61 67 65 22 0a 20  HERE rootpage". 
6600: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
6610: 44 45 52 20 42 59 20 72 6f 77 69 64 20 25 73 22  DER BY rowid %s"
6620: 2c 20 6a 3f 22 44 45 53 43 22 3a 22 22 29 3b 0a  , j?"DESC":"");.
6630: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6640: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
6650: 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 53 74  zQuery, -1, &pSt
6660: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
6670: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6680: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
6690: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
66a0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
66b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70 67 6e  .        int pgn
66c0: 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  o = sqlite3_colu
66d0: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29  mn_int(pStmt, 2)
66e0: 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 75  ;.        page_u
66f0: 73 61 67 65 5f 62 74 72 65 65 28 70 67 6e 6f 2c  sage_btree(pgno,
6700: 20 30 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63 68   0, 0, (const ch
6710: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
6720: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31 29  mn_text(pStmt,1)
6730: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 69 6e  else{.      prin
6750: 74 66 28 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f  tf("ERROR: canno
6760: 74 20 71 75 65 72 79 20 64 61 74 61 62 61 73 65  t query database
6770: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
6780: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
6790: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
67a0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
67b0: 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tmt);.    if( rc
67c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  ==SQLITE_OK ) br
67d0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  eak;.  }.  sqlit
67e0: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 0a 20  e3_close(db);.. 
67f0: 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 72 65   /* Print the re
6800: 70 6f 72 74 20 61 6e 64 20 66 72 65 65 20 6d 65  port and free me
6810: 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 66  mory used */.  f
6820: 6f 72 28 69 3d 31 3b 20 69 3c 3d 67 2e 6d 78 50  or(i=1; i<=g.mxP
6830: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  age; i++){.    p
6840: 72 69 6e 74 66 28 22 25 35 64 3a 20 25 73 5c 6e  rintf("%5d: %s\n
6850: 22 2c 20 69 2c 20 7a 50 61 67 65 55 73 65 5b 69  ", i, zPageUse[i
6860: 5d 20 3f 20 7a 50 61 67 65 55 73 65 5b 69 5d 20  ] ? zPageUse[i] 
6870: 3a 20 22 3f 3f 3f 22 29 3b 0a 20 20 20 20 73 71  : "???");.    sq
6880: 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 67 65  lite3_free(zPage
6890: 55 73 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  Use[i]);.  }.  s
68a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 67  qlite3_free(zPag
68b0: 65 55 73 65 29 3b 0a 20 20 7a 50 61 67 65 55 73  eUse);.  zPageUs
68c0: 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
68d0: 54 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75  Try to figure ou
68e0: 74 20 68 6f 77 20 65 76 65 72 79 20 70 61 67 65  t how every page
68f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
6900: 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 75   file is being u
6910: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
6920: 6f 69 64 20 70 74 72 6d 61 70 5f 63 6f 76 65 72  oid ptrmap_cover
6930: 61 67 65 5f 72 65 70 6f 72 74 28 63 6f 6e 73 74  age_report(const
6940: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
6950: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 75  .  int pgno;.  u
6960: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 48  nsigned char *aH
6970: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
6980: 68 61 72 20 2a 61 3b 0a 20 20 69 6e 74 20 75 73  har *a;.  int us
6990: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 70 65 72 50  able;.  int perP
69a0: 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  age;.  int i;.. 
69b0: 20 2f 2a 20 41 76 6f 69 64 20 74 68 65 20 70 61   /* Avoid the pa
69c0: 74 68 6f 6c 6f 67 69 63 61 6c 20 63 61 73 65 20  thological case 
69d0: 2a 2f 0a 20 20 69 66 28 20 67 2e 6d 78 50 61 67  */.  if( g.mxPag
69e0: 65 3c 31 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  e<1 ){.    print
69f0: 66 28 22 65 6d 70 74 79 20 64 61 74 61 62 61 73  f("empty databas
6a00: 65 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  e\n");.    retur
6a10: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
6a20: 65 20 73 75 72 65 20 50 54 52 4d 41 50 73 20 61  e sure PTRMAPs a
6a30: 72 65 20 75 73 65 64 20 69 6e 20 74 68 69 73 20  re used in this 
6a40: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 48  database */.  aH
6a50: 64 72 20 3d 20 66 69 6c 65 52 65 61 64 28 30 2c  dr = fileRead(0,
6a60: 20 31 30 30 29 3b 0a 20 20 69 66 28 20 61 48 64   100);.  if( aHd
6a70: 72 5b 35 35 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  r[55]==0 ){.    
6a80: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
6a90: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 50 54   does not use PT
6aa0: 52 4d 41 50 20 70 61 67 65 73 5c 6e 22 29 3b 0a  RMAP pages\n");.
6ab0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6ac0: 20 20 75 73 61 62 6c 65 20 3d 20 67 2e 70 61 67    usable = g.pag
6ad0: 65 73 69 7a 65 20 2d 20 61 48 64 72 5b 32 30 5d  esize - aHdr[20]
6ae0: 3b 0a 20 20 70 65 72 50 61 67 65 20 3d 20 75 73  ;.  perPage = us
6af0: 61 62 6c 65 2f 35 3b 0a 20 20 73 71 6c 69 74 65  able/5;.  sqlite
6b00: 33 5f 66 72 65 65 28 61 48 64 72 29 3b 0a 20 20  3_free(aHdr);.  
6b10: 70 72 69 6e 74 66 28 22 25 35 64 3a 20 72 6f 6f  printf("%5d: roo
6b20: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 61 73 74  t of sqlite_mast
6b30: 65 72 5c 6e 22 2c 20 31 29 3b 0a 20 20 66 6f 72  er\n", 1);.  for
6b40: 28 70 67 6e 6f 3d 32 3b 20 70 67 6e 6f 3c 3d 67  (pgno=2; pgno<=g
6b50: 2e 6d 78 50 61 67 65 3b 20 70 67 6e 6f 20 2b 3d  .mxPage; pgno +=
6b60: 20 70 65 72 50 61 67 65 2b 31 29 7b 0a 20 20 20   perPage+1){.   
6b70: 20 70 72 69 6e 74 66 28 22 25 35 64 3a 20 50 54   printf("%5d: PT
6b80: 52 4d 41 50 20 70 61 67 65 20 63 6f 76 65 72 69  RMAP page coveri
6b90: 6e 67 20 25 64 2e 2e 25 64 5c 6e 22 2c 20 70 67  ng %d..%d\n", pg
6ba0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  no,.           p
6bb0: 67 6e 6f 2b 31 2c 20 70 67 6e 6f 2b 70 65 72 50  gno+1, pgno+perP
6bc0: 61 67 65 29 3b 0a 20 20 20 20 61 20 3d 20 66 69  age);.    a = fi
6bd0: 6c 65 52 65 61 64 28 28 70 67 6e 6f 2d 31 29 2a  leRead((pgno-1)*
6be0: 67 2e 70 61 67 65 73 69 7a 65 2c 20 75 73 61 62  g.pagesize, usab
6bf0: 6c 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  le);.    for(i=0
6c00: 3b 20 69 2b 35 3c 3d 75 73 61 62 6c 65 20 26 26  ; i+5<=usable &&
6c10: 20 70 67 6e 6f 2b 31 2b 69 2f 35 3c 3d 67 2e 6d   pgno+1+i/5<=g.m
6c20: 78 50 61 67 65 3b 20 69 2b 3d 35 29 7b 0a 20 20  xPage; i+=5){.  
6c30: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6c40: 7a 54 79 70 65 20 3d 20 22 3f 3f 3f 22 3b 0a 20  zType = "???";. 
6c50: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
6c60: 74 20 69 46 72 6f 6d 20 3d 20 64 65 63 6f 64 65  t iFrom = decode
6c70: 49 6e 74 33 32 28 26 61 5b 69 2b 31 5d 29 3b 0a  Int32(&a[i+1]);.
6c80: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 61 5b        switch( a[
6c90: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  i] ){.        ca
6ca0: 73 65 20 31 3a 20 20 7a 54 79 70 65 20 3d 20 22  se 1:  zType = "
6cb0: 62 2d 74 72 65 65 20 72 6f 6f 74 20 70 61 67 65  b-tree root page
6cc0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
6cd0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a  .        case 2:
6ce0: 20 20 7a 54 79 70 65 20 3d 20 22 66 72 65 65 6c    zType = "freel
6cf0: 69 73 74 20 70 61 67 65 22 3b 20 20 20 20 20 20  ist page";      
6d00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d10: 20 20 20 20 63 61 73 65 20 33 3a 20 20 7a 54 79      case 3:  zTy
6d20: 70 65 20 3d 20 22 66 69 72 73 74 20 70 61 67 65  pe = "first page
6d30: 20 6f 66 20 6f 76 65 72 66 6c 6f 77 22 3b 20 20   of overflow";  
6d40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
6d50: 61 73 65 20 34 3a 20 20 7a 54 79 70 65 20 3d 20  ase 4:  zType = 
6d60: 22 6c 61 74 65 72 20 70 61 67 65 20 6f 66 20 6f  "later page of o
6d70: 76 65 72 66 6c 6f 77 22 3b 20 20 62 72 65 61 6b  verflow";  break
6d80: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 35  ;.        case 5
6d90: 3a 20 20 7a 54 79 70 65 20 3d 20 22 62 2d 74 72  :  zType = "b-tr
6da0: 65 65 20 6e 6f 6e 2d 72 6f 6f 74 20 70 61 67 65  ee non-root page
6db0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
6dc0: 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
6dd0: 66 28 22 25 35 64 3a 20 25 73 2c 20 70 61 72 65  f("%5d: %s, pare
6de0: 6e 74 3d 25 75 5c 6e 22 2c 20 70 67 6e 6f 2b 31  nt=%u\n", pgno+1
6df0: 2b 69 2f 35 2c 20 7a 54 79 70 65 2c 20 69 46 72  +i/5, zType, iFr
6e00: 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  om);.    }.    s
6e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
6e20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69    }.}../*.** Pri
6e30: 6e 74 20 61 20 75 73 61 67 65 20 63 6f 6d 6d 65  nt a usage comme
6e40: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
6e50: 64 20 75 73 61 67 65 28 63 6f 6e 73 74 20 63 68  d usage(const ch
6e60: 61 72 20 2a 61 72 67 76 30 29 7b 0a 20 20 66 70  ar *argv0){.  fp
6e70: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
6e80: 73 61 67 65 20 25 73 20 3f 2d 2d 75 72 69 3f 20  sage %s ?--uri? 
6e90: 46 49 4c 45 4e 41 4d 45 20 3f 61 72 67 73 2e 2e  FILENAME ?args..
6ea0: 2e 3f 5c 6e 5c 6e 22 2c 20 61 72 67 76 30 29 3b  .?\n\n", argv0);
6eb0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
6ec0: 72 2c 0a 20 20 20 20 22 73 77 69 74 63 68 65 73  r,.    "switches
6ed0: 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 2d 2d  :\n".    "    --
6ee0: 72 61 77 20 20 20 20 20 20 20 20 20 20 20 52 65  raw           Re
6ef0: 61 64 20 64 62 20 66 69 6c 65 20 64 69 72 65 63  ad db file direc
6f00: 74 6c 79 2c 20 62 79 70 61 73 73 69 6e 67 20 53  tly, bypassing S
6f10: 51 4c 69 74 65 20 56 46 53 5c 6e 22 0a 20 20 20  QLite VFS\n".   
6f20: 20 22 61 72 67 73 3a 5c 6e 22 0a 20 20 20 20 22   "args:\n".    "
6f30: 20 20 20 20 64 62 68 65 61 64 65 72 20 20 20 20      dbheader    
6f40: 20 20 20 20 53 68 6f 77 20 64 61 74 61 62 61 73      Show databas
6f50: 65 20 68 65 61 64 65 72 5c 6e 22 0a 20 20 20 20  e header\n".    
6f60: 22 20 20 20 20 70 67 69 64 78 20 20 20 20 20 20  "    pgidx      
6f70: 20 20 20 20 20 49 6e 64 65 78 20 6f 66 20 68 6f       Index of ho
6f80: 77 20 65 61 63 68 20 70 61 67 65 20 69 73 20 75  w each page is u
6f90: 73 65 64 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  sed\n".    "    
6fa0: 70 74 72 6d 61 70 20 20 20 20 20 20 20 20 20 20  ptrmap          
6fb0: 53 68 6f 77 20 61 6c 6c 20 50 54 52 4d 41 50 20  Show all PTRMAP 
6fc0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a  page content\n".
6fd0: 20 20 20 20 22 20 20 20 20 4e 4e 4e 2e 2e 4d 4d      "    NNN..MM
6fe0: 4d 20 20 20 20 20 20 20 20 53 68 6f 77 20 68 65  M        Show he
6ff0: 78 20 6f 66 20 70 61 67 65 73 20 4e 4e 4e 20 74  x of pages NNN t
7000: 68 72 6f 75 67 68 20 4d 4d 4d 5c 6e 22 0a 20 20  hrough MMM\n".  
7010: 20 20 22 20 20 20 20 4e 4e 4e 2e 2e 65 6e 64 20    "    NNN..end 
7020: 20 20 20 20 20 20 20 53 68 6f 77 20 68 65 78 20         Show hex 
7030: 6f 66 20 70 61 67 65 73 20 4e 4e 4e 20 74 68 72  of pages NNN thr
7040: 6f 75 67 68 20 65 6e 64 20 6f 66 20 66 69 6c 65  ough end of file
7050: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e  \n".    "    NNN
7060: 62 20 20 20 20 20 20 20 20 20 20 20 20 44 65 63  b            Dec
7070: 6f 64 65 20 62 74 72 65 65 20 70 61 67 65 20 4e  ode btree page N
7080: 4e 4e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e  NN\n".    "    N
7090: 4e 4e 62 63 20 20 20 20 20 20 20 20 20 20 20 44  NNbc           D
70a0: 65 63 6f 64 65 20 62 74 72 65 65 20 70 61 67 65  ecode btree page
70b0: 20 4e 4e 4e 20 61 6e 64 20 73 68 6f 77 20 63 6f   NNN and show co
70c0: 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 22 20 20  ntent\n".    "  
70d0: 20 20 4e 4e 4e 62 6d 20 20 20 20 20 20 20 20 20    NNNbm         
70e0: 20 20 44 65 63 6f 64 65 20 62 74 72 65 65 20 70    Decode btree p
70f0: 61 67 65 20 4e 4e 4e 20 61 6e 64 20 73 68 6f 77  age NNN and show
7100: 20 61 20 6c 61 79 6f 75 74 20 6d 61 70 5c 6e 22   a layout map\n"
7110: 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 62 64 43  .    "    NNNbdC
7120: 43 43 20 20 20 20 20 20 20 20 44 65 63 6f 64 65  CC        Decode
7130: 20 63 65 6c 6c 20 43 43 43 20 6f 6e 20 62 74 72   cell CCC on btr
7140: 65 65 20 70 61 67 65 20 4e 4e 4e 5c 6e 22 0a 20  ee page NNN\n". 
7150: 20 20 20 22 20 20 20 20 4e 4e 4e 74 20 20 20 20     "    NNNt    
7160: 20 20 20 20 20 20 20 20 44 65 63 6f 64 65 20 66          Decode f
7170: 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
7180: 67 65 20 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22 20  ge NNN\n".    " 
7190: 20 20 20 4e 4e 4e 74 64 20 20 20 20 20 20 20 20     NNNtd        
71a0: 20 20 20 53 68 6f 77 20 6c 65 61 66 20 66 72 65     Show leaf fre
71b0: 65 6c 69 73 74 20 70 61 67 65 73 20 6f 6e 20 74  elist pages on t
71c0: 68 65 20 64 65 63 6f 64 65 5c 6e 22 0a 20 20 20  he decode\n".   
71d0: 20 22 20 20 20 20 4e 4e 4e 74 72 20 20 20 20 20   "    NNNtr     
71e0: 20 20 20 20 20 20 52 65 63 75 72 73 69 76 65 6c        Recursivel
71f0: 79 20 64 65 63 6f 64 65 20 66 72 65 65 6c 69 73  y decode freelis
7200: 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 4e 4e  t starting at NN
7210: 4e 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74  N\n".  );.}..int
7220: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
7230: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
7240: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
7250: 46 69 6c 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  File;.  unsigned
7260: 20 63 68 61 72 20 2a 7a 50 67 53 7a 3b 0a 20 20   char *zPgSz;.  
7270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 67  const char *zPrg
7280: 20 3d 20 61 72 67 76 5b 30 5d 3b 20 20 20 20 20   = argv[0];     
7290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 73 20  /* Name of this 
72a0: 65 78 65 63 75 74 61 62 6c 65 20 2a 2f 0a 20 20  executable */.  
72b0: 63 68 61 72 20 2a 2a 61 7a 41 72 67 20 3d 20 61  char **azArg = a
72c0: 72 67 76 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  rgv;.  int nArg 
72d0: 3d 20 61 72 67 63 3b 0a 0a 20 20 2f 2a 20 43 68  = argc;..  /* Ch
72e0: 65 63 6b 20 66 6f 72 20 74 68 65 20 22 2d 2d 75  eck for the "--u
72f0: 72 69 22 20 6f 72 20 22 2d 75 72 69 22 20 73 77  ri" or "-uri" sw
7300: 69 74 63 68 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  itch. */.  if( n
7310: 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 69 66 28  Arg>1 ){.    if(
7320: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
7330: 28 22 2d 72 61 77 22 2c 20 61 7a 41 72 67 5b 31  ("-raw", azArg[1
7340: 5d 29 3d 3d 30 20 0a 20 20 20 20 20 7c 7c 20 73  ])==0 .     || s
7350: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22  qlite3_stricmp("
7360: 2d 2d 72 61 77 22 2c 20 61 7a 41 72 67 5b 31 5d  --raw", azArg[1]
7370: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
7380: 20 20 67 2e 62 52 61 77 20 3d 20 31 3b 0a 20 20    g.bRaw = 1;.  
7390: 20 20 20 20 61 7a 41 72 67 2b 2b 3b 0a 20 20 20      azArg++;.   
73a0: 20 20 20 6e 41 72 67 2d 2d 3b 0a 20 20 20 20 7d     nArg--;.    }
73b0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 41 72 67  .  }..  if( nArg
73c0: 3c 32 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28  <2 ){.    usage(
73d0: 7a 50 72 67 29 3b 0a 20 20 20 20 65 78 69 74 28  zPrg);.    exit(
73e0: 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 69 6c 65 4f  1);.  }..  fileO
73f0: 70 65 6e 28 7a 50 72 67 2c 20 61 7a 41 72 67 5b  pen(zPrg, azArg[
7400: 31 5d 29 3b 0a 20 20 73 7a 46 69 6c 65 20 3d 20  1]);.  szFile = 
7410: 66 69 6c 65 47 65 74 73 69 7a 65 28 29 3b 0a 0a  fileGetsize();..
7420: 20 20 7a 50 67 53 7a 20 3d 20 66 69 6c 65 52 65    zPgSz = fileRe
7430: 61 64 28 31 36 2c 20 32 29 3b 0a 20 20 67 2e 70  ad(16, 2);.  g.p
7440: 61 67 65 73 69 7a 65 20 3d 20 7a 50 67 53 7a 5b  agesize = zPgSz[
7450: 30 5d 2a 32 35 36 20 2b 20 7a 50 67 53 7a 5b 31  0]*256 + zPgSz[1
7460: 5d 2a 36 35 35 33 36 3b 0a 20 20 69 66 28 20 67  ]*65536;.  if( g
7470: 2e 70 61 67 65 73 69 7a 65 3d 3d 30 20 29 20 67  .pagesize==0 ) g
7480: 2e 70 61 67 65 73 69 7a 65 20 3d 20 31 30 32 34  .pagesize = 1024
7490: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
74a0: 28 7a 50 67 53 7a 29 3b 0a 0a 20 20 70 72 69 6e  (zPgSz);..  prin
74b0: 74 66 28 22 50 61 67 65 73 69 7a 65 3a 20 25 64  tf("Pagesize: %d
74c0: 5c 6e 22 2c 20 67 2e 70 61 67 65 73 69 7a 65 29  \n", g.pagesize)
74d0: 3b 0a 20 20 67 2e 6d 78 50 61 67 65 20 3d 20 28  ;.  g.mxPage = (
74e0: 69 6e 74 29 28 28 73 7a 46 69 6c 65 2b 67 2e 70  int)((szFile+g.p
74f0: 61 67 65 73 69 7a 65 2d 31 29 2f 67 2e 70 61 67  agesize-1)/g.pag
7500: 65 73 69 7a 65 29 3b 0a 0a 20 20 70 72 69 6e 74  esize);..  print
7510: 66 28 22 41 76 61 69 6c 61 62 6c 65 20 70 61 67  f("Available pag
7520: 65 73 3a 20 31 2e 2e 25 64 5c 6e 22 2c 20 67 2e  es: 1..%d\n", g.
7530: 6d 78 50 61 67 65 29 3b 0a 20 20 69 66 28 20 6e  mxPage);.  if( n
7540: 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  Arg==2 ){.    in
7550: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
7560: 3b 20 69 3c 3d 67 2e 6d 78 50 61 67 65 3b 20 69  ; i<=g.mxPage; i
7570: 2b 2b 29 20 70 72 69 6e 74 5f 70 61 67 65 28 69  ++) print_page(i
7580: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7590: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
75a0: 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =2; i<nArg; i++)
75b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 74 61  {.      int iSta
75c0: 72 74 2c 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  rt, iEnd;.      
75d0: 63 68 61 72 20 2a 7a 4c 65 66 74 3b 0a 20 20 20  char *zLeft;.   
75e0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
75f0: 41 72 67 5b 69 5d 2c 20 22 64 62 68 65 61 64 65  Arg[i], "dbheade
7600: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
7610: 20 20 70 72 69 6e 74 5f 64 62 5f 68 65 61 64 65    print_db_heade
7620: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  r();.        con
7630: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
7640: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
7650: 61 7a 41 72 67 5b 69 5d 2c 20 22 70 67 69 64 78  azArg[i], "pgidx
7660: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
7670: 20 70 61 67 65 5f 75 73 61 67 65 5f 72 65 70 6f   page_usage_repo
7680: 72 74 28 7a 50 72 67 2c 20 61 7a 41 72 67 5b 31  rt(zPrg, azArg[1
7690: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ]);.        cont
76a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
76b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
76c0: 7a 41 72 67 5b 69 5d 2c 20 22 70 74 72 6d 61 70  zArg[i], "ptrmap
76d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
76e0: 20 70 74 72 6d 61 70 5f 63 6f 76 65 72 61 67 65   ptrmap_coverage
76f0: 5f 72 65 70 6f 72 74 28 61 7a 41 72 67 5b 31 5d  _report(azArg[1]
7700: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
7710: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7720: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
7730: 41 72 67 5b 69 5d 2c 20 22 68 65 6c 70 22 29 3d  Arg[i], "help")=
7740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73  =0 ){.        us
7750: 61 67 65 28 7a 50 72 67 29 3b 0a 20 20 20 20 20  age(zPrg);.     
7760: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7770: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
7780: 49 53 44 49 47 49 54 28 61 7a 41 72 67 5b 69 5d  ISDIGIT(azArg[i]
7790: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
77a0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
77b0: 22 25 73 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74  "%s: unknown opt
77c0: 69 6f 6e 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 50  ion: [%s]\n", zP
77d0: 72 67 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  rg, azArg[i]);. 
77e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
77f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7800: 53 74 61 72 74 20 3d 20 73 74 72 74 6f 6c 28 61  Start = strtol(a
7810: 7a 41 72 67 5b 69 5d 2c 20 26 7a 4c 65 66 74 2c  zArg[i], &zLeft,
7820: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   0);.      if( z
7830: 4c 65 66 74 20 26 26 20 73 74 72 63 6d 70 28 7a  Left && strcmp(z
7840: 4c 65 66 74 2c 22 2e 2e 65 6e 64 22 29 3d 3d 30  Left,"..end")==0
7850: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64   ){.        iEnd
7860: 20 3d 20 67 2e 6d 78 50 61 67 65 3b 0a 20 20 20   = g.mxPage;.   
7870: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 65     }else if( zLe
7880: 66 74 20 26 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d  ft && zLeft[0]==
7890: 27 2e 27 20 26 26 20 7a 4c 65 66 74 5b 31 5d 3d  '.' && zLeft[1]=
78a0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
78b0: 69 45 6e 64 20 3d 20 73 74 72 74 6f 6c 28 26 7a  iEnd = strtol(&z
78c0: 4c 65 66 74 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a  Left[2], 0, 0);.
78d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
78e0: 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66 74 5b 30  zLeft && zLeft[0
78f0: 5d 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20  ]=='b' ){.      
7900: 20 20 69 6e 74 20 6f 66 73 74 2c 20 6e 42 79 74    int ofst, nByt
7910: 65 2c 20 68 64 72 53 69 7a 65 3b 0a 20 20 20 20  e, hdrSize;.    
7920: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7930: 72 20 2a 61 3b 0a 20 20 20 20 20 20 20 20 69 66  r *a;.        if
7940: 28 20 69 53 74 61 72 74 3d 3d 31 20 29 7b 0a 20  ( iStart==1 ){. 
7950: 20 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20           ofst = 
7960: 68 64 72 53 69 7a 65 20 3d 20 31 30 30 3b 0a 20  hdrSize = 100;. 
7970: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d           nByte =
7980: 20 67 2e 70 61 67 65 73 69 7a 65 2d 31 30 30 3b   g.pagesize-100;
7990: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
79a0: 20 20 20 20 20 20 20 20 20 20 68 64 72 53 69 7a            hdrSiz
79b0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
79c0: 20 6f 66 73 74 20 3d 20 28 69 53 74 61 72 74 2d   ofst = (iStart-
79d0: 31 29 2a 67 2e 70 61 67 65 73 69 7a 65 3b 0a 20  1)*g.pagesize;. 
79e0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d           nByte =
79f0: 20 67 2e 70 61 67 65 73 69 7a 65 3b 0a 20 20 20   g.pagesize;.   
7a00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
7a10: 20 3d 20 66 69 6c 65 52 65 61 64 28 6f 66 73 74   = fileRead(ofst
7a20: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
7a30: 20 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f 70    decode_btree_p
7a40: 61 67 65 28 61 2c 20 69 53 74 61 72 74 2c 20 68  age(a, iStart, h
7a50: 64 72 53 69 7a 65 2c 20 26 7a 4c 65 66 74 5b 31  drSize, &zLeft[1
7a60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
7a70: 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20  te3_free(a);.   
7a80: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7a90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
7aa0: 4c 65 66 74 20 26 26 20 7a 4c 65 66 74 5b 30 5d  Left && zLeft[0]
7ab0: 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20  =='t' ){.       
7ac0: 20 69 6e 74 20 64 65 74 61 69 6c 20 3d 20 30 3b   int detail = 0;
7ad0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 63  .        int rec
7ae0: 75 72 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  ursive = 0;.    
7af0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
7b00: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 7a 4c 65 66     for(j=1; zLef
7b10: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
7b20: 20 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74 5b        if( zLeft[
7b30: 6a 5d 3d 3d 27 72 27 20 29 20 72 65 63 75 72 73  j]=='r' ) recurs
7b40: 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ive = 1;.       
7b50: 20 20 20 69 66 28 20 7a 4c 65 66 74 5b 6a 5d 3d     if( zLeft[j]=
7b60: 3d 27 64 27 20 29 20 64 65 74 61 69 6c 20 3d 20  ='d' ) detail = 
7b70: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
7b80: 20 20 20 20 20 64 65 63 6f 64 65 5f 74 72 75 6e       decode_trun
7b90: 6b 5f 70 61 67 65 28 69 53 74 61 72 74 2c 20 64  k_page(iStart, d
7ba0: 65 74 61 69 6c 2c 20 72 65 63 75 72 73 69 76 65  etail, recursive
7bb0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
7bc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
7bd0: 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  {.        iEnd =
7be0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 7d   iStart;.      }
7bf0: 0a 20 20 20 20 20 20 69 66 28 20 69 53 74 61 72  .      if( iStar
7c00: 74 3c 31 20 7c 7c 20 69 45 6e 64 3c 69 53 74 61  t<1 || iEnd<iSta
7c10: 72 74 20 7c 7c 20 69 45 6e 64 3e 67 2e 6d 78 50  rt || iEnd>g.mxP
7c20: 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  age ){.        f
7c30: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
7c40: 20 20 20 20 20 20 20 20 20 22 50 61 67 65 20 61           "Page a
7c50: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
7c60: 65 20 4c 4f 57 45 52 3f 2e 2e 55 50 50 45 52 3f  e LOWER?..UPPER?
7c70: 2e 20 20 52 61 6e 67 65 20 31 20 74 6f 20 25 64  .  Range 1 to %d
7c80: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 67  \n",.          g
7c90: 2e 6d 78 50 61 67 65 29 3b 0a 20 20 20 20 20 20  .mxPage);.      
7ca0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
7cb0: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
7cc0: 69 53 74 61 72 74 3c 3d 69 45 6e 64 20 29 7b 0a  iStart<=iEnd ){.
7cd0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 5f 70 61          print_pa
7ce0: 67 65 28 69 53 74 61 72 74 29 3b 0a 20 20 20 20  ge(iStart);.    
7cf0: 20 20 20 20 69 53 74 61 72 74 2b 2b 3b 0a 20 20      iStart++;.  
7d00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7d10: 20 20 66 69 6c 65 43 6c 6f 73 65 28 29 3b 0a 20    fileClose();. 
7d20: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a            return 0;.}.