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

Artifact bd073a78bce714a0e42d92ea474b3eb8cb53be5d:


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 69  ude <ctype.h>.#i
0070: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
0080: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  s.h>.#include <s
0090: 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c  ys/stat.h>.#incl
00a0: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 0a 23  ude <fcntl.h>..#
00b0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 4d 53 43  if !defined(_MSC
00c0: 5f 56 45 52 29 0a 23 69 6e 63 6c 75 64 65 20 3c  _VER).#include <
00d0: 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6c 73 65 0a  unistd.h>.#else.
00e0: 23 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a  #include <io.h>.
00f0: 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65  #endif..#include
0100: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0110: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0120: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0130: 33 2e 68 22 0a 0a 0a 73 74 61 74 69 63 20 69 6e  3.h"...static in
0140: 74 20 70 61 67 65 73 69 7a 65 20 3d 20 31 30 32  t pagesize = 102
0150: 34 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  4;     /* Size o
0160: 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
0170: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
0180: 64 62 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  db = -1;        
0190: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
01a0: 63 72 69 70 74 6f 72 20 66 6f 72 20 72 65 61 64  criptor for read
01b0: 69 6e 67 20 74 68 65 20 44 42 20 2a 2f 0a 73 74  ing the DB */.st
01c0: 61 74 69 63 20 69 6e 74 20 6d 78 50 61 67 65 20  atic int mxPage 
01d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
01e0: 20 4c 61 73 74 20 70 61 67 65 20 6e 75 6d 62 65   Last page numbe
01f0: 72 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r */.static int 
0200: 70 65 72 4c 69 6e 65 20 3d 20 31 36 3b 20 20 20  perLine = 16;   
0210: 20 20 20 20 20 2f 2a 20 48 45 58 20 65 6c 65 6d       /* HEX elem
0220: 65 6e 74 73 20 74 6f 20 70 72 69 6e 74 20 70 65  ents to print pe
0230: 72 20 6c 69 6e 65 20 2a 2f 0a 0a 74 79 70 65 64  r line */..typed
0240: 65 66 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74  ef long long int
0250: 20 69 36 34 3b 20 20 20 20 20 20 2f 2a 20 44 61   i64;      /* Da
0260: 74 61 74 79 70 65 20 66 6f 72 20 36 34 2d 62 69  tatype for 64-bi
0270: 74 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 0a 0a  t integers */...
0280: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
0290: 65 20 76 61 72 2d 69 6e 74 20 66 6f 72 6d 61 74  e var-int format
02a0: 20 69 6e 74 6f 20 69 36 34 2e 20 20 52 65 74 75   into i64.  Retu
02b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
02c0: 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65   bytes.** in the
02d0: 20 76 61 72 2d 69 6e 74 2e 20 20 57 72 69 74 65   var-int.  Write
02e0: 20 74 68 65 20 76 61 72 2d 69 6e 74 20 76 61 6c   the var-int val
02f0: 75 65 20 69 6e 74 6f 20 2a 70 56 61 6c 2e 0a 2a  ue into *pVal..*
0300: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
0310: 6f 64 65 56 61 72 69 6e 74 28 63 6f 6e 73 74 20  odeVarint(const 
0320: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
0330: 2c 20 69 36 34 20 2a 70 56 61 6c 29 7b 0a 20 20  , i64 *pVal){.  
0340: 69 36 34 20 76 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 v = 0;.  int
0350: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
0360: 3c 38 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20  <8; i++){.    v 
0370: 3d 20 28 76 3c 3c 37 29 20 2b 20 28 7a 5b 69 5d  = (v<<7) + (z[i]
0380: 26 30 78 37 66 29 3b 0a 20 20 20 20 69 66 28 20  &0x7f);.    if( 
0390: 28 7a 5b 69 5d 26 30 78 38 30 29 3d 3d 30 20 29  (z[i]&0x80)==0 )
03a0: 7b 20 2a 70 56 61 6c 20 3d 20 76 3b 20 72 65 74  { *pVal = v; ret
03b0: 75 72 6e 20 69 2b 31 3b 20 7d 0a 20 20 7d 0a 20  urn i+1; }.  }. 
03c0: 20 76 20 3d 20 28 76 3c 3c 38 29 20 2b 20 28 7a   v = (v<<8) + (z
03d0: 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 2a 70 56  [i]&0xff);.  *pV
03e0: 61 6c 20 3d 20 76 3b 0a 20 20 72 65 74 75 72 6e  al = v;.  return
03f0: 20 39 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74   9;.}../*.** Ext
0400: 72 61 63 74 20 61 20 62 69 67 2d 65 6e 64 69 61  ract a big-endia
0410: 6e 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  n 32-bit integer
0420: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
0430: 6e 65 64 20 69 6e 74 20 64 65 63 6f 64 65 49 6e  ned int decodeIn
0440: 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  t32(const unsign
0450: 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 72  ed char *z){.  r
0460: 65 74 75 72 6e 20 28 7a 5b 30 5d 3c 3c 32 34 29  eturn (z[0]<<24)
0470: 20 2b 20 28 7a 5b 31 5d 3c 3c 31 36 29 20 2b 20   + (z[1]<<16) + 
0480: 28 7a 5b 32 5d 3c 3c 38 29 20 2b 20 7a 5b 33 5d  (z[2]<<8) + z[3]
0490: 3b 0a 7d 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61  ;.}../* Report a
04a0: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
04b0: 65 72 72 6f 72 20 61 6e 64 20 64 69 65 2e 0a 2a  error and die..*
04c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
04d0: 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76 6f 69 64  t_of_memory(void
04e0: 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  ){.  fprintf(std
04f0: 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
0500: 72 79 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69  ry...\n");.  exi
0510: 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  t(1);.}../*.** R
0520: 65 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ead content from
0530: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
0540: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
0550: 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 62  he content is ob
0560: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
0570: 6f 63 28 29 20 61 6e 64 20 6e 65 65 64 73 20 74  oc() and needs t
0580: 6f 20 62 65 0a 2a 2a 20 66 72 65 65 64 20 62 79  o be.** freed by
0590: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
05a0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
05b0: 63 68 61 72 20 2a 67 65 74 43 6f 6e 74 65 6e 74  char *getContent
05c0: 28 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e  (int ofst, int n
05d0: 42 79 74 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65  Byte){.  unsigne
05e0: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20  d char *aData;. 
05f0: 20 61 44 61 74 61 20 3d 20 6d 61 6c 6c 6f 63 28   aData = malloc(
0600: 6e 42 79 74 65 2b 33 32 29 3b 0a 20 20 69 66 28  nByte+32);.  if(
0610: 20 61 44 61 74 61 3d 3d 30 20 29 20 6f 75 74 5f   aData==0 ) out_
0620: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6d  of_memory();.  m
0630: 65 6d 73 65 74 28 61 44 61 74 61 2c 20 30 2c 20  emset(aData, 0, 
0640: 6e 42 79 74 65 2b 33 32 29 3b 0a 20 20 6c 73 65  nByte+32);.  lse
0650: 65 6b 28 64 62 2c 20 6f 66 73 74 2c 20 53 45 45  ek(db, ofst, SEE
0660: 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 72 65  K_SET);.  if( re
0670: 61 64 28 64 62 2c 20 61 44 61 74 61 2c 20 6e 42  ad(db, aData, nB
0680: 79 74 65 29 3c 6e 42 79 74 65 20 29 20 6d 65 6d  yte)<nByte ) mem
0690: 73 65 74 28 61 44 61 74 61 2c 20 30 2c 20 6e 42  set(aData, 0, nB
06a0: 79 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  yte);.  return a
06b0: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  Data;.}../*.** P
06c0: 72 69 6e 74 20 61 20 72 61 6e 67 65 20 6f 66 20  rint a range of 
06d0: 62 79 74 65 73 20 61 73 20 68 65 78 20 61 6e 64  bytes as hex and
06e0: 20 61 73 20 61 73 63 69 69 2e 0a 2a 2f 0a 73 74   as ascii..*/.st
06f0: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
0700: 61 72 20 2a 70 72 69 6e 74 5f 62 79 74 65 5f 72  ar *print_byte_r
0710: 61 6e 67 65 28 0a 20 20 69 6e 74 20 6f 66 73 74  ange(.  int ofst
0720: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
0730: 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
0740: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 74  range of bytes t
0750: 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  o print */.  int
0760: 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
0770: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
0780: 65 73 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20  es to print */. 
0790: 20 69 6e 74 20 70 72 69 6e 74 4f 66 73 74 20 20   int printOfst  
07a0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
07b0: 61 6d 6f 75 6e 74 20 74 6f 20 74 68 65 20 69 6e  amount to the in
07c0: 64 65 78 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  dex on the left 
07d0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 75  column */.){.  u
07e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
07f0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ata;.  int i, j;
0800: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0810: 4f 66 73 74 46 6d 74 3b 0a 0a 20 20 69 66 28 20  OfstFmt;..  if( 
0820: 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74  ((printOfst+nByt
0830: 65 29 26 7e 30 78 66 66 66 29 3d 3d 30 20 29 7b  e)&~0xfff)==0 ){
0840: 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20  .    zOfstFmt = 
0850: 22 20 25 30 33 78 3a 20 22 3b 0a 20 20 7d 65 6c  " %03x: ";.  }el
0860: 73 65 20 69 66 28 20 28 28 70 72 69 6e 74 4f 66  se if( ((printOf
0870: 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66 66  st+nByte)&~0xfff
0880: 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66  f)==0 ){.    zOf
0890: 73 74 46 6d 74 20 3d 20 22 20 25 30 34 78 3a 20  stFmt = " %04x: 
08a0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  ";.  }else if( (
08b0: 28 70 72 69 6e 74 4f 66 73 74 2b 6e 42 79 74 65  (printOfst+nByte
08c0: 29 26 7e 30 78 66 66 66 66 66 29 3d 3d 30 20 29  )&~0xfffff)==0 )
08d0: 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d  {.    zOfstFmt =
08e0: 20 22 20 25 30 35 78 3a 20 22 3b 0a 20 20 7d 65   " %05x: ";.  }e
08f0: 6c 73 65 20 69 66 28 20 28 28 70 72 69 6e 74 4f  lse if( ((printO
0900: 66 73 74 2b 6e 42 79 74 65 29 26 7e 30 78 66 66  fst+nByte)&~0xff
0910: 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ffff)==0 ){.    
0920: 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 36  zOfstFmt = " %06
0930: 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  x: ";.  }else{. 
0940: 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20     zOfstFmt = " 
0950: 25 30 38 78 3a 20 22 3b 0a 20 20 7d 0a 0a 20 20  %08x: ";.  }..  
0960: 61 44 61 74 61 20 3d 20 67 65 74 43 6f 6e 74 65  aData = getConte
0970: 6e 74 28 6f 66 73 74 2c 20 6e 42 79 74 65 29 3b  nt(ofst, nByte);
0980: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
0990: 79 74 65 3b 20 69 20 2b 3d 20 70 65 72 4c 69 6e  yte; i += perLin
09a0: 65 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e){.    fprintf(
09b0: 73 74 64 6f 75 74 2c 20 7a 4f 66 73 74 46 6d 74  stdout, zOfstFmt
09c0: 2c 20 69 2b 70 72 69 6e 74 4f 66 73 74 29 3b 0a  , i+printOfst);.
09d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
09e0: 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20  erLine; j++){.  
09f0: 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74      if( i+j>nByt
0a00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
0a10: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 20 20  intf(stdout, "  
0a20: 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   ");.      }else
0a30: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
0a40: 66 28 73 74 64 6f 75 74 2c 22 25 30 32 78 20 22  f(stdout,"%02x "
0a50: 2c 20 61 44 61 74 61 5b 69 2b 6a 5d 29 3b 0a 20  , aData[i+j]);. 
0a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
0a70: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 65 72 4c   for(j=0; j<perL
0a80: 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ine; j++){.     
0a90: 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74 65 20 29   if( i+j>nByte )
0aa0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
0ab0: 66 28 73 74 64 6f 75 74 2c 20 22 20 22 29 3b 0a  f(stdout, " ");.
0ac0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
0ad0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
0ae0: 6f 75 74 2c 22 25 63 22 2c 20 69 73 70 72 69 6e  out,"%c", isprin
0af0: 74 28 61 44 61 74 61 5b 69 2b 6a 5d 29 20 3f 20  t(aData[i+j]) ? 
0b00: 61 44 61 74 61 5b 69 2b 6a 5d 20 3a 20 27 2e 27  aData[i+j] : '.'
0b10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
0b20: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
0b30: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  out,"\n");.  }. 
0b40: 20 72 65 74 75 72 6e 20 61 44 61 74 61 3b 0a 7d   return aData;.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  ../*.** Print an
0b60: 20 65 6e 74 69 72 65 20 70 61 67 65 20 6f 66 20   entire page of 
0b70: 63 6f 6e 74 65 6e 74 20 61 73 20 68 65 78 0a 2a  content as hex.*
0b80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
0b90: 69 6e 74 5f 70 61 67 65 28 69 6e 74 20 69 50 67  int_page(int iPg
0ba0: 29 7b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 3b  ){.  int iStart;
0bb0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
0bc0: 20 2a 61 44 61 74 61 3b 0a 20 20 69 53 74 61 72   *aData;.  iStar
0bd0: 74 20 3d 20 28 69 50 67 2d 31 29 2a 70 61 67 65  t = (iPg-1)*page
0be0: 73 69 7a 65 3b 0a 20 20 66 70 72 69 6e 74 66 28  size;.  fprintf(
0bf0: 73 74 64 6f 75 74 2c 20 22 50 61 67 65 20 25 64  stdout, "Page %d
0c00: 3a 20 20 20 28 6f 66 66 73 65 74 73 20 30 78 25  :   (offsets 0x%
0c10: 78 2e 2e 30 78 25 78 29 5c 6e 22 2c 0a 20 20 20  x..0x%x)\n",.   
0c20: 20 20 20 20 20 20 20 69 50 67 2c 20 69 53 74 61         iPg, iSta
0c30: 72 74 2c 20 69 53 74 61 72 74 2b 70 61 67 65 73  rt, iStart+pages
0c40: 69 7a 65 2d 31 29 3b 0a 20 20 61 44 61 74 61 20  ize-1);.  aData 
0c50: 3d 20 70 72 69 6e 74 5f 62 79 74 65 5f 72 61 6e  = print_byte_ran
0c60: 67 65 28 69 53 74 61 72 74 2c 20 70 61 67 65 73  ge(iStart, pages
0c70: 69 7a 65 2c 20 30 29 3b 0a 20 20 66 72 65 65 28  ize, 0);.  free(
0c80: 61 44 61 74 61 29 3b 0a 7d 0a 0a 0a 2f 2a 20 50  aData);.}.../* P
0c90: 72 69 6e 74 20 61 20 6c 69 6e 65 20 6f 66 20 64  rint a line of d
0ca0: 65 63 6f 64 65 20 6f 75 74 70 75 74 20 73 68 6f  ecode output sho
0cb0: 77 69 6e 67 20 61 20 34 2d 62 79 74 65 20 69 6e  wing a 4-byte in
0cc0: 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  teger..*/.static
0cd0: 20 76 6f 69 64 20 70 72 69 6e 74 5f 64 65 63 6f   void print_deco
0ce0: 64 65 5f 6c 69 6e 65 28 0a 20 20 75 6e 73 69 67  de_line(.  unsig
0cf0: 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 2c  ned char *aData,
0d00: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
0d10: 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
0d20: 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 69 6e  /.  int ofst, in
0d30: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 2f  t nByte,       /
0d40: 2a 20 53 74 61 72 74 20 61 6e 64 20 73 69 7a 65  * Start and size
0d50: 20 6f 66 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   of decode */.  
0d60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
0d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
0d80: 73 73 61 67 65 20 74 6f 20 61 70 70 65 6e 64 20  ssage to append 
0d90: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
0da0: 3b 0a 20 20 69 6e 74 20 76 61 6c 20 3d 20 61 44  ;.  int val = aD
0db0: 61 74 61 5b 6f 66 73 74 5d 3b 0a 20 20 63 68 61  ata[ofst];.  cha
0dc0: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 73  r zBuf[100];.  s
0dd0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 20 25  printf(zBuf, " %
0de0: 30 33 78 3a 20 25 30 32 78 22 2c 20 6f 66 73 74  03x: %02x", ofst
0df0: 2c 20 61 44 61 74 61 5b 6f 66 73 74 5d 29 3b 0a  , aData[ofst]);.
0e00: 20 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    i = (int)strle
0e10: 6e 28 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 6a  n(zBuf);.  for(j
0e20: 3d 31 3b 20 6a 3c 34 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<4; j++){. 
0e30: 20 20 20 69 66 28 20 6a 3e 3d 6e 42 79 74 65 20     if( j>=nByte 
0e40: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
0e50: 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20 20 20 22  (&zBuf[i], "   "
0e60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
0e70: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
0e80: 66 5b 69 5d 2c 20 22 20 25 30 32 78 22 2c 20 61  f[i], " %02x", a
0e90: 44 61 74 61 5b 6f 66 73 74 2b 6a 5d 29 3b 0a 20  Data[ofst+j]);. 
0ea0: 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a 32       val = val*2
0eb0: 35 36 20 2b 20 61 44 61 74 61 5b 6f 66 73 74 2b  56 + aData[ofst+
0ec0: 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  j];.    }.    i 
0ed0: 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 26  += (int)strlen(&
0ee0: 7a 42 75 66 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  zBuf[i]);.  }.  
0ef0: 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d  sprintf(&zBuf[i]
0f00: 2c 20 22 20 20 20 25 39 64 22 2c 20 76 61 6c 29  , "   %9d", val)
0f10: 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73 20 20  ;.  printf("%s  
0f20: 25 73 5c 6e 22 2c 20 7a 42 75 66 2c 20 7a 4d 73  %s\n", zBuf, zMs
0f30: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  g);.}../*.** Dec
0f40: 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
0f50: 20 68 65 61 64 65 72 2e 0a 2a 2f 0a 73 74 61 74   header..*/.stat
0f60: 69 63 20 76 6f 69 64 20 70 72 69 6e 74 5f 64 62  ic void print_db
0f70: 5f 68 65 61 64 65 72 28 76 6f 69 64 29 7b 0a 20  _header(void){. 
0f80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0f90: 61 44 61 74 61 3b 0a 20 20 61 44 61 74 61 20 3d  aData;.  aData =
0fa0: 20 70 72 69 6e 74 5f 62 79 74 65 5f 72 61 6e 67   print_byte_rang
0fb0: 65 28 30 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20  e(0, 100, 0);.  
0fc0: 70 72 69 6e 74 66 28 22 44 65 63 6f 64 65 64 3a  printf("Decoded:
0fd0: 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  \n");.  print_de
0fe0: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
0ff0: 20 31 36 2c 20 32 2c 20 22 44 61 74 61 62 61 73   16, 2, "Databas
1000: 65 20 70 61 67 65 20 73 69 7a 65 22 29 3b 0a 20  e page size");. 
1010: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1020: 6e 65 28 61 44 61 74 61 2c 20 31 38 2c 20 31 2c  ne(aData, 18, 1,
1030: 20 22 46 69 6c 65 20 66 6f 72 6d 61 74 20 77 72   "File format wr
1040: 69 74 65 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20  ite version");. 
1050: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
1060: 6e 65 28 61 44 61 74 61 2c 20 31 39 2c 20 31 2c  ne(aData, 19, 1,
1070: 20 22 46 69 6c 65 20 66 6f 72 6d 61 74 20 72 65   "File format re
1080: 61 64 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20  ad version");.  
1090: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
10a0: 65 28 61 44 61 74 61 2c 20 32 30 2c 20 31 2c 20  e(aData, 20, 1, 
10b0: 22 52 65 73 65 72 76 65 64 20 73 70 61 63 65 20  "Reserved space 
10c0: 61 74 20 65 6e 64 20 6f 66 20 70 61 67 65 22 29  at end of page")
10d0: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
10e0: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 32 34 2c  _line(aData, 24,
10f0: 20 34 2c 20 22 46 69 6c 65 20 63 68 61 6e 67 65   4, "File change
1100: 20 63 6f 75 6e 74 65 72 22 29 3b 0a 20 20 70 72   counter");.  pr
1110: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1120: 61 44 61 74 61 2c 20 32 38 2c 20 34 2c 20 22 53  aData, 28, 4, "S
1130: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
1140: 69 6e 20 70 61 67 65 73 22 29 3b 0a 20 20 70 72  in pages");.  pr
1150: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1160: 61 44 61 74 61 2c 20 33 32 2c 20 34 2c 20 22 50  aData, 32, 4, "P
1170: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  age number of fi
1180: 72 73 74 20 66 72 65 65 6c 69 73 74 20 70 61 67  rst freelist pag
1190: 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  e");.  print_dec
11a0: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
11b0: 33 36 2c 20 34 2c 20 22 4e 75 6d 62 65 72 20 6f  36, 4, "Number o
11c0: 66 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73  f freelist pages
11d0: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
11e0: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 34  de_line(aData, 4
11f0: 30 2c 20 34 2c 20 22 53 63 68 65 6d 61 20 63 6f  0, 4, "Schema co
1200: 6f 6b 69 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f  okie");.  print_
1210: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
1220: 61 2c 20 34 34 2c 20 34 2c 20 22 53 63 68 65 6d  a, 44, 4, "Schem
1230: 61 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e  a format version
1240: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1250: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 34  de_line(aData, 4
1260: 38 2c 20 34 2c 20 22 44 65 66 61 75 6c 74 20 70  8, 4, "Default p
1270: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 22 29  age cache size")
1280: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1290: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 35 32 2c  _line(aData, 52,
12a0: 20 34 2c 20 22 4c 61 72 67 65 73 74 20 61 75 74   4, "Largest aut
12b0: 6f 2d 76 61 63 20 72 6f 6f 74 20 70 61 67 65 22  o-vac root page"
12c0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
12d0: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 35 36  e_line(aData, 56
12e0: 2c 20 34 2c 20 22 54 65 78 74 20 65 6e 63 6f 64  , 4, "Text encod
12f0: 69 6e 67 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  ing");.  print_d
1300: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
1310: 2c 20 36 30 2c 20 34 2c 20 22 55 73 65 72 20 76  , 60, 4, "User v
1320: 65 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72 69 6e  ersion");.  prin
1330: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1340: 61 74 61 2c 20 36 34 2c 20 34 2c 20 22 49 6e 63  ata, 64, 4, "Inc
1350: 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 20  remental-vacuum 
1360: 6d 6f 64 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f  mode");.  print_
1370: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
1380: 61 2c 20 36 38 2c 20 34 2c 20 22 41 70 70 6c 69  a, 68, 4, "Appli
1390: 63 61 74 69 6f 6e 20 49 44 22 29 3b 0a 20 20 70  cation ID");.  p
13a0: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
13b0: 28 61 44 61 74 61 2c 20 37 32 2c 20 34 2c 20 22  (aData, 72, 4, "
13c0: 6d 65 74 61 5b 38 5d 22 29 3b 0a 20 20 70 72 69  meta[8]");.  pri
13d0: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
13e0: 44 61 74 61 2c 20 37 36 2c 20 34 2c 20 22 6d 65  Data, 76, 4, "me
13f0: 74 61 5b 39 5d 22 29 3b 0a 20 20 70 72 69 6e 74  ta[9]");.  print
1400: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1410: 74 61 2c 20 38 30 2c 20 34 2c 20 22 6d 65 74 61  ta, 80, 4, "meta
1420: 5b 31 30 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f  [10]");.  print_
1430: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
1440: 61 2c 20 38 34 2c 20 34 2c 20 22 6d 65 74 61 5b  a, 84, 4, "meta[
1450: 31 31 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  11]");.  print_d
1460: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
1470: 2c 20 38 38 2c 20 34 2c 20 22 6d 65 74 61 5b 31  , 88, 4, "meta[1
1480: 32 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  2]");.  print_de
1490: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
14a0: 20 39 32 2c 20 34 2c 20 22 43 68 61 6e 67 65 20   92, 4, "Change 
14b0: 63 6f 75 6e 74 65 72 20 66 6f 72 20 76 65 72 73  counter for vers
14c0: 69 6f 6e 20 6e 75 6d 62 65 72 22 29 3b 0a 20 20  ion number");.  
14d0: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
14e0: 65 28 61 44 61 74 61 2c 20 39 36 2c 20 34 2c 20  e(aData, 96, 4, 
14f0: 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20  "SQLite version 
1500: 6e 75 6d 62 65 72 22 29 3b 0a 7d 0a 0a 2f 2a 0a  number");.}../*.
1510: 2a 2a 20 44 65 73 63 72 69 62 65 20 63 65 6c 6c  ** Describe cell
1520: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61   content..*/.sta
1530: 74 69 63 20 69 36 34 20 64 65 73 63 72 69 62 65  tic i64 describe
1540: 43 6f 6e 74 65 6e 74 28 0a 20 20 75 6e 73 69 67  Content(.  unsig
1550: 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 20 20 20  ned char *a,    
1560: 20 20 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e 74 65     /* Cell conte
1570: 6e 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4c 6f 63  nt */.  i64 nLoc
1580: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
1590: 2f 2a 20 42 79 74 65 73 20 69 6e 20 61 5b 5d 20  /* Bytes in a[] 
15a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 63  */.  char *zDesc
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c0: 57 72 69 74 65 20 64 65 73 63 72 69 70 74 69 6f  Write descriptio
15d0: 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
15e0: 36 34 20 6e 44 65 73 63 20 3d 20 30 3b 0a 20 20  64 nDesc = 0;.  
15f0: 69 6e 74 20 6e 2c 20 6a 3b 0a 20 20 69 36 34 20  int n, j;.  i64 
1600: 69 2c 20 78 2c 20 76 3b 0a 20 20 63 6f 6e 73 74  i, x, v;.  const
1610: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1620: 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 75  pData;.  const u
1630: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4c  nsigned char *pL
1640: 69 6d 69 74 3b 0a 20 20 63 68 61 72 20 73 65 70  imit;.  char sep
1650: 20 3d 20 27 20 27 3b 0a 0a 20 20 70 4c 69 6d 69   = ' ';..  pLimi
1660: 74 20 3d 20 26 61 5b 6e 4c 6f 63 61 6c 5d 3b 0a  t = &a[nLocal];.
1670: 20 20 6e 20 3d 20 64 65 63 6f 64 65 56 61 72 69    n = decodeVari
1680: 6e 74 28 61 2c 20 26 78 29 3b 0a 20 20 70 44 61  nt(a, &x);.  pDa
1690: 74 61 20 3d 20 26 61 5b 78 5d 3b 0a 20 20 61 20  ta = &a[x];.  a 
16a0: 2b 3d 20 6e 3b 0a 20 20 69 20 3d 20 78 20 2d 20  += n;.  i = x - 
16b0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  n;.  while( i>0 
16c0: 26 26 20 70 44 61 74 61 3c 3d 70 4c 69 6d 69 74  && pData<=pLimit
16d0: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 64 65 63 6f   ){.    n = deco
16e0: 64 65 56 61 72 69 6e 74 28 61 2c 20 26 78 29 3b  deVarint(a, &x);
16f0: 0a 20 20 20 20 61 20 2b 3d 20 6e 3b 0a 20 20 20  .    a += n;.   
1700: 20 69 20 2d 3d 20 6e 3b 0a 20 20 20 20 6e 4c 6f   i -= n;.    nLo
1710: 63 61 6c 20 2d 3d 20 6e 3b 0a 20 20 20 20 7a 44  cal -= n;.    zD
1720: 65 73 63 5b 30 5d 20 3d 20 73 65 70 3b 0a 20 20  esc[0] = sep;.  
1730: 20 20 73 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20    sep = ',';.   
1740: 20 6e 44 65 73 63 2b 2b 3b 0a 20 20 20 20 7a 44   nDesc++;.    zD
1750: 65 73 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 78  esc++;.    if( x
1760: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 72  ==0 ){.      spr
1770: 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 2a 22 29  intf(zDesc, "*")
1780: 3b 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 69 73  ;     /* NULL is
1790: 20 61 20 22 2a 22 20 2a 2f 0a 20 20 20 20 7d 65   a "*" */.    }e
17a0: 6c 73 65 20 69 66 28 20 78 3e 3d 31 20 26 26 20  lse if( x>=1 && 
17b0: 78 3c 3d 36 20 29 7b 0a 20 20 20 20 20 20 76 20  x<=6 ){.      v 
17c0: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 70  = (signed char)p
17d0: 44 61 74 61 5b 30 5d 3b 0a 20 20 20 20 20 20 70  Data[0];.      p
17e0: 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20 73 77  Data++;.      sw
17f0: 69 74 63 68 28 20 78 20 29 7b 0a 20 20 20 20 20  itch( x ){.     
1800: 20 20 20 63 61 73 65 20 36 3a 20 20 76 20 3d 20     case 6:  v = 
1810: 28 76 3c 3c 31 36 29 20 2b 20 28 70 44 61 74 61  (v<<16) + (pData
1820: 5b 30 5d 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b  [0]<<8) + pData[
1830: 31 5d 3b 20 20 70 44 61 74 61 20 2b 3d 20 32 3b  1];  pData += 2;
1840: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 35 3a  .        case 5:
1850: 20 20 76 20 3d 20 28 76 3c 3c 31 36 29 20 2b 20    v = (v<<16) + 
1860: 28 70 44 61 74 61 5b 30 5d 3c 3c 38 29 20 2b 20  (pData[0]<<8) + 
1870: 70 44 61 74 61 5b 31 5d 3b 20 20 70 44 61 74 61  pData[1];  pData
1880: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63   += 2;.        c
1890: 61 73 65 20 34 3a 20 20 76 20 3d 20 28 76 3c 3c  ase 4:  v = (v<<
18a0: 38 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b 20 20  8) + pData[0];  
18b0: 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20 20  pData++;.       
18c0: 20 63 61 73 65 20 33 3a 20 20 76 20 3d 20 28 76   case 3:  v = (v
18d0: 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b  <<8) + pData[0];
18e0: 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20    pData++;.     
18f0: 20 20 20 63 61 73 65 20 32 3a 20 20 76 20 3d 20     case 2:  v = 
1900: 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30  (v<<8) + pData[0
1910: 5d 3b 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20  ];  pData++;.   
1920: 20 20 20 7d 0a 20 20 20 20 20 20 73 70 72 69 6e     }.      sprin
1930: 74 66 28 7a 44 65 73 63 2c 20 22 25 6c 6c 64 22  tf(zDesc, "%lld"
1940: 2c 20 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , v);.    }else 
1950: 69 66 28 20 78 3d 3d 37 20 29 7b 0a 20 20 20 20  if( x==7 ){.    
1960: 20 20 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c    sprintf(zDesc,
1970: 20 22 72 65 61 6c 22 29 3b 0a 20 20 20 20 20 20   "real");.      
1980: 70 44 61 74 61 20 2b 3d 20 38 3b 0a 20 20 20 20  pData += 8;.    
1990: 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d 38 20 29  }else if( x==8 )
19a0: 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
19b0: 7a 44 65 73 63 2c 20 22 30 22 29 3b 0a 20 20 20  zDesc, "0");.   
19c0: 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d 39 20   }else if( x==9 
19d0: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
19e0: 28 7a 44 65 73 63 2c 20 22 31 22 29 3b 0a 20 20  (zDesc, "1");.  
19f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3e 3d 31    }else if( x>=1
1a00: 32 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  2 ){.      i64 s
1a10: 69 7a 65 20 3d 20 28 78 2d 31 32 29 2f 32 3b 0a  ize = (x-12)/2;.
1a20: 20 20 20 20 20 20 69 66 28 20 28 78 26 31 29 3d        if( (x&1)=
1a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  =0 ){.        sp
1a40: 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22 62 6c  rintf(zDesc, "bl
1a50: 6f 62 28 25 6c 6c 64 29 22 2c 20 73 69 7a 65 29  ob(%lld)", size)
1a60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a70: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
1a80: 44 65 73 63 2c 20 22 74 78 74 28 25 6c 6c 64 29  Desc, "txt(%lld)
1a90: 22 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  ", size);.      
1aa0: 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 2b 3d  }.      pData +=
1ab0: 20 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20   size;.    }.   
1ac0: 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
1ad0: 28 7a 44 65 73 63 29 3b 0a 20 20 20 20 7a 44 65  (zDesc);.    zDe
1ae0: 73 63 20 2b 3d 20 6a 3b 0a 20 20 20 20 6e 44 65  sc += j;.    nDe
1af0: 73 63 20 2b 3d 20 6a 3b 0a 20 20 7d 0a 20 20 72  sc += j;.  }.  r
1b00: 65 74 75 72 6e 20 6e 44 65 73 63 3b 0a 7d 0a 0a  eturn nDesc;.}..
1b10: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
1b20: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20  e local payload 
1b30: 73 69 7a 65 20 67 69 76 65 6e 20 74 68 65 20 74  size given the t
1b40: 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
1b50: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 67  e and.** the pag
1b60: 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  e size..*/.stati
1b70: 63 20 69 36 34 20 6c 6f 63 61 6c 50 61 79 6c 6f  c i64 localPaylo
1b80: 61 64 28 69 36 34 20 6e 50 61 79 6c 6f 61 64 2c  ad(i64 nPayload,
1b90: 20 63 68 61 72 20 63 54 79 70 65 29 7b 0a 20 20   char cType){.  
1ba0: 69 36 34 20 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  i64 maxLocal;.  
1bb0: 69 36 34 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  i64 minLocal;.  
1bc0: 69 36 34 20 73 75 72 70 6c 75 73 3b 0a 20 20 69  i64 surplus;.  i
1bd0: 36 34 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28  64 nLocal;.  if(
1be0: 20 63 54 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20   cType==13 ){.  
1bf0: 20 20 2f 2a 20 54 61 62 6c 65 20 6c 65 61 66 20    /* Table leaf 
1c00: 2a 2f 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  */.    maxLocal 
1c10: 3d 20 70 61 67 65 73 69 7a 65 2d 33 35 3b 0a 20  = pagesize-35;. 
1c20: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70     minLocal = (p
1c30: 61 67 65 73 69 7a 65 2d 31 32 29 2a 33 32 2f 32  agesize-12)*32/2
1c40: 35 35 2d 32 33 3b 0a 20 20 7d 65 6c 73 65 7b 0a  55-23;.  }else{.
1c50: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 28      maxLocal = (
1c60: 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 36 34 2f  pagesize-12)*64/
1c70: 32 35 35 2d 32 33 3b 0a 20 20 20 20 6d 69 6e 4c  255-23;.    minL
1c80: 6f 63 61 6c 20 3d 20 28 70 61 67 65 73 69 7a 65  ocal = (pagesize
1c90: 2d 31 32 29 2a 33 32 2f 32 35 35 2d 32 33 3b 0a  -12)*32/255-23;.
1ca0: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f    }.  if( nPaylo
1cb0: 61 64 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  ad>maxLocal ){. 
1cc0: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
1cd0: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
1ce0: 64 2d 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 61 67  d-minLocal)%(pag
1cf0: 65 73 69 7a 65 2d 34 29 3b 0a 20 20 20 20 69 66  esize-4);.    if
1d00: 28 20 73 75 72 70 6c 75 73 3c 3d 6d 61 78 4c 6f  ( surplus<=maxLo
1d10: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f  cal ){.      nLo
1d20: 63 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20  cal = surplus;. 
1d30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d40: 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61  nLocal = minLoca
1d50: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  l;.    }.  }else
1d60: 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e  {.    nLocal = n
1d70: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 72  Payload;.  }.  r
1d80: 65 74 75 72 6e 20 6e 4c 6f 63 61 6c 3b 0a 7d 0a  eturn nLocal;.}.
1d90: 20 20 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65    ../*.** Create
1da0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 66   a description f
1db0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 63 65 6c 6c  or a single cell
1dc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
1dd0: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
1de0: 6c 6f 63 61 6c 20 63 65 6c 6c 20 73 69 7a 65 2e  local cell size.
1df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 64  .*/.static i64 d
1e00: 65 73 63 72 69 62 65 43 65 6c 6c 28 0a 20 20 75  escribeCell(.  u
1e10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 54 79  nsigned char cTy
1e20: 70 65 2c 20 20 20 20 2f 2a 20 50 61 67 65 20 74  pe,    /* Page t
1e30: 79 70 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ype */.  unsigne
1e40: 64 20 63 68 61 72 20 2a 61 2c 20 20 20 20 20 20  d char *a,      
1e50: 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74   /* Cell content
1e60: 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 43 65   */.  int showCe
1e70: 6c 6c 43 6f 6e 74 65 6e 74 2c 20 20 20 20 2f 2a  llContent,    /*
1e80: 20 53 68 6f 77 20 63 65 6c 6c 20 63 6f 6e 74 65   Show cell conte
1e90: 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  nt if true */.  
1ea0: 63 68 61 72 20 2a 2a 70 7a 44 65 73 63 20 20 20  char **pzDesc   
1eb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
1ec0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 68 65 72   description her
1ed0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
1ee0: 0a 20 20 69 36 34 20 6e 44 65 73 63 20 3d 20 30  .  i64 nDesc = 0
1ef0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
1f00: 20 69 6e 74 20 6c 65 66 74 43 68 69 6c 64 3b 0a   int leftChild;.
1f10: 20 20 69 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a    i64 nPayload;.
1f20: 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 20 20 69    i64 rowid;.  i
1f30: 36 34 20 6e 4c 6f 63 61 6c 3b 0a 20 20 73 74 61  64 nLocal;.  sta
1f40: 74 69 63 20 63 68 61 72 20 7a 44 65 73 63 5b 31  tic char zDesc[1
1f50: 30 30 30 5d 3b 0a 20 20 69 20 3d 20 30 3b 0a 20  000];.  i = 0;. 
1f60: 20 69 66 28 20 63 54 79 70 65 3c 3d 35 20 29 7b   if( cType<=5 ){
1f70: 0a 20 20 20 20 6c 65 66 74 43 68 69 6c 64 20 3d  .    leftChild =
1f80: 20 28 28 61 5b 30 5d 2a 32 35 36 20 2b 20 61 5b   ((a[0]*256 + a[
1f90: 31 5d 29 2a 32 35 36 20 2b 20 61 5b 32 5d 29 2a  1])*256 + a[2])*
1fa0: 32 35 36 20 2b 20 61 5b 33 5d 3b 0a 20 20 20 20  256 + a[3];.    
1fb0: 61 20 2b 3d 20 34 3b 0a 20 20 20 20 6e 20 2b 3d  a += 4;.    n +=
1fc0: 20 34 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   4;.    sprintf(
1fd0: 7a 44 65 73 63 2c 20 22 6c 78 3a 20 25 64 20 22  zDesc, "lx: %d "
1fe0: 2c 20 6c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20  , leftChild);.  
1ff0: 20 20 6e 44 65 73 63 20 3d 20 73 74 72 6c 65 6e    nDesc = strlen
2000: 28 7a 44 65 73 63 29 3b 0a 20 20 7d 0a 20 20 69  (zDesc);.  }.  i
2010: 66 28 20 63 54 79 70 65 21 3d 35 20 29 7b 0a 20  f( cType!=5 ){. 
2020: 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56 61 72     i = decodeVar
2030: 69 6e 74 28 61 2c 20 26 6e 50 61 79 6c 6f 61 64  int(a, &nPayload
2040: 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b 0a 20  );.    a += i;. 
2050: 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20 20 73     n += i;.    s
2060: 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b 6e 44  printf(&zDesc[nD
2070: 65 73 63 5d 2c 20 22 6e 3a 20 25 6c 6c 64 20 22  esc], "n: %lld "
2080: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
2090: 20 6e 44 65 73 63 20 2b 3d 20 73 74 72 6c 65 6e   nDesc += strlen
20a0: 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 29 3b  (&zDesc[nDesc]);
20b0: 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6c 6f  .    nLocal = lo
20c0: 63 61 6c 50 61 79 6c 6f 61 64 28 6e 50 61 79 6c  calPayload(nPayl
20d0: 6f 61 64 2c 20 63 54 79 70 65 29 3b 0a 20 20 7d  oad, cType);.  }
20e0: 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  else{.    nPaylo
20f0: 61 64 20 3d 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b  ad = nLocal = 0;
2100: 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65  .  }.  if( cType
2110: 3d 3d 35 20 7c 7c 20 63 54 79 70 65 3d 3d 31 33  ==5 || cType==13
2120: 20 29 7b 0a 20 20 20 20 69 20 3d 20 64 65 63 6f   ){.    i = deco
2130: 64 65 56 61 72 69 6e 74 28 61 2c 20 26 72 6f 77  deVarint(a, &row
2140: 69 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b  id);.    a += i;
2150: 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20  .    n += i;.   
2160: 20 73 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b   sprintf(&zDesc[
2170: 6e 44 65 73 63 5d 2c 20 22 72 3a 20 25 6c 6c 64  nDesc], "r: %lld
2180: 20 22 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20   ", rowid);.    
2190: 6e 44 65 73 63 20 2b 3d 20 73 74 72 6c 65 6e 28  nDesc += strlen(
21a0: 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 29 3b 0a  &zDesc[nDesc]);.
21b0: 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 61 6c    }.  if( nLocal
21c0: 3c 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  <nPayload ){.   
21d0: 20 69 6e 74 20 6f 76 66 6c 3b 0a 20 20 20 20 75   int ovfl;.    u
21e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 20  nsigned char *b 
21f0: 3d 20 26 61 5b 6e 4c 6f 63 61 6c 5d 3b 0a 20 20  = &a[nLocal];.  
2200: 20 20 6f 76 66 6c 20 3d 20 28 28 62 5b 30 5d 2a    ovfl = ((b[0]*
2210: 32 35 36 20 2b 20 62 5b 31 5d 29 2a 32 35 36 20  256 + b[1])*256 
2220: 2b 20 62 5b 32 5d 29 2a 32 35 36 20 2b 20 62 5b  + b[2])*256 + b[
2230: 33 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  3];.    sprintf(
2240: 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20 22  &zDesc[nDesc], "
2250: 6f 76 3a 20 25 64 20 22 2c 20 6f 76 66 6c 29 3b  ov: %d ", ovfl);
2260: 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20 73 74  .    nDesc += st
2270: 72 6c 65 6e 28 26 7a 44 65 73 63 5b 6e 44 65 73  rlen(&zDesc[nDes
2280: 63 5d 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 34 3b  c]);.    n += 4;
2290: 0a 20 20 7d 0a 20 20 69 66 28 20 73 68 6f 77 43  .  }.  if( showC
22a0: 65 6c 6c 43 6f 6e 74 65 6e 74 20 26 26 20 63 54  ellContent && cT
22b0: 79 70 65 21 3d 35 20 29 7b 0a 20 20 20 20 6e 44  ype!=5 ){.    nD
22c0: 65 73 63 20 2b 3d 20 64 65 73 63 72 69 62 65 43  esc += describeC
22d0: 6f 6e 74 65 6e 74 28 61 2c 20 6e 4c 6f 63 61 6c  ontent(a, nLocal
22e0: 2c 20 26 7a 44 65 73 63 5b 6e 44 65 73 63 2d 31  , &zDesc[nDesc-1
22f0: 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 7a 44 65 73  ]);.  }.  *pzDes
2300: 63 20 3d 20 7a 44 65 73 63 3b 0a 20 20 72 65 74  c = zDesc;.  ret
2310: 75 72 6e 20 6e 4c 6f 63 61 6c 2b 6e 3b 0a 7d 0a  urn nLocal+n;.}.
2320: 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 6f 66 66  ./* Print an off
2330: 73 65 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  set followed by 
2340: 6e 42 79 74 65 20 62 79 74 65 73 2e 20 20 41 64  nByte bytes.  Ad
2350: 64 20 65 78 74 72 61 20 77 68 69 74 65 2d 73 70  d extra white-sp
2360: 61 63 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ace.** at the en
2370: 64 20 73 6f 20 74 68 61 74 20 73 75 62 73 65 71  d so that subseq
2380: 75 65 6e 74 20 74 65 78 74 20 69 73 20 61 6c 69  uent text is ali
2390: 67 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gned..*/.static 
23a0: 76 6f 69 64 20 70 72 69 6e 74 42 79 74 65 73 28  void printBytes(
23b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
23c0: 20 2a 61 44 61 74 61 2c 20 20 20 20 20 20 2f 2a   *aData,      /*
23d0: 20 43 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 64   Content being d
23e0: 65 63 6f 64 65 64 20 2a 2f 0a 20 20 75 6e 73 69  ecoded */.  unsi
23f0: 67 6e 65 64 20 63 68 61 72 20 2a 61 53 74 61 72  gned char *aStar
2400: 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  t,     /* Start 
2410: 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65  of content to be
2420: 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20 20 69 6e   printed */.  in
2430: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
2440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2450: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 70  er of bytes to p
2460: 72 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rint */.){.  int
2470: 20 6a 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 25   j;.  printf(" %
2480: 30 33 78 3a 20 22 2c 20 28 69 6e 74 29 28 61 53  03x: ", (int)(aS
2490: 74 61 72 74 2d 61 44 61 74 61 29 29 3b 0a 20 20  tart-aData));.  
24a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 39 3b 20 6a 2b  for(j=0; j<9; j+
24b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 6e  +){.    if( j>=n
24c0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 72  Byte ){.      pr
24d0: 69 6e 74 66 28 22 20 20 20 22 29 3b 0a 20 20 20  intf("   ");.   
24e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72   }else{.      pr
24f0: 69 6e 74 66 28 22 25 30 32 78 20 22 2c 20 61 53  intf("%02x ", aS
2500: 74 61 72 74 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a  tart[j]);.    }.
2510: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72    }.}.../*.** Wr
2520: 69 74 65 20 61 20 66 75 6c 6c 20 64 65 63 6f 64  ite a full decod
2530: 65 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20  e on stdout for 
2540: 74 68 65 20 63 65 6c 6c 20 61 74 20 61 5b 6f 66  the cell at a[of
2550: 73 74 5d 2e 0a 2a 2a 20 41 73 73 75 6d 65 20 74  st]..** Assume t
2560: 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
2570: 20 61 20 68 65 61 64 65 72 20 6f 66 20 73 69 7a   a header of siz
2580: 65 20 73 7a 50 67 48 64 72 20 62 79 74 65 73 2e  e szPgHdr bytes.
2590: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25a0: 64 65 63 6f 64 65 43 65 6c 6c 28 0a 20 20 75 6e  decodeCell(.  un
25b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20  signed char *a, 
25c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
25d0: 6e 74 65 6e 74 20 28 77 69 74 68 6f 75 74 20 74  ntent (without t
25e0: 68 65 20 70 61 67 65 2d 31 20 68 65 61 64 65 72  he page-1 header
25f0: 29 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  ) */.  unsigned 
2600: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
2610: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
2620: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
2630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65             /* Ce
2640: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
2650: 74 20 73 7a 50 67 48 64 72 2c 20 20 20 20 20 20  t szPgHdr,      
2660: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2670: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
2680: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
2690: 20 69 6e 74 20 6f 66 73 74 20 20 20 20 20 20 20   int ofst       
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c           /* Cell
26b0: 20 62 65 67 69 6e 73 20 61 74 20 61 5b 6f 66 73   begins at a[ofs
26c0: 74 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  t] */.){.  int i
26d0: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6c 65 66 74 43  , j;.  int leftC
26e0: 68 69 6c 64 3b 0a 20 20 69 36 34 20 6b 3b 0a 20  hild;.  i64 k;. 
26f0: 20 69 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   i64 nPayload;. 
2700: 20 69 36 34 20 72 6f 77 69 64 3b 0a 20 20 69 36   i64 rowid;.  i6
2710: 34 20 6e 48 64 72 3b 0a 20 20 69 36 34 20 69 54  4 nHdr;.  i64 iT
2720: 79 70 65 3b 0a 20 20 69 36 34 20 6e 4c 6f 63 61  ype;.  i64 nLoca
2730: 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
2740: 61 72 20 2a 78 20 3d 20 61 20 2b 20 6f 66 73 74  ar *x = a + ofst
2750: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2760: 72 20 2a 65 6e 64 3b 0a 20 20 75 6e 73 69 67 6e  r *end;.  unsign
2770: 65 64 20 63 68 61 72 20 63 54 79 70 65 20 3d 20  ed char cType = 
2780: 61 5b 30 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  a[0];.  int nCol
2790: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 43 6f   = 0;.  int szCo
27a0: 6c 5b 32 30 30 30 5d 3b 0a 20 20 69 6e 74 20 6f  l[2000];.  int o
27b0: 66 73 74 43 6f 6c 5b 32 30 30 30 5d 3b 0a 20 20  fstCol[2000];.  
27c0: 69 6e 74 20 74 79 70 65 43 6f 6c 5b 32 30 30 30  int typeCol[2000
27d0: 5d 3b 0a 0a 20 20 70 72 69 6e 74 66 28 22 43 65  ];..  printf("Ce
27e0: 6c 6c 5b 25 64 5d 3a 5c 6e 22 2c 20 69 43 65 6c  ll[%d]:\n", iCel
27f0: 6c 29 3b 0a 20 20 69 66 28 20 63 54 79 70 65 3c  l);.  if( cType<
2800: 3d 35 20 29 7b 0a 20 20 20 20 6c 65 66 74 43 68  =5 ){.    leftCh
2810: 69 6c 64 20 3d 20 28 28 78 5b 30 5d 2a 32 35 36  ild = ((x[0]*256
2820: 20 2b 20 78 5b 31 5d 29 2a 32 35 36 20 2b 20 78   + x[1])*256 + x
2830: 5b 32 5d 29 2a 32 35 36 20 2b 20 78 5b 33 5d 3b  [2])*256 + x[3];
2840: 0a 20 20 20 20 70 72 69 6e 74 42 79 74 65 73 28  .    printBytes(
2850: 61 2c 20 78 2c 20 34 29 3b 0a 20 20 20 20 70 72  a, x, 4);.    pr
2860: 69 6e 74 66 28 22 6c 65 66 74 20 63 68 69 6c 64  intf("left child
2870: 20 70 61 67 65 3a 3a 20 25 64 5c 6e 22 2c 20 6c   page:: %d\n", l
2880: 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 20 20 78  eftChild);.    x
2890: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
28a0: 20 63 54 79 70 65 21 3d 35 20 29 7b 0a 20 20 20   cType!=5 ){.   
28b0: 20 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e   i = decodeVarin
28c0: 74 28 78 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b  t(x, &nPayload);
28d0: 0a 20 20 20 20 70 72 69 6e 74 42 79 74 65 73 28  .    printBytes(
28e0: 61 2c 20 78 2c 20 69 29 3b 0a 20 20 20 20 6e 4c  a, x, i);.    nL
28f0: 6f 63 61 6c 20 3d 20 6c 6f 63 61 6c 50 61 79 6c  ocal = localPayl
2900: 6f 61 64 28 6e 50 61 79 6c 6f 61 64 2c 20 63 54  oad(nPayload, cT
2910: 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  ype);.    if( nL
2920: 6f 63 61 6c 3d 3d 6e 50 61 79 6c 6f 61 64 20 29  ocal==nPayload )
2930: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
2940: 70 61 79 6c 6f 61 64 2d 73 69 7a 65 3a 20 25 6c  payload-size: %l
2950: 6c 64 5c 6e 22 2c 20 6e 50 61 79 6c 6f 61 64 29  ld\n", nPayload)
2960: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2970: 20 20 20 70 72 69 6e 74 66 28 22 70 61 79 6c 6f     printf("paylo
2980: 61 64 2d 73 69 7a 65 3a 20 25 6c 6c 64 20 28 25  ad-size: %lld (%
2990: 6c 6c 64 20 6c 6f 63 61 6c 2c 20 25 6c 6c 64 20  lld local, %lld 
29a0: 6f 76 65 72 66 6c 6f 77 29 5c 6e 22 2c 0a 20 20  overflow)\n",.  
29b0: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 79 6c             nPayl
29c0: 6f 61 64 2c 20 6e 4c 6f 63 61 6c 2c 20 6e 50 61  oad, nLocal, nPa
29d0: 79 6c 6f 61 64 2d 6e 4c 6f 63 61 6c 29 3b 0a 20  yload-nLocal);. 
29e0: 20 20 20 7d 0a 20 20 20 20 78 20 2b 3d 20 69 3b     }.    x += i;
29f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
2a00: 61 79 6c 6f 61 64 20 3d 20 6e 4c 6f 63 61 6c 20  ayload = nLocal 
2a10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6e 64 20 3d  = 0;.  }.  end =
2a20: 20 78 20 2b 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69   x + nLocal;.  i
2a30: 66 28 20 63 54 79 70 65 3d 3d 35 20 7c 7c 20 63  f( cType==5 || c
2a40: 54 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20 20 20  Type==13 ){.    
2a50: 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  i = decodeVarint
2a60: 28 78 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  (x, &rowid);.   
2a70: 20 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20 78   printBytes(a, x
2a80: 2c 20 69 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , i);.    printf
2a90: 28 22 72 6f 77 69 64 3a 20 25 6c 6c 64 5c 6e 22  ("rowid: %lld\n"
2aa0: 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 78 20  , rowid);.    x 
2ab0: 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += i;.  }.  if( 
2ac0: 6e 4c 6f 63 61 6c 3e 30 20 29 7b 0a 20 20 20 20  nLocal>0 ){.    
2ad0: 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  i = decodeVarint
2ae0: 28 78 2c 20 26 6e 48 64 72 29 3b 0a 20 20 20 20  (x, &nHdr);.    
2af0: 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20 78 2c  printBytes(a, x,
2b00: 20 69 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   i);.    printf(
2b10: 22 72 65 63 6f 72 64 2d 68 65 61 64 65 72 2d 73  "record-header-s
2b20: 69 7a 65 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74  ize: %d\n", (int
2b30: 29 6e 48 64 72 29 3b 0a 20 20 20 20 6a 20 3d 20  )nHdr);.    j = 
2b40: 69 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  i;.    nCol = 0;
2b50: 0a 20 20 20 20 6b 20 3d 20 6e 48 64 72 3b 0a 20  .    k = nHdr;. 
2b60: 20 20 20 77 68 69 6c 65 28 20 78 2b 6a 3c 65 6e     while( x+j<en
2b70: 64 20 26 26 20 6a 3c 6e 48 64 72 20 29 7b 0a 20  d && j<nHdr ){. 
2b80: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b90: 20 2a 7a 54 79 70 65 4e 61 6d 65 3b 0a 20 20 20   *zTypeName;.   
2ba0: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 30 3b 0a      int sz = 0;.
2bb0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 4e 6d 5b         char zNm[
2bc0: 33 30 5d 3b 0a 20 20 20 20 20 20 20 69 20 3d 20  30];.       i = 
2bd0: 64 65 63 6f 64 65 56 61 72 69 6e 74 28 78 2b 6a  decodeVarint(x+j
2be0: 2c 20 26 69 54 79 70 65 29 3b 0a 20 20 20 20 20  , &iType);.     
2bf0: 20 20 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20    printBytes(a, 
2c00: 78 2b 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  x+j, i);.       
2c10: 70 72 69 6e 74 66 28 22 74 79 70 65 63 6f 64 65  printf("typecode
2c20: 5b 25 64 5d 3a 20 25 64 20 2d 20 22 2c 20 6e 43  [%d]: %d - ", nC
2c30: 6f 6c 2c 20 28 69 6e 74 29 69 54 79 70 65 29 3b  ol, (int)iType);
2c40: 0a 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20  .       switch( 
2c50: 69 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20  iType ){.       
2c60: 20 20 63 61 73 65 20 30 3a 20 20 7a 54 79 70 65    case 0:  zType
2c70: 4e 61 6d 65 20 3d 20 22 4e 55 4c 4c 22 3b 20 20  Name = "NULL";  
2c80: 20 20 73 7a 20 3d 20 30 3b 20 20 62 72 65 61 6b    sz = 0;  break
2c90: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
2ca0: 31 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20  1:  zTypeName = 
2cb0: 22 69 6e 74 38 22 3b 20 20 20 20 73 7a 20 3d 20  "int8";    sz = 
2cc0: 31 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  1;  break;.     
2cd0: 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a 54 79      case 2:  zTy
2ce0: 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74 31 36 22  peName = "int16"
2cf0: 3b 20 20 20 73 7a 20 3d 20 32 3b 20 20 62 72 65  ;   sz = 2;  bre
2d00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
2d10: 65 20 33 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20  e 3:  zTypeName 
2d20: 3d 20 22 69 6e 74 32 34 22 3b 20 20 20 73 7a 20  = "int24";   sz 
2d30: 3d 20 33 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  = 3;  break;.   
2d40: 20 20 20 20 20 20 63 61 73 65 20 34 3a 20 20 7a        case 4:  z
2d50: 54 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74 33  TypeName = "int3
2d60: 32 22 3b 20 20 20 73 7a 20 3d 20 34 3b 20 20 62  2";   sz = 4;  b
2d70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
2d80: 61 73 65 20 35 3a 20 20 7a 54 79 70 65 4e 61 6d  ase 5:  zTypeNam
2d90: 65 20 3d 20 22 69 6e 74 34 38 22 3b 20 20 20 73  e = "int48";   s
2da0: 7a 20 3d 20 36 3b 20 20 62 72 65 61 6b 3b 0a 20  z = 6;  break;. 
2db0: 20 20 20 20 20 20 20 20 63 61 73 65 20 36 3a 20          case 6: 
2dc0: 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e   zTypeName = "in
2dd0: 74 36 34 22 3b 20 20 20 73 7a 20 3d 20 38 3b 20  t64";   sz = 8; 
2de0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2df0: 20 63 61 73 65 20 37 3a 20 20 7a 54 79 70 65 4e   case 7:  zTypeN
2e00: 61 6d 65 20 3d 20 22 64 6f 75 62 6c 65 22 3b 20  ame = "double"; 
2e10: 20 73 7a 20 3d 20 38 3b 20 20 62 72 65 61 6b 3b   sz = 8;  break;
2e20: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 38  .         case 8
2e30: 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22  :  zTypeName = "
2e40: 7a 65 72 6f 22 3b 20 20 20 20 73 7a 20 3d 20 30  zero";    sz = 0
2e50: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
2e60: 20 20 20 63 61 73 65 20 39 3a 20 20 7a 54 79 70     case 9:  zTyp
2e70: 65 4e 61 6d 65 20 3d 20 22 6f 6e 65 22 3b 20 20  eName = "one";  
2e80: 20 20 20 73 7a 20 3d 20 30 3b 20 20 62 72 65 61     sz = 0;  brea
2e90: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
2ea0: 20 31 30 3a 0a 20 20 20 20 20 20 20 20 20 63 61   10:.         ca
2eb0: 73 65 20 31 31 3a 20 7a 54 79 70 65 4e 61 6d 65  se 11: zTypeName
2ec0: 20 3d 20 22 65 72 72 6f 72 22 3b 20 20 20 73 7a   = "error";   sz
2ed0: 20 3d 20 30 3b 20 20 62 72 65 61 6b 3b 0a 20 20   = 0;  break;.  
2ee0: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
2ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 73 7a 20  {.           sz 
2f00: 3d 20 28 69 6e 74 29 28 69 54 79 70 65 2d 31 32  = (int)(iType-12
2f10: 29 2f 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )/2;.           
2f20: 73 70 72 69 6e 74 66 28 7a 4e 6d 2c 20 28 69 54  sprintf(zNm, (iT
2f30: 79 70 65 26 31 29 3d 3d 30 20 3f 20 22 62 6c 6f  ype&1)==0 ? "blo
2f40: 62 28 25 64 29 22 20 3a 20 22 74 65 78 74 28 25  b(%d)" : "text(%
2f50: 64 29 22 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  d)", sz);.      
2f60: 20 20 20 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d       zTypeName =
2f70: 20 7a 4e 6d 3b 0a 20 20 20 20 20 20 20 20 20 20   zNm;.          
2f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2f90: 20 7d 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20   }.       }.    
2fa0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22     printf("%s\n"
2fb0: 2c 20 7a 54 79 70 65 4e 61 6d 65 29 3b 0a 20 20  , zTypeName);.  
2fc0: 20 20 20 20 20 73 7a 43 6f 6c 5b 6e 43 6f 6c 5d       szCol[nCol]
2fd0: 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 6f 66   = sz;.       of
2fe0: 73 74 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 28 69  stCol[nCol] = (i
2ff0: 6e 74 29 6b 3b 0a 20 20 20 20 20 20 20 74 79 70  nt)k;.       typ
3000: 65 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 28 69 6e  eCol[nCol] = (in
3010: 74 29 69 54 79 70 65 3b 0a 20 20 20 20 20 20 20  t)iType;.       
3020: 6b 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  k += sz;.       
3030: 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 6a  nCol++;.       j
3040: 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20   += i;.    }.   
3050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3060: 20 26 26 20 6f 66 73 74 43 6f 6c 5b 69 5d 2b 73   && ofstCol[i]+s
3070: 7a 43 6f 6c 5b 69 5d 3c 3d 6e 4c 6f 63 61 6c 3b  zCol[i]<=nLocal;
3080: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 6e   i++){.       in
3090: 74 20 73 20 3d 20 6f 66 73 74 43 6f 6c 5b 69 5d  t s = ofstCol[i]
30a0: 3b 0a 20 20 20 20 20 20 20 69 36 34 20 76 3b 0a  ;.       i64 v;.
30b0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73         const uns
30c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
30d0: 61 3b 0a 20 20 20 20 20 20 20 69 66 28 20 73 7a  a;.       if( sz
30e0: 43 6f 6c 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  Col[i]==0 ) cont
30f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 70 72 69  inue;.       pri
3100: 6e 74 42 79 74 65 73 28 61 2c 20 78 2b 73 2c 20  ntBytes(a, x+s, 
3110: 73 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  szCol[i]);.     
3120: 20 20 70 72 69 6e 74 66 28 22 64 61 74 61 5b 25    printf("data[%
3130: 64 5d 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20 20  d]: ", i);.     
3140: 20 20 70 44 61 74 61 20 3d 20 78 2b 73 3b 0a 20    pData = x+s;. 
3150: 20 20 20 20 20 20 69 66 28 20 74 79 70 65 43 6f        if( typeCo
3160: 6c 5b 69 5d 3c 3d 37 20 29 7b 0a 20 20 20 20 20  l[i]<=7 ){.     
3170: 20 20 20 20 76 20 3d 20 28 73 69 67 6e 65 64 20      v = (signed 
3180: 63 68 61 72 29 70 44 61 74 61 5b 30 5d 3b 0a 20  char)pData[0];. 
3190: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b          for(k=1;
31a0: 20 6b 3c 73 7a 43 6f 6c 5b 69 5d 3b 20 6b 2b 2b   k<szCol[i]; k++
31b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 76 20  ){.           v 
31c0: 3d 20 28 76 3c 3c 38 29 20 2b 20 70 44 61 74 61  = (v<<8) + pData
31d0: 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a  [k];.         }.
31e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 79 70           if( typ
31f0: 65 43 6f 6c 5b 69 5d 3d 3d 37 20 29 7b 0a 20 20  eCol[i]==7 ){.  
3200: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
3210: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 6d 65  r;.           me
3220: 6d 63 70 79 28 26 72 2c 20 26 76 2c 20 73 69 7a  mcpy(&r, &v, siz
3230: 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20 20  eof(r));.       
3240: 20 20 20 20 70 72 69 6e 74 66 28 22 25 23 67 5c      printf("%#g\
3250: 6e 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  n", r);.        
3260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3270: 20 20 20 70 72 69 6e 74 66 28 22 25 6c 6c 64 5c     printf("%lld\
3280: 6e 22 2c 20 76 29 3b 0a 20 20 20 20 20 20 20 20  n", v);.        
3290: 20 7d 0a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b   }.       }else{
32a0: 0a 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  .         int ii
32b0: 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 63  , jj;.         c
32c0: 68 61 72 20 7a 43 6f 6e 73 74 5b 33 32 5d 3b 0a  har zConst[32];.
32d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 74 79           if( (ty
32e0: 70 65 43 6f 6c 5b 69 5d 26 31 29 3d 3d 30 20 29  peCol[i]&1)==0 )
32f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  {.           zCo
3300: 6e 73 74 5b 30 5d 20 3d 20 27 78 27 3b 0a 20 20  nst[0] = 'x';.  
3310: 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 73 74 5b           zConst[
3320: 31 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20  1] = '\'';.     
3330: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 32 2c 20        for(ii=2, 
3340: 6a 6a 3d 30 3b 20 6a 6a 3c 73 7a 43 6f 6c 5b 69  jj=0; jj<szCol[i
3350: 5d 20 26 26 20 69 69 3c 32 34 3b 20 6a 6a 2b 2b  ] && ii<24; jj++
3360: 2c 20 69 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  , ii+=2){.      
3370: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
3380: 43 6f 6e 73 74 2b 69 69 2c 20 22 25 30 32 78 22  Const+ii, "%02x"
3390: 2c 20 70 44 61 74 61 5b 6a 6a 5d 29 3b 0a 20 20  , pData[jj]);.  
33a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33c0: 20 20 20 20 20 20 7a 43 6f 6e 73 74 5b 30 5d 20        zConst[0] 
33d0: 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  = '\'';.        
33e0: 20 20 20 66 6f 72 28 69 69 3d 31 2c 20 6a 6a 3d     for(ii=1, jj=
33f0: 30 3b 20 6a 6a 3c 73 7a 43 6f 6c 5b 69 5d 20 26  0; jj<szCol[i] &
3400: 26 20 69 69 3c 32 34 3b 20 6a 6a 2b 2b 2c 20 69  & ii<24; jj++, i
3410: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
3420: 20 20 20 7a 43 6f 6e 73 74 5b 69 69 5d 20 3d 20     zConst[ii] = 
3430: 69 73 70 72 69 6e 74 28 70 44 61 74 61 5b 6a 6a  isprint(pData[jj
3440: 5d 29 20 3f 20 70 44 61 74 61 5b 6a 6a 5d 20 3a  ]) ? pData[jj] :
3450: 20 27 2e 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '.';.          
3460: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 7a 43   }.           zC
3470: 6f 6e 73 74 5b 69 69 5d 20 3d 20 30 3b 0a 20 20  onst[ii] = 0;.  
3480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3490: 20 20 69 66 28 20 6a 6a 3c 73 7a 43 6f 6c 5b 69    if( jj<szCol[i
34a0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
34b0: 6d 65 6d 63 70 79 28 7a 43 6f 6e 73 74 2b 69 69  memcpy(zConst+ii
34c0: 2c 20 22 2e 2e 2e 27 22 2c 20 35 29 3b 0a 20 20  , "...'", 5);.  
34d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34e0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
34f0: 7a 43 6f 6e 73 74 2b 69 69 2c 20 22 27 22 2c 20  zConst+ii, "'", 
3500: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  2);.         }. 
3510: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
3520: 25 73 5c 6e 22 2c 20 7a 43 6f 6e 73 74 29 3b 0a  %s\n", zConst);.
3530: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3540: 6a 20 3d 20 6f 66 73 74 43 6f 6c 5b 69 5d 20 2b  j = ofstCol[i] +
3550: 20 73 7a 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7d   szCol[i];.    }
3560: 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 6e 4c 6f  .  }.  if( j<nLo
3570: 63 61 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  cal ){.    print
3580: 42 79 74 65 73 28 61 2c 20 78 2b 6a 2c 20 30 29  Bytes(a, x+j, 0)
3590: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 2e  ;.    printf("..
35a0: 2e 20 25 6c 6c 64 20 62 79 74 65 73 20 6f 66 20  . %lld bytes of 
35b0: 63 6f 6e 74 65 6e 74 20 2e 2e 2e 5c 6e 22 2c 20  content ...\n", 
35c0: 6e 4c 6f 63 61 6c 2d 6a 29 3b 0a 20 20 7d 0a 20  nLocal-j);.  }. 
35d0: 20 69 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79   if( nLocal<nPay
35e0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 72 69 6e  load ){.    prin
35f0: 74 42 79 74 65 73 28 61 2c 20 78 2b 6e 4c 6f 63  tBytes(a, x+nLoc
3600: 61 6c 2c 20 34 29 3b 0a 20 20 20 20 70 72 69 6e  al, 4);.    prin
3610: 74 66 28 22 6f 76 65 72 66 6c 6f 77 2d 70 61 67  tf("overflow-pag
3620: 65 3a 20 25 64 5c 6e 22 2c 20 64 65 63 6f 64 65  e: %d\n", decode
3630: 49 6e 74 33 32 28 78 2b 6e 4c 6f 63 61 6c 29 29  Int32(x+nLocal))
3640: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
3650: 44 65 63 6f 64 65 20 61 20 62 74 72 65 65 20 70  Decode a btree p
3660: 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  age.*/.static vo
3670: 69 64 20 64 65 63 6f 64 65 5f 62 74 72 65 65 5f  id decode_btree_
3680: 70 61 67 65 28 0a 20 20 75 6e 73 69 67 6e 65 64  page(.  unsigned
3690: 20 63 68 61 72 20 2a 61 2c 20 20 20 2f 2a 20 50   char *a,   /* P
36a0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  age content */. 
36b0: 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20   int pgno,      
36c0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
36d0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ber */.  int hdr
36e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Size,        /* 
36f0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
3700: 20 68 65 61 64 65 72 2e 20 20 30 20 6f 72 20 31   header.  0 or 1
3710: 30 30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41  00 */.  char *zA
3720: 72 67 73 20 20 20 20 20 20 20 20 20 2f 2a 20 46  rgs         /* F
3730: 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
3740: 66 6f 72 6d 61 74 74 69 6e 67 20 2a 2f 0a 29 7b  formatting */.){
3750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3760: 54 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  Type = "unknown"
3770: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
3780: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
3790: 20 69 43 65 6c 6c 50 74 72 3b 0a 20 20 69 6e 74   iCellPtr;.  int
37a0: 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74   showCellContent
37b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 68 6f 77   = 0;.  int show
37c0: 4d 61 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  Map = 0;.  int c
37d0: 65 6c 6c 54 6f 44 65 63 6f 64 65 20 3d 20 2d 32  ellToDecode = -2
37e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 70 20 3d  ;.  char *zMap =
37f0: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 61 5b   0;.  switch( a[
3800: 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20 32  0] ){.    case 2
3810: 3a 20 20 7a 54 79 70 65 20 3d 20 22 69 6e 64 65  :  zType = "inde
3820: 78 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 22  x interior node"
3830: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
3840: 73 65 20 35 3a 20 20 7a 54 79 70 65 20 3d 20 22  se 5:  zType = "
3850: 74 61 62 6c 65 20 69 6e 74 65 72 69 6f 72 20 6e  table interior n
3860: 6f 64 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ode";  break;.  
3870: 20 20 63 61 73 65 20 31 30 3a 20 7a 54 79 70 65    case 10: zType
3880: 20 3d 20 22 69 6e 64 65 78 20 6c 65 61 66 22 3b   = "index leaf";
3890: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
38a0: 3b 0a 20 20 20 20 63 61 73 65 20 31 33 3a 20 7a  ;.    case 13: z
38b0: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 20 6c 65  Type = "table le
38c0: 61 66 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  af";           b
38d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  reak;.  }.  whil
38e0: 65 28 20 7a 41 72 67 73 5b 30 5d 20 29 7b 0a 20  e( zArgs[0] ){. 
38f0: 20 20 20 73 77 69 74 63 68 28 20 7a 41 72 67 73     switch( zArgs
3900: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73  [0] ){.      cas
3910: 65 20 27 63 27 3a 20 73 68 6f 77 43 65 6c 6c 43  e 'c': showCellC
3920: 6f 6e 74 65 6e 74 20 3d 20 31 3b 20 20 62 72 65  ontent = 1;  bre
3930: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27  ak;.      case '
3940: 6d 27 3a 20 73 68 6f 77 4d 61 70 20 3d 20 31 3b  m': showMap = 1;
3950: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3960: 0a 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a  .      case 'd':
3970: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   {.        if( !
3980: 69 73 64 69 67 69 74 28 7a 41 72 67 73 5b 31 5d  isdigit(zArgs[1]
3990: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
39a0: 65 6c 6c 54 6f 44 65 63 6f 64 65 20 3d 20 2d 31  ellToDecode = -1
39b0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
39c0: 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 54  .          cellT
39d0: 6f 44 65 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  oDecode = 0;.   
39e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73         while( is
39f0: 64 69 67 69 74 28 7a 41 72 67 73 5b 31 5d 29 20  digit(zArgs[1]) 
3a00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
3a10: 41 72 67 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Args++;.        
3a20: 20 20 20 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65      cellToDecode
3a30: 20 3d 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65 2a   = cellToDecode*
3a40: 31 30 20 2b 20 7a 41 72 67 73 5b 30 5d 20 2d 20  10 + zArgs[0] - 
3a50: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '0';.          }
3a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3a80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 41 72 67  }.    }.    zArg
3a90: 73 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  s++;.  }.  nCell
3aa0: 20 3d 20 61 5b 33 5d 2a 32 35 36 20 2b 20 61 5b   = a[3]*256 + a[
3ab0: 34 5d 3b 0a 20 20 69 43 65 6c 6c 50 74 72 20 3d  4];.  iCellPtr =
3ac0: 20 28 61 5b 30 5d 3d 3d 32 20 7c 7c 20 61 5b 30   (a[0]==2 || a[0
3ad0: 5d 3d 3d 35 29 20 3f 20 31 32 20 3a 20 38 3b 0a  ]==5) ? 12 : 8;.
3ae0: 20 20 69 66 28 20 63 65 6c 6c 54 6f 44 65 63 6f    if( cellToDeco
3af0: 64 65 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  de>=nCell ){.   
3b00: 20 70 72 69 6e 74 66 28 22 50 61 67 65 20 25 64   printf("Page %d
3b10: 20 68 61 73 20 6f 6e 6c 79 20 25 64 20 63 65 6c   has only %d cel
3b20: 6c 73 5c 6e 22 2c 20 70 67 6e 6f 2c 20 6e 43 65  ls\n", pgno, nCe
3b30: 6c 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ll);.    return;
3b40: 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 48  .  }.  printf("H
3b50: 65 61 64 65 72 20 6f 6e 20 62 74 72 65 65 20 70  eader on btree p
3b60: 61 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67 6e 6f  age %d:\n", pgno
3b70: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
3b80: 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 31 2c 20  e_line(a, 0, 1, 
3b90: 7a 54 79 70 65 29 3b 0a 20 20 70 72 69 6e 74 5f  zType);.  print_
3ba0: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 31  decode_line(a, 1
3bb0: 2c 20 32 2c 20 22 4f 66 66 73 65 74 20 74 6f 20  , 2, "Offset to 
3bc0: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 22  first freeblock"
3bd0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
3be0: 65 5f 6c 69 6e 65 28 61 2c 20 33 2c 20 32 2c 20  e_line(a, 3, 2, 
3bf0: 22 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73  "Number of cells
3c00: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 22 29 3b   on this page");
3c10: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
3c20: 6c 69 6e 65 28 61 2c 20 35 2c 20 32 2c 20 22 4f  line(a, 5, 2, "O
3c30: 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
3c40: 6e 74 65 6e 74 20 61 72 65 61 22 29 3b 0a 20 20  ntent area");.  
3c50: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
3c60: 65 28 61 2c 20 37 2c 20 31 2c 20 22 46 72 61 67  e(a, 7, 1, "Frag
3c70: 6d 65 6e 74 65 64 20 62 79 74 65 20 63 6f 75 6e  mented byte coun
3c80: 74 22 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3d  t");.  if( a[0]=
3c90: 3d 32 20 7c 7c 20 61 5b 30 5d 3d 3d 35 20 29 7b  =2 || a[0]==5 ){
3ca0: 0a 20 20 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  .    print_decod
3cb0: 65 5f 6c 69 6e 65 28 61 2c 20 38 2c 20 34 2c 20  e_line(a, 8, 4, 
3cc0: 22 52 69 67 68 74 20 63 68 69 6c 64 22 29 3b 0a  "Right child");.
3cd0: 20 20 7d 0a 20 20 69 66 28 20 63 65 6c 6c 54 6f    }.  if( cellTo
3ce0: 44 65 63 6f 64 65 3d 3d 28 2d 32 29 20 26 26 20  Decode==(-2) && 
3cf0: 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
3d00: 72 69 6e 74 66 28 22 20 6b 65 79 3a 20 6c 78 3d  rintf(" key: lx=
3d10: 6c 65 66 74 2d 63 68 69 6c 64 20 6e 3d 70 61 79  left-child n=pay
3d20: 6c 6f 61 64 2d 73 69 7a 65 20 72 3d 72 6f 77 69  load-size r=rowi
3d30: 64 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  d\n");.  }.  if(
3d40: 20 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20 20   showMap ){.    
3d50: 7a 4d 61 70 20 3d 20 6d 61 6c 6c 6f 63 28 70 61  zMap = malloc(pa
3d60: 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 6d 65 6d  gesize);.    mem
3d70: 73 65 74 28 7a 4d 61 70 2c 20 27 2e 27 2c 20 70  set(zMap, '.', p
3d80: 61 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 6d 65  agesize);.    me
3d90: 6d 73 65 74 28 7a 4d 61 70 2c 20 27 31 27 2c 20  mset(zMap, '1', 
3da0: 68 64 72 53 69 7a 65 29 3b 0a 20 20 20 20 6d 65  hdrSize);.    me
3db0: 6d 73 65 74 28 26 7a 4d 61 70 5b 68 64 72 53 69  mset(&zMap[hdrSi
3dc0: 7a 65 5d 2c 20 27 48 27 2c 20 69 43 65 6c 6c 50  ze], 'H', iCellP
3dd0: 74 72 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  tr);.    memset(
3de0: 26 7a 4d 61 70 5b 68 64 72 53 69 7a 65 2b 69 43  &zMap[hdrSize+iC
3df0: 65 6c 6c 50 74 72 5d 2c 20 27 50 27 2c 20 32 2a  ellPtr], 'P', 2*
3e00: 6e 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 66 6f  nCell);.  }.  fo
3e10: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
3e20: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 6f  i++){.    int co
3e30: 66 73 74 20 3d 20 69 43 65 6c 6c 50 74 72 20 2b  fst = iCellPtr +
3e40: 20 69 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a   i*2;.    char *
3e50: 7a 44 65 73 63 3b 0a 20 20 20 20 69 36 34 20 6e  zDesc;.    i64 n
3e60: 3b 0a 0a 20 20 20 20 63 6f 66 73 74 20 3d 20 61  ;..    cofst = a
3e70: 5b 63 6f 66 73 74 5d 2a 32 35 36 20 2b 20 61 5b  [cofst]*256 + a[
3e80: 63 6f 66 73 74 2b 31 5d 3b 0a 20 20 20 20 6e 20  cofst+1];.    n 
3e90: 3d 20 64 65 73 63 72 69 62 65 43 65 6c 6c 28 61  = describeCell(a
3ea0: 5b 30 5d 2c 20 26 61 5b 63 6f 66 73 74 2d 68 64  [0], &a[cofst-hd
3eb0: 72 53 69 7a 65 5d 2c 20 73 68 6f 77 43 65 6c 6c  rSize], showCell
3ec0: 43 6f 6e 74 65 6e 74 2c 20 26 7a 44 65 73 63 29  Content, &zDesc)
3ed0: 3b 0a 20 20 20 20 69 66 28 20 73 68 6f 77 4d 61  ;.    if( showMa
3ee0: 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  p ){.      char 
3ef0: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 20 20  zBuf[30];.      
3f00: 6d 65 6d 73 65 74 28 26 7a 4d 61 70 5b 63 6f 66  memset(&zMap[cof
3f10: 73 74 5d 2c 20 27 2a 27 2c 20 28 73 69 7a 65 5f  st], '*', (size_
3f20: 74 29 6e 29 3b 0a 20 20 20 20 20 20 7a 4d 61 70  t)n);.      zMap
3f30: 5b 63 6f 66 73 74 5d 20 3d 20 27 5b 27 3b 0a 20  [cofst] = '[';. 
3f40: 20 20 20 20 20 7a 4d 61 70 5b 63 6f 66 73 74 2b       zMap[cofst+
3f50: 6e 2d 31 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20  n-1] = ']';.    
3f60: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
3f70: 22 25 64 22 2c 20 69 29 3b 0a 20 20 20 20 20 20  "%d", i);.      
3f80: 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  j = (int)strlen(
3f90: 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 69 66 28  zBuf);.      if(
3fa0: 20 6a 3c 3d 6e 2d 32 20 29 20 6d 65 6d 63 70 79   j<=n-2 ) memcpy
3fb0: 28 26 7a 4d 61 70 5b 63 6f 66 73 74 2b 31 5d 2c  (&zMap[cofst+1],
3fc0: 20 7a 42 75 66 2c 20 6a 29 3b 0a 20 20 20 20 7d   zBuf, j);.    }
3fd0: 0a 20 20 20 20 69 66 28 20 63 65 6c 6c 54 6f 44  .    if( cellToD
3fe0: 65 63 6f 64 65 3d 3d 28 2d 32 29 20 29 7b 0a 20  ecode==(-2) ){. 
3ff0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 30       printf(" %0
4000: 33 78 3a 20 63 65 6c 6c 5b 25 64 5d 20 25 73 5c  3x: cell[%d] %s\
4010: 6e 22 2c 20 63 6f 66 73 74 2c 20 69 2c 20 7a 44  n", cofst, i, zD
4020: 65 73 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  esc);.    }else 
4030: 69 66 28 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65  if( cellToDecode
4040: 3d 3d 28 2d 31 29 20 7c 7c 20 63 65 6c 6c 54 6f  ==(-1) || cellTo
4050: 44 65 63 6f 64 65 3d 3d 69 20 29 7b 0a 20 20 20  Decode==i ){.   
4060: 20 20 20 64 65 63 6f 64 65 43 65 6c 6c 28 61 2c     decodeCell(a,
4070: 20 70 67 6e 6f 2c 20 69 2c 20 68 64 72 53 69 7a   pgno, i, hdrSiz
4080: 65 2c 20 63 6f 66 73 74 2d 68 64 72 53 69 7a 65  e, cofst-hdrSize
4090: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
40a0: 66 28 20 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20  f( showMap ){.  
40b0: 20 20 70 72 69 6e 74 66 28 22 50 61 67 65 20 6d    printf("Page m
40c0: 61 70 3a 20 20 28 48 3d 68 65 61 64 65 72 20 50  ap:  (H=header P
40d0: 3d 63 65 6c 6c 2d 69 6e 64 65 78 20 31 3d 70 61  =cell-index 1=pa
40e0: 67 65 2d 31 2d 68 65 61 64 65 72 20 2e 3d 66 72  ge-1-header .=fr
40f0: 65 65 2d 73 70 61 63 65 29 5c 6e 22 29 3b 0a 20  ee-space)\n");. 
4100: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 61     for(i=0; i<pa
4110: 67 65 73 69 7a 65 3b 20 69 2b 3d 36 34 29 7b 0a  gesize; i+=64){.
4120: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
4130: 30 33 78 3a 20 25 2e 36 34 73 5c 6e 22 2c 20 69  03x: %.64s\n", i
4140: 2c 20 26 7a 4d 61 70 5b 69 5d 29 3b 0a 20 20 20  , &zMap[i]);.   
4150: 20 7d 0a 20 20 20 20 66 72 65 65 28 7a 4d 61 70   }.    free(zMap
4160: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4170: 44 65 63 6f 64 65 20 61 20 66 72 65 65 6c 69 73  Decode a freelis
4180: 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 0a 2a 2f  t trunk page..*/
4190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63  .static void dec
41a0: 6f 64 65 5f 74 72 75 6e 6b 5f 70 61 67 65 28 0a  ode_trunk_page(.
41b0: 20 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20    int pgno,     
41c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
41d0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
41e0: 69 6e 74 20 70 61 67 65 73 69 7a 65 2c 20 20 20  int pagesize,   
41f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4200: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
4210: 69 6e 74 20 64 65 74 61 69 6c 2c 20 20 20 20 20  int detail,     
4220: 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 6c 65        /* Show le
4230: 61 66 20 70 61 67 65 73 20 69 66 20 74 72 75 65  af pages if true
4240: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 63 75 72 73   */.  int recurs
4250: 69 76 65 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ive         /* F
4260: 6f 6c 6c 6f 77 20 74 68 65 20 74 72 75 6e 6b 20  ollow the trunk 
4270: 63 68 61 6e 67 65 20 69 66 20 74 72 75 65 20 2a  change if true *
4280: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b  /.){.  int n, i;
4290: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
42a0: 20 2a 61 3b 0a 20 20 77 68 69 6c 65 28 20 70 67   *a;.  while( pg
42b0: 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 61 20 3d 20  no>0 ){.    a = 
42c0: 67 65 74 43 6f 6e 74 65 6e 74 28 28 70 67 6e 6f  getContent((pgno
42d0: 2d 31 29 2a 70 61 67 65 73 69 7a 65 2c 20 70 61  -1)*pagesize, pa
42e0: 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 70 72 69  gesize);.    pri
42f0: 6e 74 66 28 22 44 65 63 6f 64 65 20 6f 66 20 66  ntf("Decode of f
4300: 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
4310: 67 65 20 25 64 3a 5c 6e 22 2c 20 70 67 6e 6f 29  ge %d:\n", pgno)
4320: 3b 0a 20 20 20 20 70 72 69 6e 74 5f 64 65 63 6f  ;.    print_deco
4330: 64 65 5f 6c 69 6e 65 28 61 2c 20 30 2c 20 34 2c  de_line(a, 0, 4,
4340: 20 22 4e 65 78 74 20 66 72 65 65 6c 69 73 74 20   "Next freelist 
4350: 74 72 75 6e 6b 20 70 61 67 65 22 29 3b 0a 20 20  trunk page");.  
4360: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
4370: 69 6e 65 28 61 2c 20 34 2c 20 34 2c 20 22 4e 75  ine(a, 4, 4, "Nu
4380: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
4390: 6f 6e 20 74 68 69 73 20 70 61 67 65 22 29 3b 0a  on this page");.
43a0: 20 20 20 20 69 66 28 20 64 65 74 61 69 6c 20 29      if( detail )
43b0: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  {.      n = (int
43c0: 29 64 65 63 6f 64 65 49 6e 74 33 32 28 26 61 5b  )decodeInt32(&a[
43d0: 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
43e0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
43f0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
4400: 69 6e 74 20 78 20 3d 20 64 65 63 6f 64 65 49 6e  int x = decodeIn
4410: 74 33 32 28 26 61 5b 38 2b 34 2a 69 5d 29 3b 0a  t32(&a[8+4*i]);.
4420: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 49 64          char zId
4430: 78 5b 31 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  x[10];.        s
4440: 70 72 69 6e 74 66 28 7a 49 64 78 2c 20 22 5b 25  printf(zIdx, "[%
4450: 64 5d 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  d]", i);.       
4460: 20 70 72 69 6e 74 66 28 22 20 20 25 35 73 20 25   printf("  %5s %
4470: 37 75 22 2c 20 7a 49 64 78 2c 20 78 29 3b 0a 20  7u", zIdx, x);. 
4480: 20 20 20 20 20 20 20 69 66 28 20 69 25 35 3d 3d         if( i%5==
4490: 34 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29  4 ) printf("\n")
44a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
44b0: 69 66 28 20 69 25 35 21 3d 30 20 29 20 70 72 69  if( i%5!=0 ) pri
44c0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
44d0: 0a 20 20 20 20 69 66 28 20 21 72 65 63 75 72 73  .    if( !recurs
44e0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  ive ){.      pgn
44f0: 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  o = 0;.    }else
4500: 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 28  {.      pgno = (
4510: 69 6e 74 29 64 65 63 6f 64 65 49 6e 74 33 32 28  int)decodeInt32(
4520: 26 61 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  &a[0]);.    }.  
4530: 20 20 66 72 65 65 28 61 29 3b 0a 20 20 7d 0a 7d    free(a);.  }.}
4540: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 68 6f 72 74 20  ../*.** A short 
4550: 74 65 78 74 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  text comment on 
4560: 74 68 65 20 75 73 65 20 6f 66 20 65 61 63 68 20  the use of each 
4570: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
4580: 63 68 61 72 20 2a 2a 7a 50 61 67 65 55 73 65 3b  char **zPageUse;
4590: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 63 6f  ../*.** Add a co
45a0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 75 73 65  mment on the use
45b0: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2f 0a 73   of a page..*/.s
45c0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
45d0: 75 73 61 67 65 5f 6d 73 67 28 69 6e 74 20 70 67  usage_msg(int pg
45e0: 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  no, const char *
45f0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
4600: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
4610: 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20 20 76 61  har *zMsg;..  va
4620: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
4630: 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71  at);.  zMsg = sq
4640: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
4650: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
4660: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
4670: 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f   pgno<=0 || pgno
4680: 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 70  >mxPage ){.    p
4690: 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 70 61  rintf("ERROR: pa
46a0: 67 65 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e  ge %d out of ran
46b0: 67 65 20 31 2e 2e 25 64 3a 20 25 73 5c 6e 22 2c  ge 1..%d: %s\n",
46c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e  .            pgn
46d0: 6f 2c 20 6d 78 50 61 67 65 2c 20 7a 4d 73 67 29  o, mxPage, zMsg)
46e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
46f0: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 72 65  ee(zMsg);.    re
4700: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
4710: 7a 50 61 67 65 55 73 65 5b 70 67 6e 6f 5d 21 3d  zPageUse[pgno]!=
4720: 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  0 ){.    printf(
4730: 22 45 52 52 4f 52 3a 20 70 61 67 65 20 25 64 20  "ERROR: page %d 
4740: 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  used multiple ti
4750: 6d 65 73 3a 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a  mes:\n", pgno);.
4760: 20 20 20 20 70 72 69 6e 74 66 28 22 45 52 52 4f      printf("ERRO
4770: 52 3a 20 20 20 20 70 72 65 76 69 6f 75 73 3a 20  R:    previous: 
4780: 25 73 5c 6e 22 2c 20 7a 50 61 67 65 55 73 65 5b  %s\n", zPageUse[
4790: 70 67 6e 6f 5d 29 3b 0a 20 20 20 20 70 72 69 6e  pgno]);.    prin
47a0: 74 66 28 22 45 52 52 4f 52 3a 20 20 20 20 63 75  tf("ERROR:    cu
47b0: 72 72 65 6e 74 3a 20 20 25 73 5c 6e 22 2c 20 7a  rrent:  %s\n", z
47c0: 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
47d0: 33 5f 66 72 65 65 28 7a 50 61 67 65 55 73 65 5b  3_free(zPageUse[
47e0: 70 67 6e 6f 5d 29 3b 0a 20 20 7d 0a 20 20 7a 50  pgno]);.  }.  zP
47f0: 61 67 65 55 73 65 5b 70 67 6e 6f 5d 20 3d 20 7a  ageUse[pgno] = z
4800: 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Msg;.}../*.** Fi
4810: 6e 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nd overflow page
4820: 73 20 6f 66 20 61 20 63 65 6c 6c 20 61 6e 64 20  s of a cell and 
4830: 64 65 73 63 72 69 62 65 20 74 68 65 69 72 20 75  describe their u
4840: 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
4850: 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67 65 5f  void page_usage_
4860: 63 65 6c 6c 28 0a 20 20 75 6e 73 69 67 6e 65 64  cell(.  unsigned
4870: 20 63 68 61 72 20 63 54 79 70 65 2c 20 20 20 20   char cType,    
4880: 2f 2a 20 50 61 67 65 20 74 79 70 65 20 2a 2f 0a  /* Page type */.
4890: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
48a0: 2a 61 2c 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  *a,       /* Cel
48b0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
48c0: 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  nt pgno,        
48d0: 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 20 63         /* page c
48e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
48f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ll */.  int cell
4900: 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
4910: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
4920: 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
4930: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
4940: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69    int n = 0;.  i
4950: 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69  64 nPayload;.  i
4960: 36 34 20 72 6f 77 69 64 3b 0a 20 20 69 36 34 20  64 rowid;.  i64 
4970: 6e 4c 6f 63 61 6c 3b 0a 20 20 69 20 3d 20 30 3b  nLocal;.  i = 0;
4980: 0a 20 20 69 66 28 20 63 54 79 70 65 3c 3d 35 20  .  if( cType<=5 
4990: 29 7b 0a 20 20 20 20 61 20 2b 3d 20 34 3b 0a 20  ){.    a += 4;. 
49a0: 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20     n += 4;.  }. 
49b0: 20 69 66 28 20 63 54 79 70 65 21 3d 35 20 29 7b   if( cType!=5 ){
49c0: 0a 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56  .    i = decodeV
49d0: 61 72 69 6e 74 28 61 2c 20 26 6e 50 61 79 6c 6f  arint(a, &nPaylo
49e0: 61 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b  ad);.    a += i;
49f0: 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20  .    n += i;.   
4a00: 20 6e 4c 6f 63 61 6c 20 3d 20 6c 6f 63 61 6c 50   nLocal = localP
4a10: 61 79 6c 6f 61 64 28 6e 50 61 79 6c 6f 61 64 2c  ayload(nPayload,
4a20: 20 63 54 79 70 65 29 3b 0a 20 20 7d 65 6c 73 65   cType);.  }else
4a30: 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
4a40: 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 7d   nLocal = 0;.  }
4a50: 0a 20 20 69 66 28 20 63 54 79 70 65 3d 3d 35 20  .  if( cType==5 
4a60: 7c 7c 20 63 54 79 70 65 3d 3d 31 33 20 29 7b 0a  || cType==13 ){.
4a70: 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56 61      i = decodeVa
4a80: 72 69 6e 74 28 61 2c 20 26 72 6f 77 69 64 29 3b  rint(a, &rowid);
4a90: 0a 20 20 20 20 61 20 2b 3d 20 69 3b 0a 20 20 20  .    a += i;.   
4aa0: 20 6e 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 69   n += i;.  }.  i
4ab0: 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79 6c 6f  f( nLocal<nPaylo
4ac0: 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 76  ad ){.    int ov
4ad0: 66 6c 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32  fl = decodeInt32
4ae0: 28 61 2b 6e 4c 6f 63 61 6c 29 3b 0a 20 20 20 20  (a+nLocal);.    
4af0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
4b00: 20 77 68 69 6c 65 28 20 6f 76 66 6c 20 26 26 20   while( ovfl && 
4b10: 28 63 6e 74 2b 2b 29 3c 6d 78 50 61 67 65 20 29  (cnt++)<mxPage )
4b20: 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 75 73 61  {.      page_usa
4b30: 67 65 5f 6d 73 67 28 6f 76 66 6c 2c 20 22 6f 76  ge_msg(ovfl, "ov
4b40: 65 72 66 6c 6f 77 20 25 64 20 66 72 6f 6d 20 63  erflow %d from c
4b50: 65 6c 6c 20 25 64 20 6f 66 20 70 61 67 65 20 25  ell %d of page %
4b60: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
4b70: 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 63 65           cnt, ce
4b80: 6c 6c 6e 6f 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  llno, pgno);.   
4b90: 20 20 20 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e     a = getConten
4ba0: 74 28 28 6f 76 66 6c 2d 31 29 2a 70 61 67 65 73  t((ovfl-1)*pages
4bb0: 69 7a 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 6f  ize, 4);.      o
4bc0: 76 66 6c 20 3d 20 64 65 63 6f 64 65 49 6e 74 33  vfl = decodeInt3
4bd0: 32 28 61 29 3b 0a 20 20 20 20 20 20 66 72 65 65  2(a);.      free
4be0: 28 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  (a);.    }.  }.}
4bf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 63 72 69 62  .../*.** Describ
4c00: 65 20 74 68 65 20 75 73 61 67 65 73 20 6f 66 20  e the usages of 
4c10: 61 20 62 2d 74 72 65 65 20 70 61 67 65 0a 2a 2f  a b-tree page.*/
4c20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
4c30: 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28 0a 20  e_usage_btree(. 
4c40: 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20   int pgno,      
4c50: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
4c60: 6f 20 64 65 73 63 72 69 62 65 20 2a 2f 0a 20 20  o describe */.  
4c70: 69 6e 74 20 70 61 72 65 6e 74 2c 20 20 20 20 20  int parent,     
4c80: 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
4c90: 6f 66 20 74 68 69 73 20 70 61 67 65 2e 20 20 30  of this page.  0
4ca0: 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73 20   for root pages 
4cb0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20  */.  int idx,   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
4cd0: 69 63 68 20 63 68 69 6c 64 20 6f 66 20 74 68 65  ich child of the
4ce0: 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e   parent */.  con
4cf0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
4d00: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4d10: 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
4d20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
4d30: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4d40: 7a 54 79 70 65 20 3d 20 22 63 6f 72 72 75 70 74  zType = "corrupt
4d50: 20 6e 6f 64 65 22 3b 0a 20 20 69 6e 74 20 6e 43   node";.  int nC
4d60: 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ell;.  int i;.  
4d70: 69 6e 74 20 68 64 72 20 3d 20 70 67 6e 6f 3d 3d  int hdr = pgno==
4d80: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 0a 20 20  1 ? 100 : 0;..  
4d90: 69 66 28 20 70 67 6e 6f 3c 3d 30 20 7c 7c 20 70  if( pgno<=0 || p
4da0: 67 6e 6f 3e 6d 78 50 61 67 65 20 29 20 72 65 74  gno>mxPage ) ret
4db0: 75 72 6e 3b 0a 20 20 61 20 3d 20 67 65 74 43 6f  urn;.  a = getCo
4dc0: 6e 74 65 6e 74 28 28 70 67 6e 6f 2d 31 29 2a 70  ntent((pgno-1)*p
4dd0: 61 67 65 73 69 7a 65 2c 20 70 61 67 65 73 69 7a  agesize, pagesiz
4de0: 65 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61 5b  e);.  switch( a[
4df0: 68 64 72 5d 20 29 7b 0a 20 20 20 20 63 61 73 65  hdr] ){.    case
4e00: 20 32 3a 20 20 7a 54 79 70 65 20 3d 20 22 69 6e   2:  zType = "in
4e10: 74 65 72 69 6f 72 20 6e 6f 64 65 20 6f 66 20 69  terior node of i
4e20: 6e 64 65 78 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ndex";  break;. 
4e30: 20 20 20 63 61 73 65 20 35 3a 20 20 7a 54 79 70     case 5:  zTyp
4e40: 65 20 3d 20 22 69 6e 74 65 72 69 6f 72 20 6e 6f  e = "interior no
4e50: 64 65 20 6f 66 20 74 61 62 6c 65 22 3b 20 20 62  de of table";  b
4e60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31  reak;.    case 1
4e70: 30 3a 20 7a 54 79 70 65 20 3d 20 22 6c 65 61 66  0: zType = "leaf
4e80: 20 6f 66 20 69 6e 64 65 78 22 3b 20 20 20 20 20   of index";     
4e90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ea0: 20 63 61 73 65 20 31 33 3a 20 7a 54 79 70 65 20   case 13: zType 
4eb0: 3d 20 22 6c 65 61 66 20 6f 66 20 74 61 62 6c 65  = "leaf of table
4ec0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
4ed0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61  ak;.  }.  if( pa
4ee0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 70 61 67 65  rent ){.    page
4ef0: 5f 75 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f 2c  _usage_msg(pgno,
4f00: 20 22 25 73 20 5b 25 73 5d 2c 20 63 68 69 6c 64   "%s [%s], child
4f10: 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c   %d of page %d",
4f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f30: 20 20 20 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65      zType, zName
4f40: 2c 20 69 64 78 2c 20 70 61 72 65 6e 74 29 3b 0a  , idx, parent);.
4f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 67    }else{.    pag
4f60: 65 5f 75 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f  e_usage_msg(pgno
4f70: 2c 20 22 72 6f 6f 74 20 25 73 20 5b 25 73 5d 22  , "root %s [%s]"
4f80: 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 29 3b  , zType, zName);
4f90: 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 61  .  }.  nCell = a
4fa0: 5b 68 64 72 2b 33 5d 2a 32 35 36 20 2b 20 61 5b  [hdr+3]*256 + a[
4fb0: 68 64 72 2b 34 5d 3b 0a 20 20 69 66 28 20 61 5b  hdr+4];.  if( a[
4fc0: 68 64 72 5d 3d 3d 32 20 7c 7c 20 61 5b 68 64 72  hdr]==2 || a[hdr
4fd0: 5d 3d 3d 35 20 29 7b 0a 20 20 20 20 69 6e 74 20  ]==5 ){.    int 
4fe0: 63 65 6c 6c 73 74 61 72 74 20 3d 20 68 64 72 2b  cellstart = hdr+
4ff0: 31 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  12;.    unsigned
5000: 20 69 6e 74 20 63 68 69 6c 64 3b 0a 20 20 20 20   int child;.    
5010: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
5020: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
5030: 74 20 6f 66 73 74 3b 0a 0a 20 20 20 20 20 20 6f  t ofst;..      o
5040: 66 73 74 20 3d 20 63 65 6c 6c 73 74 61 72 74 20  fst = cellstart 
5050: 2b 20 69 2a 32 3b 0a 20 20 20 20 20 20 6f 66 73  + i*2;.      ofs
5060: 74 20 3d 20 61 5b 6f 66 73 74 5d 2a 32 35 36 20  t = a[ofst]*256 
5070: 2b 20 61 5b 6f 66 73 74 2b 31 5d 3b 0a 20 20 20  + a[ofst+1];.   
5080: 20 20 20 63 68 69 6c 64 20 3d 20 64 65 63 6f 64     child = decod
5090: 65 49 6e 74 33 32 28 61 2b 6f 66 73 74 29 3b 0a  eInt32(a+ofst);.
50a0: 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67 65        page_usage
50b0: 5f 62 74 72 65 65 28 63 68 69 6c 64 2c 20 70 67  _btree(child, pg
50c0: 6e 6f 2c 20 69 2c 20 7a 4e 61 6d 65 29 3b 0a 20  no, i, zName);. 
50d0: 20 20 20 7d 0a 20 20 20 20 63 68 69 6c 64 20 3d     }.    child =
50e0: 20 64 65 63 6f 64 65 49 6e 74 33 32 28 61 2b 63   decodeInt32(a+c
50f0: 65 6c 6c 73 74 61 72 74 2d 34 29 3b 0a 20 20 20  ellstart-4);.   
5100: 20 70 61 67 65 5f 75 73 61 67 65 5f 62 74 72 65   page_usage_btre
5110: 65 28 63 68 69 6c 64 2c 20 70 67 6e 6f 2c 20 69  e(child, pgno, i
5120: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , zName);.  }.  
5130: 69 66 28 20 61 5b 68 64 72 5d 3d 3d 32 20 7c 7c  if( a[hdr]==2 ||
5140: 20 61 5b 68 64 72 5d 3d 3d 31 30 20 7c 7c 20 61   a[hdr]==10 || a
5150: 5b 68 64 72 5d 3d 3d 31 33 20 29 7b 0a 20 20 20  [hdr]==13 ){.   
5160: 20 69 6e 74 20 63 65 6c 6c 73 74 61 72 74 20 3d   int cellstart =
5170: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 61 5b   hdr + 8 + 4*(a[
5180: 68 64 72 5d 3c 3d 35 29 3b 0a 20 20 20 20 66 6f  hdr]<=5);.    fo
5190: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
51a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
51b0: 6f 66 73 74 3b 0a 20 20 20 20 20 20 6f 66 73 74  ofst;.      ofst
51c0: 20 3d 20 63 65 6c 6c 73 74 61 72 74 20 2b 20 69   = cellstart + i
51d0: 2a 32 3b 0a 20 20 20 20 20 20 6f 66 73 74 20 3d  *2;.      ofst =
51e0: 20 61 5b 6f 66 73 74 5d 2a 32 35 36 20 2b 20 61   a[ofst]*256 + a
51f0: 5b 6f 66 73 74 2b 31 5d 3b 0a 20 20 20 20 20 20  [ofst+1];.      
5200: 70 61 67 65 5f 75 73 61 67 65 5f 63 65 6c 6c 28  page_usage_cell(
5210: 61 5b 68 64 72 5d 2c 20 61 2b 6f 66 73 74 2c 20  a[hdr], a+ofst, 
5220: 70 67 6e 6f 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  pgno, i);.    }.
5230: 20 20 7d 0a 20 20 66 72 65 65 28 61 29 3b 0a 7d    }.  free(a);.}
5240: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
5250: 65 20 70 61 67 65 20 75 73 61 67 65 20 62 79 20  e page usage by 
5260: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 2a 2f 0a  the freelist.*/.
5270: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5280: 5f 75 73 61 67 65 5f 66 72 65 65 6c 69 73 74 28  _usage_freelist(
5290: 69 6e 74 20 70 67 6e 6f 29 7b 0a 20 20 75 6e 73  int pgno){.  uns
52a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20  igned char *a;. 
52b0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
52c0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a  int i;.  int n;.
52d0: 20 20 69 6e 74 20 69 4e 65 78 74 3b 0a 20 20 69    int iNext;.  i
52e0: 6e 74 20 70 61 72 65 6e 74 20 3d 20 31 3b 0a 0a  nt parent = 1;..
52f0: 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 3e 30 20    while( pgno>0 
5300: 26 26 20 70 67 6e 6f 3c 3d 6d 78 50 61 67 65 20  && pgno<=mxPage 
5310: 26 26 20 28 63 6e 74 2b 2b 29 3c 6d 78 50 61 67  && (cnt++)<mxPag
5320: 65 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 75 73  e ){.    page_us
5330: 61 67 65 5f 6d 73 67 28 70 67 6e 6f 2c 20 22 66  age_msg(pgno, "f
5340: 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 23 25  reelist trunk #%
5350: 64 20 63 68 69 6c 64 20 6f 66 20 25 64 22 2c 20  d child of %d", 
5360: 63 6e 74 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  cnt, parent);.  
5370: 20 20 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74    a = getContent
5380: 28 28 70 67 6e 6f 2d 31 29 2a 70 61 67 65 73 69  ((pgno-1)*pagesi
5390: 7a 65 2c 20 70 61 67 65 73 69 7a 65 29 3b 0a 20  ze, pagesize);. 
53a0: 20 20 20 69 4e 65 78 74 20 3d 20 64 65 63 6f 64     iNext = decod
53b0: 65 49 6e 74 33 32 28 61 29 3b 0a 20 20 20 20 6e  eInt32(a);.    n
53c0: 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32 28 61   = decodeInt32(a
53d0: 2b 34 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  +4);.    for(i=0
53e0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
53f0: 20 20 20 69 6e 74 20 63 68 69 6c 64 20 3d 20 64     int child = d
5400: 65 63 6f 64 65 49 6e 74 33 32 28 61 20 2b 20 28  ecodeInt32(a + (
5410: 69 2a 34 2b 38 29 29 3b 0a 20 20 20 20 20 20 70  i*4+8));.      p
5420: 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 63 68  age_usage_msg(ch
5430: 69 6c 64 2c 20 22 66 72 65 65 6c 69 73 74 20 6c  ild, "freelist l
5440: 65 61 66 2c 20 63 68 69 6c 64 20 25 64 20 6f 66  eaf, child %d of
5450: 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 22 2c   trunk page %d",
5460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5470: 20 20 20 20 20 20 69 2c 20 70 67 6e 6f 29 3b 0a        i, pgno);.
5480: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 61      }.    free(a
5490: 29 3b 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20  );.    parent = 
54a0: 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  pgno;.    pgno =
54b0: 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   iNext;.  }.}../
54c0: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 70  *.** Determine p
54d0: 61 67 65 73 20 75 73 65 64 20 61 73 20 50 54 52  ages used as PTR
54e0: 4d 41 50 20 70 61 67 65 73 0a 2a 2f 0a 73 74 61  MAP pages.*/.sta
54f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 75 73  tic void page_us
5500: 61 67 65 5f 70 74 72 6d 61 70 28 75 6e 73 69 67  age_ptrmap(unsig
5510: 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20  ned char *a){.  
5520: 69 66 28 20 61 5b 35 35 5d 20 29 7b 0a 20 20 20  if( a[55] ){.   
5530: 20 69 6e 74 20 75 73 61 62 6c 65 20 3d 20 70 61   int usable = pa
5540: 67 65 73 69 7a 65 20 2d 20 61 5b 32 30 5d 3b 0a  gesize - a[20];.
5550: 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 32      int pgno = 2
5560: 3b 0a 20 20 20 20 69 6e 74 20 70 65 72 50 61 67  ;.    int perPag
5570: 65 20 3d 20 75 73 61 62 6c 65 2f 35 3b 0a 20 20  e = usable/5;.  
5580: 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 3c 3d 6d    while( pgno<=m
5590: 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 70  xPage ){.      p
55a0: 61 67 65 5f 75 73 61 67 65 5f 6d 73 67 28 70 67  age_usage_msg(pg
55b0: 6e 6f 2c 20 22 50 54 52 4d 41 50 20 70 61 67 65  no, "PTRMAP page
55c0: 20 63 6f 76 65 72 69 6e 67 20 25 64 2e 2e 25 64   covering %d..%d
55d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 67                pg
55f0: 6e 6f 2b 31 2c 20 70 67 6e 6f 2b 70 65 72 50 61  no+1, pgno+perPa
5600: 67 65 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ge);.      pgno 
5610: 2b 3d 20 70 65 72 50 61 67 65 20 2b 20 31 3b 0a  += perPage + 1;.
5620: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
5630: 2a 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65  ** Try to figure
5640: 20 6f 75 74 20 68 6f 77 20 65 76 65 72 79 20 70   out how every p
5650: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
5660: 61 73 65 20 66 69 6c 65 20 69 73 20 62 65 69 6e  ase file is bein
5670: 67 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  g used..*/.stati
5680: 63 20 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67  c void page_usag
5690: 65 5f 72 65 70 6f 72 74 28 63 6f 6e 73 74 20 63  e_report(const c
56a0: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
56b0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
56c0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
56d0: 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  db;.  sqlite3_st
56e0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 75 6e 73  mt *pStmt;.  uns
56f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20  igned char *a;. 
5700: 20 63 68 61 72 20 7a 51 75 65 72 79 5b 32 30 30   char zQuery[200
5710: 5d 3b 0a 0a 20 20 2f 2a 20 41 76 6f 69 64 20 74  ];..  /* Avoid t
5720: 68 65 20 70 61 74 68 6f 6c 6f 67 69 63 61 6c 20  he pathological 
5730: 63 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 6d 78  case */.  if( mx
5740: 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 70 72  Page<1 ){.    pr
5750: 69 6e 74 66 28 22 65 6d 70 74 79 20 64 61 74 61  intf("empty data
5760: 62 61 73 65 5c 6e 22 29 3b 0a 20 20 20 20 72 65  base\n");.    re
5770: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
5780: 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
5790: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 72 63 20 3d  e file */.  rc =
57a0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
57b0: 62 4e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 69  bName, &db);.  i
57c0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 72 69  f( rc ){.    pri
57d0: 6e 74 66 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  ntf("cannot open
57e0: 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22   database: %s\n"
57f0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
5800: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
5810: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
5820: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
5830: 20 2f 2a 20 53 65 74 20 75 70 20 67 6c 6f 62 61   /* Set up globa
5840: 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 50 61 67  l variables zPag
5850: 65 55 73 65 5b 5d 20 61 6e 64 20 6d 78 50 61 67  eUse[] and mxPag
5860: 65 20 74 6f 20 72 65 63 6f 72 64 20 70 61 67 65  e to record page
5870: 0a 20 20 2a 2a 20 75 73 61 67 65 73 20 2a 2f 0a  .  ** usages */.
5880: 20 20 7a 50 61 67 65 55 73 65 20 3d 20 73 71 6c    zPageUse = sql
5890: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
58a0: 65 6f 66 28 7a 50 61 67 65 55 73 65 5b 30 5d 29  eof(zPageUse[0])
58b0: 2a 28 6d 78 50 61 67 65 2b 31 29 20 29 3b 0a 20  *(mxPage+1) );. 
58c0: 20 69 66 28 20 7a 50 61 67 65 55 73 65 3d 3d 30   if( zPageUse==0
58d0: 20 29 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79   ) out_of_memory
58e0: 28 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 50 61  ();.  memset(zPa
58f0: 67 65 55 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  geUse, 0, sizeof
5900: 28 7a 50 61 67 65 55 73 65 5b 30 5d 29 2a 28 6d  (zPageUse[0])*(m
5910: 78 50 61 67 65 2b 31 29 29 3b 0a 0a 20 20 2f 2a  xPage+1));..  /*
5920: 20 44 69 73 63 6f 76 65 72 20 74 68 65 20 75 73   Discover the us
5930: 61 67 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  age of each page
5940: 20 2a 2f 0a 20 20 61 20 3d 20 67 65 74 43 6f 6e   */.  a = getCon
5950: 74 65 6e 74 28 30 2c 20 31 30 30 29 3b 0a 20 20  tent(0, 100);.  
5960: 70 61 67 65 5f 75 73 61 67 65 5f 66 72 65 65 6c  page_usage_freel
5970: 69 73 74 28 64 65 63 6f 64 65 49 6e 74 33 32 28  ist(decodeInt32(
5980: 61 2b 33 32 29 29 3b 0a 20 20 70 61 67 65 5f 75  a+32));.  page_u
5990: 73 61 67 65 5f 70 74 72 6d 61 70 28 61 29 3b 0a  sage_ptrmap(a);.
59a0: 20 20 66 72 65 65 28 61 29 3b 0a 20 20 70 61 67    free(a);.  pag
59b0: 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28 31 2c  e_usage_btree(1,
59c0: 20 30 2c 20 30 2c 20 22 73 71 6c 69 74 65 5f 6d   0, 0, "sqlite_m
59d0: 61 73 74 65 72 22 29 3b 0a 20 20 73 71 6c 69 74  aster");.  sqlit
59e0: 65 33 5f 65 78 65 63 28 64 62 2c 20 22 50 52 41  e3_exec(db, "PRA
59f0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
5a00: 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30  ema=ON", 0, 0, 0
5a10: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
5a20: 32 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  2; j++){.    sql
5a30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5a40: 7a 65 6f 66 28 7a 51 75 65 72 79 29 2c 20 7a 51  zeof(zQuery), zQ
5a50: 75 65 72 79 2c 0a 20 20 20 20 20 20 20 20 20 20  uery,.          
5a60: 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65 2c     "SELECT type,
5a70: 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 20   name, rootpage 
5a80: 46 52 4f 4d 20 53 51 4c 49 54 45 5f 4d 41 53 54  FROM SQLITE_MAST
5a90: 45 52 20 57 48 45 52 45 20 72 6f 6f 74 70 61 67  ER WHERE rootpag
5aa0: 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
5ab0: 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  " ORDER BY rowid
5ac0: 20 25 73 22 2c 20 6a 3f 22 44 45 53 43 22 3a 22   %s", j?"DESC":"
5ad0: 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ");.    rc = sql
5ae0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
5af0: 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
5b00: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
5b10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b20: 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  K ){.      while
5b30: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
5b40: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
5b50: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  W ){.        int
5b60: 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f   pgno = sqlite3_
5b70: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
5b80: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 70 61  , 2);.        pa
5b90: 67 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28 70  ge_usage_btree(p
5ba0: 67 6e 6f 2c 20 30 2c 20 30 2c 20 28 63 6f 6e 73  gno, 0, 0, (cons
5bb0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
5bc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
5bd0: 74 2c 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t,1));.      }. 
5be0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5bf0: 70 72 69 6e 74 66 28 22 45 52 52 4f 52 3a 20 63  printf("ERROR: c
5c00: 61 6e 6e 6f 74 20 71 75 65 72 79 20 64 61 74 61  annot query data
5c10: 62 61 73 65 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  base: %s\n", sql
5c20: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
5c30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5c40: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
5c50: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
5c60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5c70: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73  ) break;.  }.  s
5c80: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
5c90: 3b 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 74 68  ;..  /* Print th
5ca0: 65 20 72 65 70 6f 72 74 20 61 6e 64 20 66 72 65  e report and fre
5cb0: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f  e memory used */
5cc0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6d  .  for(i=1; i<=m
5cd0: 78 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  xPage; i++){.   
5ce0: 20 70 72 69 6e 74 66 28 22 25 35 64 3a 20 25 73   printf("%5d: %s
5cf0: 5c 6e 22 2c 20 69 2c 20 7a 50 61 67 65 55 73 65  \n", i, zPageUse
5d00: 5b 69 5d 20 3f 20 7a 50 61 67 65 55 73 65 5b 69  [i] ? zPageUse[i
5d10: 5d 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20 20 20 20  ] : "???");.    
5d20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
5d30: 67 65 55 73 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20  geUse[i]);.  }. 
5d40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
5d50: 61 67 65 55 73 65 29 3b 0a 20 20 7a 50 61 67 65  ageUse);.  zPage
5d60: 55 73 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Use = 0;.}../*.*
5d70: 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
5d80: 6f 75 74 20 68 6f 77 20 65 76 65 72 79 20 70 61  out how every pa
5d90: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
5da0: 73 65 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  se file is being
5db0: 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
5dc0: 20 76 6f 69 64 20 70 74 72 6d 61 70 5f 63 6f 76   void ptrmap_cov
5dd0: 65 72 61 67 65 5f 72 65 70 6f 72 74 28 63 6f 6e  erage_report(con
5de0: 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
5df0: 29 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20  ){.  int pgno;. 
5e00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5e10: 61 48 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  aHdr;.  unsigned
5e20: 20 63 68 61 72 20 2a 61 3b 0a 20 20 69 6e 74 20   char *a;.  int 
5e30: 75 73 61 62 6c 65 3b 0a 20 20 69 6e 74 20 70 65  usable;.  int pe
5e40: 72 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  rPage;.  int i;.
5e50: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 74 68 65 20  .  /* Avoid the 
5e60: 70 61 74 68 6f 6c 6f 67 69 63 61 6c 20 63 61 73  pathological cas
5e70: 65 20 2a 2f 0a 20 20 69 66 28 20 6d 78 50 61 67  e */.  if( mxPag
5e80: 65 3c 31 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  e<1 ){.    print
5e90: 66 28 22 65 6d 70 74 79 20 64 61 74 61 62 61 73  f("empty databas
5ea0: 65 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  e\n");.    retur
5eb0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
5ec0: 65 20 73 75 72 65 20 50 54 52 4d 41 50 73 20 61  e sure PTRMAPs a
5ed0: 72 65 20 75 73 65 64 20 69 6e 20 74 68 69 73 20  re used in this 
5ee0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 48  database */.  aH
5ef0: 64 72 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28  dr = getContent(
5f00: 30 2c 20 31 30 30 29 3b 0a 20 20 69 66 28 20 61  0, 100);.  if( a
5f10: 48 64 72 5b 35 35 5d 3d 3d 30 20 29 7b 0a 20 20  Hdr[55]==0 ){.  
5f20: 20 20 70 72 69 6e 74 66 28 22 64 61 74 61 62 61    printf("databa
5f30: 73 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  se does not use 
5f40: 50 54 52 4d 41 50 20 70 61 67 65 73 5c 6e 22 29  PTRMAP pages\n")
5f50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5f60: 7d 0a 20 20 75 73 61 62 6c 65 20 3d 20 70 61 67  }.  usable = pag
5f70: 65 73 69 7a 65 20 2d 20 61 48 64 72 5b 32 30 5d  esize - aHdr[20]
5f80: 3b 0a 20 20 70 65 72 50 61 67 65 20 3d 20 75 73  ;.  perPage = us
5f90: 61 62 6c 65 2f 35 3b 0a 20 20 66 72 65 65 28 61  able/5;.  free(a
5fa0: 48 64 72 29 3b 0a 20 20 70 72 69 6e 74 66 28 22  Hdr);.  printf("
5fb0: 25 35 64 3a 20 72 6f 6f 74 20 6f 66 20 73 71 6c  %5d: root of sql
5fc0: 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 2c 20 31  ite_master\n", 1
5fd0: 29 3b 0a 20 20 66 6f 72 28 70 67 6e 6f 3d 32 3b  );.  for(pgno=2;
5fe0: 20 70 67 6e 6f 3c 3d 6d 78 50 61 67 65 3b 20 70   pgno<=mxPage; p
5ff0: 67 6e 6f 20 2b 3d 20 70 65 72 50 61 67 65 2b 31  gno += perPage+1
6000: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  ){.    printf("%
6010: 35 64 3a 20 50 54 52 4d 41 50 20 70 61 67 65 20  5d: PTRMAP page 
6020: 63 6f 76 65 72 69 6e 67 20 25 64 2e 2e 25 64 5c  covering %d..%d\
6030: 6e 22 2c 20 70 67 6e 6f 2c 0a 20 20 20 20 20 20  n", pgno,.      
6040: 20 20 20 20 20 70 67 6e 6f 2b 31 2c 20 70 67 6e       pgno+1, pgn
6050: 6f 2b 70 65 72 50 61 67 65 29 3b 0a 20 20 20 20  o+perPage);.    
6060: 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74 28 28  a = getContent((
6070: 70 67 6e 6f 2d 31 29 2a 70 61 67 65 73 69 7a 65  pgno-1)*pagesize
6080: 2c 20 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 66  , usable);.    f
6090: 6f 72 28 69 3d 30 3b 20 69 2b 35 3c 3d 75 73 61  or(i=0; i+5<=usa
60a0: 62 6c 65 20 26 26 20 70 67 6e 6f 2b 31 2b 69 2f  ble && pgno+1+i/
60b0: 35 3c 3d 6d 78 50 61 67 65 3b 20 69 2b 3d 35 29  5<=mxPage; i+=5)
60c0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
60d0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 3f 3f 3f  ar *zType = "???
60e0: 22 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  ";.      unsigne
60f0: 64 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20 64 65  d int iFrom = de
6100: 63 6f 64 65 49 6e 74 33 32 28 26 61 5b 69 2b 31  codeInt32(&a[i+1
6110: 5d 29 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  ]);.      switch
6120: 28 20 61 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ( a[i] ){.      
6130: 20 20 63 61 73 65 20 31 3a 20 20 7a 54 79 70 65    case 1:  zType
6140: 20 3d 20 22 62 2d 74 72 65 65 20 72 6f 6f 74 20   = "b-tree root 
6150: 70 61 67 65 22 3b 20 20 20 20 20 20 20 20 62 72  page";        br
6160: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
6170: 65 20 32 3a 20 20 7a 54 79 70 65 20 3d 20 22 66  e 2:  zType = "f
6180: 72 65 65 6c 69 73 74 20 70 61 67 65 22 3b 20 20  reelist page";  
6190: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
61a0: 20 20 20 20 20 20 20 20 63 61 73 65 20 33 3a 20          case 3: 
61b0: 20 7a 54 79 70 65 20 3d 20 22 66 69 72 73 74 20   zType = "first 
61c0: 70 61 67 65 20 6f 66 20 6f 76 65 72 66 6c 6f 77  page of overflow
61d0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
61e0: 20 20 20 63 61 73 65 20 34 3a 20 20 7a 54 79 70     case 4:  zTyp
61f0: 65 20 3d 20 22 6c 61 74 65 72 20 70 61 67 65 20  e = "later page 
6200: 6f 66 20 6f 76 65 72 66 6c 6f 77 22 3b 20 20 62  of overflow";  b
6210: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
6220: 73 65 20 35 3a 20 20 7a 54 79 70 65 20 3d 20 22  se 5:  zType = "
6230: 62 2d 74 72 65 65 20 6e 6f 6e 2d 72 6f 6f 74 20  b-tree non-root 
6240: 70 61 67 65 22 3b 20 20 20 20 62 72 65 61 6b 3b  page";    break;
6250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
6260: 72 69 6e 74 66 28 22 25 35 64 3a 20 25 73 2c 20  rintf("%5d: %s, 
6270: 70 61 72 65 6e 74 3d 25 75 5c 6e 22 2c 20 70 67  parent=%u\n", pg
6280: 6e 6f 2b 31 2b 69 2f 35 2c 20 7a 54 79 70 65 2c  no+1+i/5, zType,
6290: 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 0a 20   iFrom);.    }. 
62a0: 20 20 20 66 72 65 65 28 61 29 3b 0a 20 20 7d 0a     free(a);.  }.
62b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
62c0: 20 75 73 61 67 65 20 63 6f 6d 6d 65 6e 74 0a 2a   usage comment.*
62d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  /.static void us
62e0: 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  age(const char *
62f0: 61 72 67 76 30 29 7b 0a 20 20 66 70 72 69 6e 74  argv0){.  fprint
6300: 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
6310: 20 25 73 20 46 49 4c 45 4e 41 4d 45 20 3f 61 72   %s FILENAME ?ar
6320: 67 73 2e 2e 2e 3f 5c 6e 5c 6e 22 2c 20 61 72 67  gs...?\n\n", arg
6330: 76 30 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  v0);.  fprintf(s
6340: 74 64 65 72 72 2c 0a 20 20 20 20 22 61 72 67 73  tderr,.    "args
6350: 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 64 62  :\n".    "    db
6360: 68 65 61 64 65 72 20 20 20 20 20 20 20 20 53 68  header        Sh
6370: 6f 77 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ow database head
6380: 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 70  er\n".    "    p
6390: 67 69 64 78 20 20 20 20 20 20 20 20 20 20 20 49  gidx           I
63a0: 6e 64 65 78 20 6f 66 20 68 6f 77 20 65 61 63 68  ndex of how each
63b0: 20 70 61 67 65 20 69 73 20 75 73 65 64 5c 6e 22   page is used\n"
63c0: 0a 20 20 20 20 22 20 20 20 20 70 74 72 6d 61 70  .    "    ptrmap
63d0: 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 61            Show a
63e0: 6c 6c 20 50 54 52 4d 41 50 20 70 61 67 65 20 63  ll PTRMAP page c
63f0: 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 22 20  ontent\n".    " 
6400: 20 20 20 4e 4e 4e 2e 2e 4d 4d 4d 20 20 20 20 20     NNN..MMM     
6410: 20 20 20 53 68 6f 77 20 68 65 78 20 6f 66 20 70     Show hex of p
6420: 61 67 65 73 20 4e 4e 4e 20 74 68 72 6f 75 67 68  ages NNN through
6430: 20 4d 4d 4d 5c 6e 22 0a 20 20 20 20 22 20 20 20   MMM\n".    "   
6440: 20 4e 4e 4e 2e 2e 65 6e 64 20 20 20 20 20 20 20   NNN..end       
6450: 20 53 68 6f 77 20 68 65 78 20 6f 66 20 70 61 67   Show hex of pag
6460: 65 73 20 4e 4e 4e 20 74 68 72 6f 75 67 68 20 65  es NNN through e
6470: 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 0a 20 20  nd of file\n".  
6480: 20 20 22 20 20 20 20 4e 4e 4e 62 20 20 20 20 20    "    NNNb     
6490: 20 20 20 20 20 20 20 44 65 63 6f 64 65 20 62 74         Decode bt
64a0: 72 65 65 20 70 61 67 65 20 4e 4e 4e 5c 6e 22 0a  ree page NNN\n".
64b0: 20 20 20 20 22 20 20 20 20 4e 4e 4e 62 63 20 20      "    NNNbc  
64c0: 20 20 20 20 20 20 20 20 20 44 65 63 6f 64 65 20           Decode 
64d0: 62 74 72 65 65 20 70 61 67 65 20 4e 4e 4e 20 61  btree page NNN a
64e0: 6e 64 20 73 68 6f 77 20 63 6f 6e 74 65 6e 74 5c  nd show content\
64f0: 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 62  n".    "    NNNb
6500: 6d 20 20 20 20 20 20 20 20 20 20 20 44 65 63 6f  m           Deco
6510: 64 65 20 62 74 72 65 65 20 70 61 67 65 20 4e 4e  de btree page NN
6520: 4e 20 61 6e 64 20 73 68 6f 77 20 61 20 6c 61 79  N and show a lay
6530: 6f 75 74 20 6d 61 70 5c 6e 22 0a 20 20 20 20 22  out map\n".    "
6540: 20 20 20 20 4e 4e 4e 62 64 43 43 43 20 20 20 20      NNNbdCCC    
6550: 20 20 20 20 44 65 63 6f 64 65 20 63 65 6c 6c 20      Decode cell 
6560: 43 43 43 20 6f 6e 20 62 74 72 65 65 20 70 61 67  CCC on btree pag
6570: 65 20 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22 20 20  e NNN\n".    "  
6580: 20 20 4e 4e 4e 74 20 20 20 20 20 20 20 20 20 20    NNNt          
6590: 20 20 44 65 63 6f 64 65 20 66 72 65 65 6c 69 73    Decode freelis
65a0: 74 20 74 72 75 6e 6b 20 70 61 67 65 20 4e 4e 4e  t trunk page NNN
65b0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e  \n".    "    NNN
65c0: 74 64 20 20 20 20 20 20 20 20 20 20 20 53 68 6f  td           Sho
65d0: 77 20 6c 65 61 66 20 66 72 65 65 6c 69 73 74 20  w leaf freelist 
65e0: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 64 65 63  pages on the dec
65f0: 6f 64 65 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ode\n".    "    
6600: 4e 4e 4e 74 72 20 20 20 20 20 20 20 20 20 20 20  NNNtr           
6610: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 63 6f  Recursively deco
6620: 64 65 20 66 72 65 65 6c 69 73 74 20 73 74 61 72  de freelist star
6630: 74 69 6e 67 20 61 74 20 4e 4e 4e 5c 6e 22 0a 20  ting at NNN\n". 
6640: 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28   );.}..int main(
6650: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
6660: 2a 61 72 67 76 29 7b 0a 20 20 73 74 72 75 63 74  *argv){.  struct
6670: 20 73 74 61 74 20 73 62 75 66 3b 0a 20 20 75 6e   stat sbuf;.  un
6680: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 50 67 53  signed char zPgS
6690: 7a 5b 32 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  z[2];.  if( argc
66a0: 3c 32 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28  <2 ){.    usage(
66b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78  argv[0]);.    ex
66c0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 64 62 20  it(1);.  }.  db 
66d0: 3d 20 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20  = open(argv[1], 
66e0: 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66 28  O_RDONLY);.  if(
66f0: 20 64 62 3c 30 20 29 7b 0a 20 20 20 20 66 70 72   db<0 ){.    fpr
6700: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
6710: 20 63 61 6e 27 74 20 6f 70 65 6e 20 25 73 5c 6e   can't open %s\n
6720: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67 76  ", argv[0], argv
6730: 5b 31 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31  [1]);.    exit(1
6740: 29 3b 0a 20 20 7d 0a 20 20 7a 50 67 53 7a 5b 30  );.  }.  zPgSz[0
6750: 5d 20 3d 20 30 3b 0a 20 20 7a 50 67 53 7a 5b 31  ] = 0;.  zPgSz[1
6760: 5d 20 3d 20 30 3b 0a 20 20 6c 73 65 65 6b 28 64  ] = 0;.  lseek(d
6770: 62 2c 20 31 36 2c 20 53 45 45 4b 5f 53 45 54 29  b, 16, SEEK_SET)
6780: 3b 0a 20 20 69 66 28 20 72 65 61 64 28 64 62 2c  ;.  if( read(db,
6790: 20 7a 50 67 53 7a 2c 20 32 29 3c 32 20 29 20 6d   zPgSz, 2)<2 ) m
67a0: 65 6d 73 65 74 28 7a 50 67 53 7a 2c 20 30 2c 20  emset(zPgSz, 0, 
67b0: 32 29 3b 0a 20 20 70 61 67 65 73 69 7a 65 20 3d  2);.  pagesize =
67c0: 20 7a 50 67 53 7a 5b 30 5d 2a 32 35 36 20 2b 20   zPgSz[0]*256 + 
67d0: 7a 50 67 53 7a 5b 31 5d 2a 36 35 35 33 36 3b 0a  zPgSz[1]*65536;.
67e0: 20 20 69 66 28 20 70 61 67 65 73 69 7a 65 3d 3d    if( pagesize==
67f0: 30 20 29 20 70 61 67 65 73 69 7a 65 20 3d 20 31  0 ) pagesize = 1
6800: 30 32 34 3b 0a 20 20 70 72 69 6e 74 66 28 22 50  024;.  printf("P
6810: 61 67 65 73 69 7a 65 3a 20 25 64 5c 6e 22 2c 20  agesize: %d\n", 
6820: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 66 73 74  pagesize);.  fst
6830: 61 74 28 64 62 2c 20 26 73 62 75 66 29 3b 0a 20  at(db, &sbuf);. 
6840: 20 6d 78 50 61 67 65 20 3d 20 73 62 75 66 2e 73   mxPage = sbuf.s
6850: 74 5f 73 69 7a 65 2f 70 61 67 65 73 69 7a 65 3b  t_size/pagesize;
6860: 0a 20 20 70 72 69 6e 74 66 28 22 41 76 61 69 6c  .  printf("Avail
6870: 61 62 6c 65 20 70 61 67 65 73 3a 20 31 2e 2e 25  able pages: 1..%
6880: 64 5c 6e 22 2c 20 6d 78 50 61 67 65 29 3b 0a 20  d\n", mxPage);. 
6890: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
68a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
68b0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6d 78 50 61 67  or(i=1; i<=mxPag
68c0: 65 3b 20 69 2b 2b 29 20 70 72 69 6e 74 5f 70 61  e; i++) print_pa
68d0: 67 65 28 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(i);.  }else{.
68e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
68f0: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20  or(i=2; i<argc; 
6900: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
6910: 69 53 74 61 72 74 2c 20 69 45 6e 64 3b 0a 20 20  iStart, iEnd;.  
6920: 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 3b      char *zLeft;
6930: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
6940: 70 28 61 72 67 76 5b 69 5d 2c 20 22 64 62 68 65  p(argv[i], "dbhe
6950: 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ader")==0 ){.   
6960: 20 20 20 20 20 70 72 69 6e 74 5f 64 62 5f 68 65       print_db_he
6970: 61 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20  ader();.        
6980: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6990: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  }.      if( strc
69a0: 6d 70 28 61 72 67 76 5b 69 5d 2c 20 22 70 67 69  mp(argv[i], "pgi
69b0: 64 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  dx")==0 ){.     
69c0: 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 72 65     page_usage_re
69d0: 70 6f 72 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  port(argv[1]);. 
69e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
69f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6a00: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
6a10: 5d 2c 20 22 70 74 72 6d 61 70 22 29 3d 3d 30 20  ], "ptrmap")==0 
6a20: 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
6a30: 70 5f 63 6f 76 65 72 61 67 65 5f 72 65 70 6f 72  p_coverage_repor
6a40: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
6a50: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6a70: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 20  strcmp(argv[i], 
6a80: 22 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "help")==0 ){.  
6a90: 20 20 20 20 20 20 75 73 61 67 65 28 61 72 67 76        usage(argv
6aa0: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  [0]);.        co
6ab0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
6ac0: 20 20 20 20 20 20 69 66 28 20 21 69 73 64 69 67        if( !isdig
6ad0: 69 74 28 61 72 67 76 5b 69 5d 5b 30 5d 29 20 29  it(argv[i][0]) )
6ae0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
6af0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20 75  f(stderr, "%s: u
6b00: 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5b  nknown option: [
6b10: 25 73 5d 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 2c  %s]\n", argv[0],
6b20: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
6b30: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6b40: 20 20 20 7d 0a 20 20 20 20 20 20 69 53 74 61 72     }.      iStar
6b50: 74 20 3d 20 73 74 72 74 6f 6c 28 61 72 67 76 5b  t = strtol(argv[
6b60: 69 5d 2c 20 26 7a 4c 65 66 74 2c 20 30 29 3b 0a  i], &zLeft, 0);.
6b70: 20 20 20 20 20 20 69 66 28 20 7a 4c 65 66 74 20        if( zLeft 
6b80: 26 26 20 73 74 72 63 6d 70 28 7a 4c 65 66 74 2c  && strcmp(zLeft,
6b90: 22 2e 2e 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20  "..end")==0 ){. 
6ba0: 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 6d 78         iEnd = mx
6bb0: 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Page;.      }els
6bc0: 65 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20 7a  e if( zLeft && z
6bd0: 4c 65 66 74 5b 30 5d 3d 3d 27 2e 27 20 26 26 20  Left[0]=='.' && 
6be0: 7a 4c 65 66 74 5b 31 5d 3d 3d 27 2e 27 20 29 7b  zLeft[1]=='.' ){
6bf0: 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20  .        iEnd = 
6c00: 73 74 72 74 6f 6c 28 26 7a 4c 65 66 74 5b 32 5d  strtol(&zLeft[2]
6c10: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
6c20: 65 6c 73 65 20 69 66 28 20 7a 4c 65 66 74 20 26  else if( zLeft &
6c30: 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27 62 27 20  & zLeft[0]=='b' 
6c40: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
6c50: 66 73 74 2c 20 6e 42 79 74 65 2c 20 68 64 72 53  fst, nByte, hdrS
6c60: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  ize;.        uns
6c70: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a 20  igned char *a;. 
6c80: 20 20 20 20 20 20 20 69 66 28 20 69 53 74 61 72         if( iStar
6c90: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
6ca0: 20 20 6f 66 73 74 20 3d 20 68 64 72 53 69 7a 65    ofst = hdrSize
6cb0: 20 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20   = 100;.        
6cc0: 20 20 6e 42 79 74 65 20 3d 20 70 61 67 65 73 69    nByte = pagesi
6cd0: 7a 65 2d 31 30 30 3b 0a 20 20 20 20 20 20 20 20  ze-100;.        
6ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6cf0: 20 68 64 72 53 69 7a 65 20 3d 20 30 3b 0a 20 20   hdrSize = 0;.  
6d00: 20 20 20 20 20 20 20 20 6f 66 73 74 20 3d 20 28          ofst = (
6d10: 69 53 74 61 72 74 2d 31 29 2a 70 61 67 65 73 69  iStart-1)*pagesi
6d20: 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42  ze;.          nB
6d30: 79 74 65 20 3d 20 70 61 67 65 73 69 7a 65 3b 0a  yte = pagesize;.
6d40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6d50: 20 20 61 20 3d 20 67 65 74 43 6f 6e 74 65 6e 74    a = getContent
6d60: 28 6f 66 73 74 2c 20 6e 42 79 74 65 29 3b 0a 20  (ofst, nByte);. 
6d70: 20 20 20 20 20 20 20 64 65 63 6f 64 65 5f 62 74         decode_bt
6d80: 72 65 65 5f 70 61 67 65 28 61 2c 20 69 53 74 61  ree_page(a, iSta
6d90: 72 74 2c 20 68 64 72 53 69 7a 65 2c 20 26 7a 4c  rt, hdrSize, &zL
6da0: 65 66 74 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  eft[1]);.       
6db0: 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20   free(a);.      
6dc0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 65 66    }else if( zLef
6de0: 74 20 26 26 20 7a 4c 65 66 74 5b 30 5d 3d 3d 27  t && zLeft[0]=='
6df0: 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  t' ){.        in
6e00: 74 20 64 65 74 61 69 6c 20 3d 20 30 3b 0a 20 20  t detail = 0;.  
6e10: 20 20 20 20 20 20 69 6e 74 20 72 65 63 75 72 73        int recurs
6e20: 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ive = 0;.       
6e30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
6e40: 66 6f 72 28 69 3d 31 3b 20 7a 4c 65 66 74 5b 69  for(i=1; zLeft[i
6e50: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
6e60: 20 20 20 69 66 28 20 7a 4c 65 66 74 5b 69 5d 3d     if( zLeft[i]=
6e70: 3d 27 72 27 20 29 20 72 65 63 75 72 73 69 76 65  ='r' ) recursive
6e80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
6e90: 69 66 28 20 7a 4c 65 66 74 5b 69 5d 3d 3d 27 64  if( zLeft[i]=='d
6ea0: 27 20 29 20 64 65 74 61 69 6c 20 3d 20 31 3b 0a  ' ) detail = 1;.
6eb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ec0: 20 20 64 65 63 6f 64 65 5f 74 72 75 6e 6b 5f 70    decode_trunk_p
6ed0: 61 67 65 28 69 53 74 61 72 74 2c 20 70 61 67 65  age(iStart, page
6ee0: 73 69 7a 65 2c 20 64 65 74 61 69 6c 2c 20 72 65  size, detail, re
6ef0: 63 75 72 73 69 76 65 29 3b 0a 20 20 20 20 20 20  cursive);.      
6f00: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6f20: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 3b 0a   iEnd = iStart;.
6f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6f40: 28 20 69 53 74 61 72 74 3c 31 20 7c 7c 20 69 45  ( iStart<1 || iE
6f50: 6e 64 3c 69 53 74 61 72 74 20 7c 7c 20 69 45 6e  nd<iStart || iEn
6f60: 64 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  d>mxPage ){.    
6f70: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
6f80: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 50  rr,.          "P
6f90: 61 67 65 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  age argument sho
6fa0: 75 6c 64 20 62 65 20 4c 4f 57 45 52 3f 2e 2e 55  uld be LOWER?..U
6fb0: 50 50 45 52 3f 2e 20 20 52 61 6e 67 65 20 31 20  PPER?.  Range 1 
6fc0: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
6fd0: 20 20 20 20 6d 78 50 61 67 65 29 3b 0a 20 20 20      mxPage);.   
6fe0: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
6ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
7000: 65 28 20 69 53 74 61 72 74 3c 3d 69 45 6e 64 20  e( iStart<=iEnd 
7010: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
7020: 5f 70 61 67 65 28 69 53 74 61 72 74 29 3b 0a 20  _page(iStart);. 
7030: 20 20 20 20 20 20 20 69 53 74 61 72 74 2b 2b 3b         iStart++;
7040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7050: 20 7d 0a 20 20 63 6c 6f 73 65 28 64 62 29 3b 0a   }.  close(db);.
7060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a          return 0;.}.