/ Hex Artifact Content
Login

Artifact b1e16174385d5bd0815823a7fda1ecc82ed6088b:


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 3c 61 73 73 65 72 74  #include <assert
0130: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .h>.#include "sq
0140: 6c 69 74 65 33 2e 68 22 0a 0a 0a 73 74 61 74 69  lite3.h"...stati
0150: 63 20 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 44  c struct GlobalD
0160: 61 74 61 20 7b 0a 20 20 69 6e 74 20 70 61 67 65  ata {.  int page
0170: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
0180: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
0190: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
01a0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 64 62 66 64  ge */.  int dbfd
01b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
01c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
01d0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 72  descriptor for r
01e0: 65 61 64 69 6e 67 20 74 68 65 20 44 42 20 2a 2f  eading the DB */
01f0: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
0200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0210: 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
0220: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
0230: 70 65 72 4c 69 6e 65 3b 20 20 20 20 20 20 20 20  perLine;        
0240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
0250: 45 58 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 70  EX elements to p
0260: 72 69 6e 74 20 70 65 72 20 6c 69 6e 65 20 2a 2f  rint per line */
0270: 0a 20 20 69 6e 74 20 62 52 61 77 3b 20 20 20 20  .  int bRaw;    
0280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0290: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 61 63     /* True to ac
02a0: 63 65 73 73 20 64 62 20 66 69 6c 65 20 76 69 61  cess db file via
02b0: 20 4f 53 20 41 50 49 73 20 2a 2f 0a 20 20 73 71   OS APIs */.  sq
02c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 3b  lite3_file *pFd;
02d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
02e0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
02f0: 20 66 6f 72 20 6e 6f 6e 2d 72 61 77 20 6d 6f 64   for non-raw mod
0300: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
0310: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
0320: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
0330: 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
0340: 77 6e 73 20 70 46 64 20 2a 2f 0a 7d 20 67 20 3d  wns pFd */.} g =
0350: 20 7b 31 30 32 34 2c 20 2d 31 2c 20 30 2c 20 31   {1024, -1, 0, 1
0360: 36 2c 20 20 20 30 2c 20 30 2c 20 30 7d 3b 0a 0a  6,   0, 0, 0};..
0370: 0a 74 79 70 65 64 65 66 20 6c 6f 6e 67 20 6c 6f  .typedef long lo
0380: 6e 67 20 69 6e 74 20 69 36 34 3b 20 20 20 20 20  ng int i64;     
0390: 20 2f 2a 20 44 61 74 61 74 79 70 65 20 66 6f 72   /* Datatype for
03a0: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
03b0: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   */.../*.** Conv
03c0: 65 72 74 20 74 68 65 20 76 61 72 2d 69 6e 74 20  ert the var-int 
03d0: 66 6f 72 6d 61 74 20 69 6e 74 6f 20 69 36 34 2e  format into i64.
03e0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
03f0: 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20  ber of bytes.** 
0400: 69 6e 20 74 68 65 20 76 61 72 2d 69 6e 74 2e 20  in the var-int. 
0410: 20 57 72 69 74 65 20 74 68 65 20 76 61 72 2d 69   Write the var-i
0420: 6e 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 70  nt value into *p
0430: 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Val..*/.static i
0440: 6e 74 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28  nt decodeVarint(
0450: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
0460: 68 61 72 20 2a 7a 2c 20 69 36 34 20 2a 70 56 61  har *z, i64 *pVa
0470: 6c 29 7b 0a 20 20 69 36 34 20 76 20 3d 20 30 3b  l){.  i64 v = 0;
0480: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
0490: 69 3d 30 3b 20 69 3c 38 3b 20 69 2b 2b 29 7b 0a  i=0; i<8; i++){.
04a0: 20 20 20 20 76 20 3d 20 28 76 3c 3c 37 29 20 2b      v = (v<<7) +
04b0: 20 28 7a 5b 69 5d 26 30 78 37 66 29 3b 0a 20 20   (z[i]&0x7f);.  
04c0: 20 20 69 66 28 20 28 7a 5b 69 5d 26 30 78 38 30    if( (z[i]&0x80
04d0: 29 3d 3d 30 20 29 7b 20 2a 70 56 61 6c 20 3d 20  )==0 ){ *pVal = 
04e0: 76 3b 20 72 65 74 75 72 6e 20 69 2b 31 3b 20 7d  v; return i+1; }
04f0: 0a 20 20 7d 0a 20 20 76 20 3d 20 28 76 3c 3c 38  .  }.  v = (v<<8
0500: 29 20 2b 20 28 7a 5b 69 5d 26 30 78 66 66 29 3b  ) + (z[i]&0xff);
0510: 0a 20 20 2a 70 56 61 6c 20 3d 20 76 3b 0a 20 20  .  *pVal = v;.  
0520: 72 65 74 75 72 6e 20 39 3b 0a 7d 0a 0a 2f 2a 0a  return 9;.}../*.
0530: 2a 2a 20 45 78 74 72 61 63 74 20 61 20 62 69 67  ** Extract a big
0540: 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 20 69  -endian 32-bit i
0550: 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63  nteger.*/.static
0560: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 64 65   unsigned int de
0570: 63 6f 64 65 49 6e 74 33 32 28 63 6f 6e 73 74 20  codeInt32(const 
0580: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
0590: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 7a 5b 30  ){.  return (z[0
05a0: 5d 3c 3c 32 34 29 20 2b 20 28 7a 5b 31 5d 3c 3c  ]<<24) + (z[1]<<
05b0: 31 36 29 20 2b 20 28 7a 5b 32 5d 3c 3c 38 29 20  16) + (z[2]<<8) 
05c0: 2b 20 7a 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 20 52 65  + z[3];.}../* Re
05d0: 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  port an out-of-m
05e0: 65 6d 6f 72 79 20 65 72 72 6f 72 20 61 6e 64 20  emory error and 
05f0: 64 69 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  die..*/.static v
0600: 6f 69 64 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  oid out_of_memor
0610: 79 28 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e  y(void){.  fprin
0620: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
0630: 66 20 6d 65 6d 6f 72 79 2e 2e 2e 5c 6e 22 29 3b  f memory...\n");
0640: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f  .  exit(1);.}../
0650: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
0660: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
0670: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
0680: 65 33 20 2a 6f 70 65 6e 44 61 74 61 62 61 73 65  e3 *openDatabase
0690: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72  (const char *zPr
06a0: 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
06b0: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
06c0: 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20   *db = 0;.  int 
06d0: 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
06e0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
06f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
0700: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
0710: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 4e 61 6d  te3_open_v2(zNam
0720: 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 30  e, &db, flags, 0
0730: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
0740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
0750: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
0760: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
0770: 64 62 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  db);.    fprintf
0780: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20 63 61  (stderr, "%s: ca
0790: 6e 27 74 20 6f 70 65 6e 20 25 73 20 28 25 73 29  n't open %s (%s)
07a0: 5c 6e 22 2c 20 7a 50 72 67 2c 20 7a 4e 61 6d 65  \n", zPrg, zName
07b0: 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 73 71 6c  , zErr);.    sql
07c0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
07d0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
07e0: 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a  .  return db;.}.
07f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
0840: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6c 6f 77  Beginning of low
0850: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 61 63 63 65  -level file acce
0860: 73 73 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  ss functions..**
0870: 0a 2a 2a 20 41 6c 6c 20 6c 6f 77 2d 6c 65 76 65  .** All low-leve
0880: 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
0890: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65  database file re
08a0: 61 64 20 62 79 20 74 68 69 73 20 70 72 6f 67 72  ad by this progr
08b0: 61 6d 20 69 73 0a 2a 2a 20 70 65 72 66 6f 72 6d  am is.** perform
08c0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ed using the fol
08d0: 6c 6f 77 69 6e 67 20 66 6f 75 72 20 66 75 6e 63  lowing four func
08e0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66  tions:.**.**   f
08f0: 69 6c 65 4f 70 65 6e 28 29 20 20 20 20 20 2d 20  ileOpen()     - 
0900: 6f 70 65 6e 20 74 68 65 20 64 62 20 66 69 6c 65  open the db file
0910: 0a 2a 2a 20 20 20 66 69 6c 65 43 6c 6f 73 65 28  .**   fileClose(
0920: 29 20 20 20 20 2d 20 63 6c 6f 73 65 20 74 68 65  )    - close the
0930: 20 64 62 20 66 69 6c 65 0a 2a 2a 20 20 20 66 69   db file.**   fi
0940: 6c 65 52 65 61 64 28 29 20 20 20 20 20 2d 20 72  leRead()     - r
0950: 65 61 64 20 72 61 77 20 64 61 74 61 20 66 72 6f  ead raw data fro
0960: 6d 20 74 68 65 20 64 62 20 66 69 6c 65 0a 2a 2a  m the db file.**
0970: 20 20 20 66 69 6c 65 47 65 74 73 69 7a 65 28 29     fileGetsize()
0980: 20 20 2d 20 72 65 74 75 72 6e 20 74 68 65 20 73    - return the s
0990: 69 7a 65 20 6f 66 20 74 68 65 20 64 62 20 66 69  ize of the db fi
09a0: 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 0a  le in bytes.*/..
09b0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64  /*.** Open the d
09c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
09d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
09e0: 65 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  eOpen(const char
09f0: 20 2a 7a 50 72 67 2c 20 63 6f 6e 73 74 20 63 68   *zPrg, const ch
0a00: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 61 73  ar *zName){.  as
0a10: 73 65 72 74 28 20 67 2e 64 62 66 64 3c 30 20 29  sert( g.dbfd<0 )
0a20: 3b 0a 20 20 69 66 28 20 67 2e 62 52 61 77 3d 3d  ;.  if( g.bRaw==
0a30: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  0 ){.    int rc;
0a40: 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
0a50: 3d 20 28 76 6f 69 64 20 2a 29 28 26 67 2e 70 46  = (void *)(&g.pF
0a60: 64 29 3b 0a 20 20 20 20 67 2e 70 44 62 20 3d 20  d);.    g.pDb = 
0a70: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 50 72  openDatabase(zPr
0a80: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  g, zName);.    r
0a90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
0aa0: 5f 63 6f 6e 74 72 6f 6c 28 67 2e 70 44 62 2c 20  _control(g.pDb, 
0ab0: 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
0ac0: 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
0ad0: 52 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 69 66  R, pArg);.    if
0ae0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0af0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
0b00: 28 73 74 64 65 72 72 2c 20 0a 20 20 20 20 20 20  (stderr, .      
0b10: 20 20 20 20 22 25 73 3a 20 66 61 69 6c 65 64 20      "%s: failed 
0b20: 74 6f 20 6f 62 74 61 69 6e 20 66 64 20 66 6f 72  to obtain fd for
0b30: 20 25 73 20 28 53 51 4c 69 74 65 20 74 6f 6f 20   %s (SQLite too 
0b40: 6f 6c 64 3f 29 5c 6e 22 2c 20 7a 50 72 67 2c 20  old?)\n", zPrg, 
0b50: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
0b60: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
0b70: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
0b80: 20 67 2e 64 62 66 64 20 3d 20 6f 70 65 6e 28 7a   g.dbfd = open(z
0b90: 4e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  Name, O_RDONLY);
0ba0: 0a 20 20 20 20 69 66 28 20 67 2e 64 62 66 64 3c  .    if( g.dbfd<
0bb0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
0bc0: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 63  tf(stderr,"%s: c
0bd0: 61 6e 27 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c  an't open %s\n",
0be0: 20 7a 50 72 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20   zPrg, zName);. 
0bf0: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
0c00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
0c10: 20 43 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62   Close the datab
0c20: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ase file opened 
0c30: 62 79 20 66 69 6c 65 4f 70 65 6e 28 29 0a 2a 2f  by fileOpen().*/
0c40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
0c50: 65 43 6c 6f 73 65 28 29 7b 0a 20 20 69 66 28 20  eClose(){.  if( 
0c60: 67 2e 62 52 61 77 3d 3d 30 20 29 7b 0a 20 20 20  g.bRaw==0 ){.   
0c70: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67   sqlite3_close(g
0c80: 2e 70 44 62 29 3b 0a 20 20 20 20 67 2e 70 44 62  .pDb);.    g.pDb
0c90: 20 3d 20 30 3b 0a 20 20 20 20 67 2e 70 46 64 20   = 0;.    g.pFd 
0ca0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
0cb0: 20 20 63 6c 6f 73 65 28 67 2e 64 62 66 64 29 3b    close(g.dbfd);
0cc0: 0a 20 20 20 20 67 2e 64 62 66 64 20 3d 20 2d 31  .    g.dbfd = -1
0cd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
0ce0: 65 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ead content from
0cf0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
0d00: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
0d10: 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 62  he content is ob
0d20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
0d30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
0d40: 20 6e 65 65 64 73 20 0a 2a 2a 20 74 6f 20 62 65   needs .** to be
0d50: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
0d60: 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
0d70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
0d80: 69 6c 65 52 65 61 64 28 73 71 6c 69 74 65 33 5f  ileRead(sqlite3_
0d90: 69 6e 74 36 34 20 6f 66 73 74 2c 20 69 6e 74 20  int64 ofst, int 
0da0: 6e 42 79 74 65 29 7b 0a 20 20 75 6e 73 69 67 6e  nByte){.  unsign
0db0: 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
0dc0: 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 44 61    int got;.  aDa
0dd0: 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ta = sqlite3_mal
0de0: 6c 6f 63 28 6e 42 79 74 65 2b 33 32 29 3b 0a 20  loc(nByte+32);. 
0df0: 20 69 66 28 20 61 44 61 74 61 3d 3d 30 20 29 20   if( aData==0 ) 
0e00: 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
0e10: 0a 20 20 6d 65 6d 73 65 74 28 61 44 61 74 61 2c  .  memset(aData,
0e20: 20 30 2c 20 6e 42 79 74 65 2b 33 32 29 3b 0a 20   0, nByte+32);. 
0e30: 20 69 66 28 20 67 2e 62 52 61 77 3d 3d 30 20 29   if( g.bRaw==0 )
0e40: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 67  {.    int rc = g
0e50: 2e 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  .pFd->pMethods->
0e60: 78 52 65 61 64 28 67 2e 70 46 64 2c 20 28 76 6f  xRead(g.pFd, (vo
0e70: 69 64 2a 29 61 44 61 74 61 2c 20 6e 42 79 74 65  id*)aData, nByte
0e80: 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
0e90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
0ea0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
0eb0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
0ec0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
0ed0: 74 64 65 72 72 2c 20 22 65 72 72 6f 72 20 69 6e  tderr, "error in
0ee0: 20 78 52 65 61 64 28 29 20 2d 20 25 64 5c 6e 22   xRead() - %d\n"
0ef0: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 65 78 69  , rc);.      exi
0f00: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t(1);.    }.  }e
0f10: 6c 73 65 7b 0a 20 20 20 20 6c 73 65 65 6b 28 67  lse{.    lseek(g
0f20: 2e 64 62 66 64 2c 20 6f 66 73 74 2c 20 53 45 45  .dbfd, ofst, SEE
0f30: 4b 5f 53 45 54 29 3b 0a 20 20 20 20 67 6f 74 20  K_SET);.    got 
0f40: 3d 20 72 65 61 64 28 67 2e 64 62 66 64 2c 20 61  = read(g.dbfd, a
0f50: 44 61 74 61 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Data, nByte);.  
0f60: 20 20 69 66 28 20 67 6f 74 3e 30 20 26 26 20 67    if( got>0 && g
0f70: 6f 74 3c 6e 42 79 74 65 20 29 20 6d 65 6d 73 65  ot<nByte ) memse
0f80: 74 28 61 44 61 74 61 2b 67 6f 74 2c 20 30 2c 20  t(aData+got, 0, 
0f90: 6e 42 79 74 65 2d 67 6f 74 29 3b 0a 20 20 7d 0a  nByte-got);.  }.
0fa0: 20 20 72 65 74 75 72 6e 20 61 44 61 74 61 3b 0a    return aData;.
0fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0fc0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
0fd0: 66 69 6c 65 20 69 6e 20 62 79 74 65 2e 0a 2a 2f  file in byte..*/
0fe0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
0ff0: 69 6e 74 36 34 20 66 69 6c 65 47 65 74 73 69 7a  int64 fileGetsiz
1000: 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  e(void){.  sqlit
1010: 65 33 5f 69 6e 74 36 34 20 72 65 73 20 3d 20 30  e3_int64 res = 0
1020: 3b 0a 20 20 69 66 28 20 67 2e 62 52 61 77 3d 3d  ;.  if( g.bRaw==
1030: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  0 ){.    int rc 
1040: 3d 20 67 2e 70 46 64 2d 3e 70 4d 65 74 68 6f 64  = g.pFd->pMethod
1050: 73 2d 3e 78 46 69 6c 65 53 69 7a 65 28 67 2e 70  s->xFileSize(g.p
1060: 46 64 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69  Fd, &res);.    i
1070: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1080: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1090: 66 28 73 74 64 65 72 72 2c 20 22 65 72 72 6f 72  f(stderr, "error
10a0: 20 69 6e 20 78 46 69 6c 65 53 69 7a 65 28 29 20   in xFileSize() 
10b0: 2d 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  - %d\n", rc);.  
10c0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
10d0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
10e0: 73 74 72 75 63 74 20 73 74 61 74 20 73 62 75 66  struct stat sbuf
10f0: 3b 0a 20 20 20 20 66 73 74 61 74 28 67 2e 64 62  ;.    fstat(g.db
1100: 66 64 2c 20 26 73 62 75 66 29 3b 0a 20 20 20 20  fd, &sbuf);.    
1110: 72 65 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  res = (sqlite3_i
1120: 6e 74 36 34 29 28 73 62 75 66 2e 73 74 5f 73 69  nt64)(sbuf.st_si
1130: 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ze);.  }.  retur
1140: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1150: 45 6e 64 20 6f 66 20 6c 6f 77 2d 6c 65 76 65 6c  End of low-level
1160: 20 66 69 6c 65 20 61 63 63 65 73 73 20 66 75 6e   file access fun
1170: 63 74 69 6f 6e 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  ctions..********
1180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c0: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  **/../*.** Print
11d0: 20 61 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65   a range of byte
11e0: 73 20 61 73 20 68 65 78 20 61 6e 64 20 61 73 20  s as hex and as 
11f0: 61 73 63 69 69 2e 0a 2a 2f 0a 73 74 61 74 69 63  ascii..*/.static
1200: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1210: 70 72 69 6e 74 5f 62 79 74 65 5f 72 61 6e 67 65  print_byte_range
1220: 28 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  (.  int ofst,   
1230: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1240: 62 79 74 65 20 69 6e 20 74 68 65 20 72 61 6e 67  byte in the rang
1250: 65 20 6f 66 20 62 79 74 65 73 20 74 6f 20 70 72  e of bytes to pr
1260: 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  int */.  int nBy
1270: 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  te,         /* N
1280: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1290: 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  o print */.  int
12a0: 20 70 72 69 6e 74 4f 66 73 74 20 20 20 20 20 20   printOfst      
12b0: 2f 2a 20 41 64 64 20 74 68 69 73 20 61 6d 6f 75  /* Add this amou
12c0: 6e 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nt to the index 
12d0: 6f 6e 20 74 68 65 20 6c 65 66 74 20 63 6f 6c 75  on the left colu
12e0: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  mn */.){.  unsig
12f0: 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b  ned char *aData;
1300: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
1310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 66 73 74  onst char *zOfst
1320: 46 6d 74 3b 0a 0a 20 20 69 66 28 20 28 28 70 72  Fmt;..  if( ((pr
1330: 69 6e 74 4f 66 73 74 2b 6e 42 79 74 65 29 26 7e  intOfst+nByte)&~
1340: 30 78 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20  0xfff)==0 ){.   
1350: 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30   zOfstFmt = " %0
1360: 33 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69  3x: ";.  }else i
1370: 66 28 20 28 28 70 72 69 6e 74 4f 66 73 74 2b 6e  f( ((printOfst+n
1380: 42 79 74 65 29 26 7e 30 78 66 66 66 66 29 3d 3d  Byte)&~0xffff)==
1390: 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d  0 ){.    zOfstFm
13a0: 74 20 3d 20 22 20 25 30 34 78 3a 20 22 3b 0a 20  t = " %04x: ";. 
13b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 28 70 72 69   }else if( ((pri
13c0: 6e 74 4f 66 73 74 2b 6e 42 79 74 65 29 26 7e 30  ntOfst+nByte)&~0
13d0: 78 66 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20  xfffff)==0 ){.  
13e0: 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25    zOfstFmt = " %
13f0: 30 35 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20  05x: ";.  }else 
1400: 69 66 28 20 28 28 70 72 69 6e 74 4f 66 73 74 2b  if( ((printOfst+
1410: 6e 42 79 74 65 29 26 7e 30 78 66 66 66 66 66 66  nByte)&~0xffffff
1420: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73  )==0 ){.    zOfs
1430: 74 46 6d 74 20 3d 20 22 20 25 30 36 78 3a 20 22  tFmt = " %06x: "
1440: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
1450: 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 38 78  OfstFmt = " %08x
1460: 3a 20 22 3b 0a 20 20 7d 0a 0a 20 20 61 44 61 74  : ";.  }..  aDat
1470: 61 20 3d 20 66 69 6c 65 52 65 61 64 28 6f 66 73  a = fileRead(ofs
1480: 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 66 6f 72  t, nByte);.  for
1490: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
14a0: 20 2b 3d 20 67 2e 70 65 72 4c 69 6e 65 29 7b 0a   += g.perLine){.
14b0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f      fprintf(stdo
14c0: 75 74 2c 20 7a 4f 66 73 74 46 6d 74 2c 20 69 2b  ut, zOfstFmt, i+
14d0: 70 72 69 6e 74 4f 66 73 74 29 3b 0a 20 20 20 20  printOfst);.    
14e0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 67 2e 70 65 72  for(j=0; j<g.per
14f0: 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Line; j++){.    
1500: 20 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74 65 20    if( i+j>nByte 
1510: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1520: 74 66 28 73 74 64 6f 75 74 2c 20 22 20 20 20 22  tf(stdout, "   "
1530: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1540: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1550: 73 74 64 6f 75 74 2c 22 25 30 32 78 20 22 2c 20  stdout,"%02x ", 
1560: 61 44 61 74 61 5b 69 2b 6a 5d 29 3b 0a 20 20 20  aData[i+j]);.   
1570: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
1580: 6f 72 28 6a 3d 30 3b 20 6a 3c 67 2e 70 65 72 4c  or(j=0; j<g.perL
1590: 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ine; j++){.     
15a0: 20 69 66 28 20 69 2b 6a 3e 6e 42 79 74 65 20 29   if( i+j>nByte )
15b0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15c0: 66 28 73 74 64 6f 75 74 2c 20 22 20 22 29 3b 0a  f(stdout, " ");.
15d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
15f0: 6f 75 74 2c 22 25 63 22 2c 20 69 73 70 72 69 6e  out,"%c", isprin
1600: 74 28 61 44 61 74 61 5b 69 2b 6a 5d 29 20 3f 20  t(aData[i+j]) ? 
1610: 61 44 61 74 61 5b 69 2b 6a 5d 20 3a 20 27 2e 27  aData[i+j] : '.'
1620: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1630: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1640: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  out,"\n");.  }. 
1650: 20 72 65 74 75 72 6e 20 61 44 61 74 61 3b 0a 7d   return aData;.}
1660: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  ../*.** Print an
1670: 20 65 6e 74 69 72 65 20 70 61 67 65 20 6f 66 20   entire page of 
1680: 63 6f 6e 74 65 6e 74 20 61 73 20 68 65 78 0a 2a  content as hex.*
1690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
16a0: 69 6e 74 5f 70 61 67 65 28 69 6e 74 20 69 50 67  int_page(int iPg
16b0: 29 7b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 3b  ){.  int iStart;
16c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
16d0: 20 2a 61 44 61 74 61 3b 0a 20 20 69 53 74 61 72   *aData;.  iStar
16e0: 74 20 3d 20 28 69 50 67 2d 31 29 2a 67 2e 70 61  t = (iPg-1)*g.pa
16f0: 67 65 73 69 7a 65 3b 0a 20 20 66 70 72 69 6e 74  gesize;.  fprint
1700: 66 28 73 74 64 6f 75 74 2c 20 22 50 61 67 65 20  f(stdout, "Page 
1710: 25 64 3a 20 20 20 28 6f 66 66 73 65 74 73 20 30  %d:   (offsets 0
1720: 78 25 78 2e 2e 30 78 25 78 29 5c 6e 22 2c 0a 20  x%x..0x%x)\n",. 
1730: 20 20 20 20 20 20 20 20 20 69 50 67 2c 20 69 53           iPg, iS
1740: 74 61 72 74 2c 20 69 53 74 61 72 74 2b 67 2e 70  tart, iStart+g.p
1750: 61 67 65 73 69 7a 65 2d 31 29 3b 0a 20 20 61 44  agesize-1);.  aD
1760: 61 74 61 20 3d 20 70 72 69 6e 74 5f 62 79 74 65  ata = print_byte
1770: 5f 72 61 6e 67 65 28 69 53 74 61 72 74 2c 20 67  _range(iStart, g
1780: 2e 70 61 67 65 73 69 7a 65 2c 20 30 29 3b 0a 20  .pagesize, 0);. 
1790: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 44   sqlite3_free(aD
17a0: 61 74 61 29 3b 0a 7d 0a 0a 0a 2f 2a 20 50 72 69  ata);.}.../* Pri
17b0: 6e 74 20 61 20 6c 69 6e 65 20 6f 66 20 64 65 63  nt a line of dec
17c0: 6f 64 65 20 6f 75 74 70 75 74 20 73 68 6f 77 69  ode output showi
17d0: 6e 67 20 61 20 34 2d 62 79 74 65 20 69 6e 74 65  ng a 4-byte inte
17e0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ger..*/.static v
17f0: 6f 69 64 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  oid print_decode
1800: 5f 6c 69 6e 65 28 0a 20 20 75 6e 73 69 67 6e 65  _line(.  unsigne
1810: 64 20 63 68 61 72 20 2a 61 44 61 74 61 2c 20 20  d char *aData,  
1820: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 62      /* Content b
1830: 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
1840: 20 20 69 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20    int ofst, int 
1850: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  nByte,       /* 
1860: 53 74 61 72 74 20 61 6e 64 20 73 69 7a 65 20 6f  Start and size o
1870: 66 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  f decode */.  co
1880: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 20  nst char *zMsg  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
18a0: 61 67 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  age to append */
18b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
18c0: 20 20 69 6e 74 20 76 61 6c 20 3d 20 61 44 61 74    int val = aDat
18d0: 61 5b 6f 66 73 74 5d 3b 0a 20 20 63 68 61 72 20  a[ofst];.  char 
18e0: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 73 70 72  zBuf[100];.  spr
18f0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 20 25 30 33  intf(zBuf, " %03
1900: 78 3a 20 25 30 32 78 22 2c 20 6f 66 73 74 2c 20  x: %02x", ofst, 
1910: 61 44 61 74 61 5b 6f 66 73 74 5d 29 3b 0a 20 20  aData[ofst]);.  
1920: 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  i = (int)strlen(
1930: 7a 42 75 66 29 3b 0a 20 20 66 6f 72 28 6a 3d 31  zBuf);.  for(j=1
1940: 3b 20 6a 3c 34 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<4; j++){.   
1950: 20 69 66 28 20 6a 3e 3d 6e 42 79 74 65 20 29 7b   if( j>=nByte ){
1960: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 26  .      sprintf(&
1970: 7a 42 75 66 5b 69 5d 2c 20 22 20 20 20 22 29 3b  zBuf[i], "   ");
1980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1990: 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b    sprintf(&zBuf[
19a0: 69 5d 2c 20 22 20 25 30 32 78 22 2c 20 61 44 61  i], " %02x", aDa
19b0: 74 61 5b 6f 66 73 74 2b 6a 5d 29 3b 0a 20 20 20  ta[ofst+j]);.   
19c0: 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a 32 35 36     val = val*256
19d0: 20 2b 20 61 44 61 74 61 5b 6f 66 73 74 2b 6a 5d   + aData[ofst+j]
19e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 2b 3d  ;.    }.    i +=
19f0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 26 7a 42   (int)strlen(&zB
1a00: 75 66 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 70  uf[i]);.  }.  sp
1a10: 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d 2c 20  rintf(&zBuf[i], 
1a20: 22 20 20 20 25 39 64 22 2c 20 76 61 6c 29 3b 0a  "   %9d", val);.
1a30: 20 20 70 72 69 6e 74 66 28 22 25 73 20 20 25 73    printf("%s  %s
1a40: 5c 6e 22 2c 20 7a 42 75 66 2c 20 7a 4d 73 67 29  \n", zBuf, zMsg)
1a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
1a60: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  e the database h
1a70: 65 61 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  eader..*/.static
1a80: 20 76 6f 69 64 20 70 72 69 6e 74 5f 64 62 5f 68   void print_db_h
1a90: 65 61 64 65 72 28 76 6f 69 64 29 7b 0a 20 20 75  eader(void){.  u
1aa0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
1ab0: 61 74 61 3b 0a 20 20 61 44 61 74 61 20 3d 20 70  ata;.  aData = p
1ac0: 72 69 6e 74 5f 62 79 74 65 5f 72 61 6e 67 65 28  rint_byte_range(
1ad0: 30 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20 70 72  0, 100, 0);.  pr
1ae0: 69 6e 74 66 28 22 44 65 63 6f 64 65 64 3a 5c 6e  intf("Decoded:\n
1af0: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1b00: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 31  de_line(aData, 1
1b10: 36 2c 20 32 2c 20 22 44 61 74 61 62 61 73 65 20  6, 2, "Database 
1b20: 70 61 67 65 20 73 69 7a 65 22 29 3b 0a 20 20 70  page size");.  p
1b30: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1b40: 28 61 44 61 74 61 2c 20 31 38 2c 20 31 2c 20 22  (aData, 18, 1, "
1b50: 46 69 6c 65 20 66 6f 72 6d 61 74 20 77 72 69 74  File format writ
1b60: 65 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 70  e version");.  p
1b70: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
1b80: 28 61 44 61 74 61 2c 20 31 39 2c 20 31 2c 20 22  (aData, 19, 1, "
1b90: 46 69 6c 65 20 66 6f 72 6d 61 74 20 72 65 61 64  File format read
1ba0: 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 70 72   version");.  pr
1bb0: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
1bc0: 61 44 61 74 61 2c 20 32 30 2c 20 31 2c 20 22 52  aData, 20, 1, "R
1bd0: 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 74  eserved space at
1be0: 20 65 6e 64 20 6f 66 20 70 61 67 65 22 29 3b 0a   end of page");.
1bf0: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
1c00: 69 6e 65 28 61 44 61 74 61 2c 20 32 34 2c 20 34  ine(aData, 24, 4
1c10: 2c 20 22 46 69 6c 65 20 63 68 61 6e 67 65 20 63  , "File change c
1c20: 6f 75 6e 74 65 72 22 29 3b 0a 20 20 70 72 69 6e  ounter");.  prin
1c30: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1c40: 61 74 61 2c 20 32 38 2c 20 34 2c 20 22 53 69 7a  ata, 28, 4, "Siz
1c50: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 6e  e of database in
1c60: 20 70 61 67 65 73 22 29 3b 0a 20 20 70 72 69 6e   pages");.  prin
1c70: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44  t_decode_line(aD
1c80: 61 74 61 2c 20 33 32 2c 20 34 2c 20 22 50 61 67  ata, 32, 4, "Pag
1c90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73  e number of firs
1ca0: 74 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 22  t freelist page"
1cb0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
1cc0: 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 33 36  e_line(aData, 36
1cd0: 2c 20 34 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  , 4, "Number of 
1ce0: 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 22 29  freelist pages")
1cf0: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1d00: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 34 30 2c  _line(aData, 40,
1d10: 20 34 2c 20 22 53 63 68 65 6d 61 20 63 6f 6f 6b   4, "Schema cook
1d20: 69 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  ie");.  print_de
1d30: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1d40: 20 34 34 2c 20 34 2c 20 22 53 63 68 65 6d 61 20   44, 4, "Schema 
1d50: 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 22 29  format version")
1d60: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
1d70: 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 34 38 2c  _line(aData, 48,
1d80: 20 34 2c 20 22 44 65 66 61 75 6c 74 20 70 61 67   4, "Default pag
1d90: 65 20 63 61 63 68 65 20 73 69 7a 65 22 29 3b 0a  e cache size");.
1da0: 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c    print_decode_l
1db0: 69 6e 65 28 61 44 61 74 61 2c 20 35 32 2c 20 34  ine(aData, 52, 4
1dc0: 2c 20 22 4c 61 72 67 65 73 74 20 61 75 74 6f 2d  , "Largest auto-
1dd0: 76 61 63 20 72 6f 6f 74 20 70 61 67 65 22 29 3b  vac root page");
1de0: 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f  .  print_decode_
1df0: 6c 69 6e 65 28 61 44 61 74 61 2c 20 35 36 2c 20  line(aData, 56, 
1e00: 34 2c 20 22 54 65 78 74 20 65 6e 63 6f 64 69 6e  4, "Text encodin
1e10: 67 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  g");.  print_dec
1e20: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
1e30: 36 30 2c 20 34 2c 20 22 55 73 65 72 20 76 65 72  60, 4, "User ver
1e40: 73 69 6f 6e 22 29 3b 0a 20 20 70 72 69 6e 74 5f  sion");.  print_
1e50: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74  decode_line(aDat
1e60: 61 2c 20 36 34 2c 20 34 2c 20 22 49 6e 63 72 65  a, 64, 4, "Incre
1e70: 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6d 6f  mental-vacuum mo
1e80: 64 65 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  de");.  print_de
1e90: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1ea0: 20 36 38 2c 20 34 2c 20 22 41 70 70 6c 69 63 61   68, 4, "Applica
1eb0: 74 69 6f 6e 20 49 44 22 29 3b 0a 20 20 70 72 69  tion ID");.  pri
1ec0: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
1ed0: 44 61 74 61 2c 20 37 32 2c 20 34 2c 20 22 6d 65  Data, 72, 4, "me
1ee0: 74 61 5b 38 5d 22 29 3b 0a 20 20 70 72 69 6e 74  ta[8]");.  print
1ef0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61  _decode_line(aDa
1f00: 74 61 2c 20 37 36 2c 20 34 2c 20 22 6d 65 74 61  ta, 76, 4, "meta
1f10: 5b 39 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64  [9]");.  print_d
1f20: 65 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61  ecode_line(aData
1f30: 2c 20 38 30 2c 20 34 2c 20 22 6d 65 74 61 5b 31  , 80, 4, "meta[1
1f40: 30 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65  0]");.  print_de
1f50: 63 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c  code_line(aData,
1f60: 20 38 34 2c 20 34 2c 20 22 6d 65 74 61 5b 31 31   84, 4, "meta[11
1f70: 5d 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  ]");.  print_dec
1f80: 6f 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20  ode_line(aData, 
1f90: 38 38 2c 20 34 2c 20 22 6d 65 74 61 5b 31 32 5d  88, 4, "meta[12]
1fa0: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
1fb0: 64 65 5f 6c 69 6e 65 28 61 44 61 74 61 2c 20 39  de_line(aData, 9
1fc0: 32 2c 20 34 2c 20 22 43 68 61 6e 67 65 20 63 6f  2, 4, "Change co
1fd0: 75 6e 74 65 72 20 66 6f 72 20 76 65 72 73 69 6f  unter for versio
1fe0: 6e 20 6e 75 6d 62 65 72 22 29 3b 0a 20 20 70 72  n number");.  pr
1ff0: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
2000: 61 44 61 74 61 2c 20 39 36 2c 20 34 2c 20 22 53  aData, 96, 4, "S
2010: 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
2020: 6d 62 65 72 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mber");.}../*.**
2030: 20 44 65 73 63 72 69 62 65 20 63 65 6c 6c 20 63   Describe cell c
2040: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  ontent..*/.stati
2050: 63 20 69 36 34 20 64 65 73 63 72 69 62 65 43 6f  c i64 describeCo
2060: 6e 74 65 6e 74 28 0a 20 20 75 6e 73 69 67 6e 65  ntent(.  unsigne
2070: 64 20 63 68 61 72 20 2a 61 2c 20 20 20 20 20 20  d char *a,      
2080: 20 2f 2a 20 43 65 6c 6c 20 63 6f 6e 74 65 6e 74   /* Cell content
2090: 20 2a 2f 0a 20 20 69 36 34 20 6e 4c 6f 63 61 6c   */.  i64 nLocal
20a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
20b0: 20 42 79 74 65 73 20 69 6e 20 61 5b 5d 20 2a 2f   Bytes in a[] */
20c0: 0a 20 20 63 68 61 72 20 2a 7a 44 65 73 63 20 20  .  char *zDesc  
20d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
20e0: 69 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ite description 
20f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
2100: 20 6e 44 65 73 63 20 3d 20 30 3b 0a 20 20 69 6e   nDesc = 0;.  in
2110: 74 20 6e 2c 20 6a 3b 0a 20 20 69 36 34 20 69 2c  t n, j;.  i64 i,
2120: 20 78 2c 20 76 3b 0a 20 20 63 6f 6e 73 74 20 75   x, v;.  const u
2130: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
2140: 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ata;.  const uns
2150: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4c 69 6d  igned char *pLim
2160: 69 74 3b 0a 20 20 63 68 61 72 20 73 65 70 20 3d  it;.  char sep =
2170: 20 27 20 27 3b 0a 0a 20 20 70 4c 69 6d 69 74 20   ' ';..  pLimit 
2180: 3d 20 26 61 5b 6e 4c 6f 63 61 6c 5d 3b 0a 20 20  = &a[nLocal];.  
2190: 6e 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  n = decodeVarint
21a0: 28 61 2c 20 26 78 29 3b 0a 20 20 70 44 61 74 61  (a, &x);.  pData
21b0: 20 3d 20 26 61 5b 78 5d 3b 0a 20 20 61 20 2b 3d   = &a[x];.  a +=
21c0: 20 6e 3b 0a 20 20 69 20 3d 20 78 20 2d 20 6e 3b   n;.  i = x - n;
21d0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26  .  while( i>0 &&
21e0: 20 70 44 61 74 61 3c 3d 70 4c 69 6d 69 74 20 29   pData<=pLimit )
21f0: 7b 0a 20 20 20 20 6e 20 3d 20 64 65 63 6f 64 65  {.    n = decode
2200: 56 61 72 69 6e 74 28 61 2c 20 26 78 29 3b 0a 20  Varint(a, &x);. 
2210: 20 20 20 61 20 2b 3d 20 6e 3b 0a 20 20 20 20 69     a += n;.    i
2220: 20 2d 3d 20 6e 3b 0a 20 20 20 20 6e 4c 6f 63 61   -= n;.    nLoca
2230: 6c 20 2d 3d 20 6e 3b 0a 20 20 20 20 7a 44 65 73  l -= n;.    zDes
2240: 63 5b 30 5d 20 3d 20 73 65 70 3b 0a 20 20 20 20  c[0] = sep;.    
2250: 73 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 6e  sep = ',';.    n
2260: 44 65 73 63 2b 2b 3b 0a 20 20 20 20 7a 44 65 73  Desc++;.    zDes
2270: 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d  c++;.    if( x==
2280: 30 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  0 ){.      sprin
2290: 74 66 28 7a 44 65 73 63 2c 20 22 2a 22 29 3b 20  tf(zDesc, "*"); 
22a0: 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 69 73 20 61      /* NULL is a
22b0: 20 22 2a 22 20 2a 2f 0a 20 20 20 20 7d 65 6c 73   "*" */.    }els
22c0: 65 20 69 66 28 20 78 3e 3d 31 20 26 26 20 78 3c  e if( x>=1 && x<
22d0: 3d 36 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =6 ){.      v = 
22e0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 70 44 61  (signed char)pDa
22f0: 74 61 5b 30 5d 3b 0a 20 20 20 20 20 20 70 44 61  ta[0];.      pDa
2300: 74 61 2b 2b 3b 0a 20 20 20 20 20 20 73 77 69 74  ta++;.      swit
2310: 63 68 28 20 78 20 29 7b 0a 20 20 20 20 20 20 20  ch( x ){.       
2320: 20 63 61 73 65 20 36 3a 20 20 76 20 3d 20 28 76   case 6:  v = (v
2330: 3c 3c 31 36 29 20 2b 20 28 70 44 61 74 61 5b 30  <<16) + (pData[0
2340: 5d 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 31 5d  ]<<8) + pData[1]
2350: 3b 20 20 70 44 61 74 61 20 2b 3d 20 32 3b 0a 20  ;  pData += 2;. 
2360: 20 20 20 20 20 20 20 63 61 73 65 20 35 3a 20 20         case 5:  
2370: 76 20 3d 20 28 76 3c 3c 31 36 29 20 2b 20 28 70  v = (v<<16) + (p
2380: 44 61 74 61 5b 30 5d 3c 3c 38 29 20 2b 20 70 44  Data[0]<<8) + pD
2390: 61 74 61 5b 31 5d 3b 20 20 70 44 61 74 61 20 2b  ata[1];  pData +
23a0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 61 73  = 2;.        cas
23b0: 65 20 34 3a 20 20 76 20 3d 20 28 76 3c 3c 38 29  e 4:  v = (v<<8)
23c0: 20 2b 20 70 44 61 74 61 5b 30 5d 3b 20 20 70 44   + pData[0];  pD
23d0: 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  ata++;.        c
23e0: 61 73 65 20 33 3a 20 20 76 20 3d 20 28 76 3c 3c  ase 3:  v = (v<<
23f0: 38 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b 20 20  8) + pData[0];  
2400: 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20 20 20  pData++;.       
2410: 20 63 61 73 65 20 32 3a 20 20 76 20 3d 20 28 76   case 2:  v = (v
2420: 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 30 5d 3b  <<8) + pData[0];
2430: 20 20 70 44 61 74 61 2b 2b 3b 0a 20 20 20 20 20    pData++;.     
2440: 20 7d 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66   }.      sprintf
2450: 28 7a 44 65 73 63 2c 20 22 25 6c 6c 64 22 2c 20  (zDesc, "%lld", 
2460: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  v);.    }else if
2470: 28 20 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ( x==7 ){.      
2480: 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22  sprintf(zDesc, "
2490: 72 65 61 6c 22 29 3b 0a 20 20 20 20 20 20 70 44  real");.      pD
24a0: 61 74 61 20 2b 3d 20 38 3b 0a 20 20 20 20 7d 65  ata += 8;.    }e
24b0: 6c 73 65 20 69 66 28 20 78 3d 3d 38 20 29 7b 0a  lse if( x==8 ){.
24c0: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44        sprintf(zD
24d0: 65 73 63 2c 20 22 30 22 29 3b 0a 20 20 20 20 7d  esc, "0");.    }
24e0: 65 6c 73 65 20 69 66 28 20 78 3d 3d 39 20 29 7b  else if( x==9 ){
24f0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
2500: 44 65 73 63 2c 20 22 31 22 29 3b 0a 20 20 20 20  Desc, "1");.    
2510: 7d 65 6c 73 65 20 69 66 28 20 78 3e 3d 31 32 20  }else if( x>=12 
2520: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 69 7a  ){.      i64 siz
2530: 65 20 3d 20 28 78 2d 31 32 29 2f 32 3b 0a 20 20  e = (x-12)/2;.  
2540: 20 20 20 20 69 66 28 20 28 78 26 31 29 3d 3d 30      if( (x&1)==0
2550: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69   ){.        spri
2560: 6e 74 66 28 7a 44 65 73 63 2c 20 22 62 6c 6f 62  ntf(zDesc, "blob
2570: 28 25 6c 6c 64 29 22 2c 20 73 69 7a 65 29 3b 0a  (%lld)", size);.
2580: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2590: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 44 65       sprintf(zDe
25a0: 73 63 2c 20 22 74 78 74 28 25 6c 6c 64 29 22 2c  sc, "txt(%lld)",
25b0: 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a   size);.      }.
25c0: 20 20 20 20 20 20 70 44 61 74 61 20 2b 3d 20 73        pData += s
25d0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ize;.    }.    j
25e0: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
25f0: 44 65 73 63 29 3b 0a 20 20 20 20 7a 44 65 73 63  Desc);.    zDesc
2600: 20 2b 3d 20 6a 3b 0a 20 20 20 20 6e 44 65 73 63   += j;.    nDesc
2610: 20 2b 3d 20 6a 3b 0a 20 20 7d 0a 20 20 72 65 74   += j;.  }.  ret
2620: 75 72 6e 20 6e 44 65 73 63 3b 0a 7d 0a 0a 2f 2a  urn nDesc;.}../*
2630: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
2640: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  local payload si
2650: 7a 65 20 67 69 76 65 6e 20 74 68 65 20 74 6f 74  ze given the tot
2660: 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
2670: 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  and.** the page 
2680: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
2690: 69 36 34 20 6c 6f 63 61 6c 50 61 79 6c 6f 61 64  i64 localPayload
26a0: 28 69 36 34 20 6e 50 61 79 6c 6f 61 64 2c 20 63  (i64 nPayload, c
26b0: 68 61 72 20 63 54 79 70 65 29 7b 0a 20 20 69 36  har cType){.  i6
26c0: 34 20 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 69 36  4 maxLocal;.  i6
26d0: 34 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 69 36  4 minLocal;.  i6
26e0: 34 20 73 75 72 70 6c 75 73 3b 0a 20 20 69 36 34  4 surplus;.  i64
26f0: 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 63   nLocal;.  if( c
2700: 54 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20 20 20  Type==13 ){.    
2710: 2f 2a 20 54 61 62 6c 65 20 6c 65 61 66 20 2a 2f  /* Table leaf */
2720: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
2730: 67 2e 70 61 67 65 73 69 7a 65 2d 33 35 3b 0a 20  g.pagesize-35;. 
2740: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 67     minLocal = (g
2750: 2e 70 61 67 65 73 69 7a 65 2d 31 32 29 2a 33 32  .pagesize-12)*32
2760: 2f 32 35 35 2d 32 33 3b 0a 20 20 7d 65 6c 73 65  /255-23;.  }else
2770: 7b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  {.    maxLocal =
2780: 20 28 67 2e 70 61 67 65 73 69 7a 65 2d 31 32 29   (g.pagesize-12)
2790: 2a 36 34 2f 32 35 35 2d 32 33 3b 0a 20 20 20 20  *64/255-23;.    
27a0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 67 2e 70 61  minLocal = (g.pa
27b0: 67 65 73 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  gesize-12)*32/25
27c0: 35 2d 32 33 3b 0a 20 20 7d 0a 20 20 69 66 28 20  5-23;.  }.  if( 
27d0: 6e 50 61 79 6c 6f 61 64 3e 6d 61 78 4c 6f 63 61  nPayload>maxLoca
27e0: 6c 20 29 7b 0a 20 20 20 20 73 75 72 70 6c 75 73  l ){.    surplus
27f0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
2800: 50 61 79 6c 6f 61 64 2d 6d 69 6e 4c 6f 63 61 6c  Payload-minLocal
2810: 29 25 28 67 2e 70 61 67 65 73 69 7a 65 2d 34 29  )%(g.pagesize-4)
2820: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
2830: 73 3c 3d 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  s<=maxLocal ){. 
2840: 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 73 75       nLocal = su
2850: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
2860: 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
2870: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
2880: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
2890: 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  ocal = nPayload;
28a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 4c  .  }.  return nL
28b0: 6f 63 61 6c 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a  ocal;.}.  ../*.*
28c0: 2a 20 43 72 65 61 74 65 20 61 20 64 65 73 63 72  * Create a descr
28d0: 69 70 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  iption for a sin
28e0: 67 6c 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  gle cell..**.** 
28f0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2900: 20 69 73 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   is the local ce
2910: 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ll size..*/.stat
2920: 69 63 20 69 36 34 20 64 65 73 63 72 69 62 65 43  ic i64 describeC
2930: 65 6c 6c 28 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell(.  unsigned 
2940: 63 68 61 72 20 63 54 79 70 65 2c 20 20 20 20 2f  char cType,    /
2950: 2a 20 50 61 67 65 20 74 79 70 65 20 2a 2f 0a 20  * Page type */. 
2960: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2970: 61 2c 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  a,       /* Cell
2980: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
2990: 74 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e  t showCellConten
29a0: 74 2c 20 20 20 20 2f 2a 20 53 68 6f 77 20 63 65  t,    /* Show ce
29b0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ll content if tr
29c0: 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ue */.  char **p
29d0: 7a 44 65 73 63 20 20 20 20 20 20 20 20 20 20 20  zDesc           
29e0: 2f 2a 20 53 74 6f 72 65 20 64 65 73 63 72 69 70  /* Store descrip
29f0: 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tion here */.){.
2a00: 20 20 69 6e 74 20 69 3b 0a 20 20 69 36 34 20 6e    int i;.  i64 n
2a10: 44 65 73 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Desc = 0;.  int 
2a20: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 65 66  n = 0;.  int lef
2a30: 74 43 68 69 6c 64 3b 0a 20 20 69 36 34 20 6e 50  tChild;.  i64 nP
2a40: 61 79 6c 6f 61 64 3b 0a 20 20 69 36 34 20 72 6f  ayload;.  i64 ro
2a50: 77 69 64 3b 0a 20 20 69 36 34 20 6e 4c 6f 63 61  wid;.  i64 nLoca
2a60: 6c 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  l;.  static char
2a70: 20 7a 44 65 73 63 5b 31 30 30 30 5d 3b 0a 20 20   zDesc[1000];.  
2a80: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 54 79  i = 0;.  if( cTy
2a90: 70 65 3c 3d 35 20 29 7b 0a 20 20 20 20 6c 65 66  pe<=5 ){.    lef
2aa0: 74 43 68 69 6c 64 20 3d 20 28 28 61 5b 30 5d 2a  tChild = ((a[0]*
2ab0: 32 35 36 20 2b 20 61 5b 31 5d 29 2a 32 35 36 20  256 + a[1])*256 
2ac0: 2b 20 61 5b 32 5d 29 2a 32 35 36 20 2b 20 61 5b  + a[2])*256 + a[
2ad0: 33 5d 3b 0a 20 20 20 20 61 20 2b 3d 20 34 3b 0a  3];.    a += 4;.
2ae0: 20 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20 20 20      n += 4;.    
2af0: 73 70 72 69 6e 74 66 28 7a 44 65 73 63 2c 20 22  sprintf(zDesc, "
2b00: 6c 78 3a 20 25 64 20 22 2c 20 6c 65 66 74 43 68  lx: %d ", leftCh
2b10: 69 6c 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20  ild);.    nDesc 
2b20: 3d 20 73 74 72 6c 65 6e 28 7a 44 65 73 63 29 3b  = strlen(zDesc);
2b30: 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79 70 65  .  }.  if( cType
2b40: 21 3d 35 20 29 7b 0a 20 20 20 20 69 20 3d 20 64  !=5 ){.    i = d
2b50: 65 63 6f 64 65 56 61 72 69 6e 74 28 61 2c 20 26  ecodeVarint(a, &
2b60: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 61  nPayload);.    a
2b70: 20 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b 3d 20   += i;.    n += 
2b80: 69 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 26  i;.    sprintf(&
2b90: 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20 22 6e  zDesc[nDesc], "n
2ba0: 3a 20 25 6c 6c 64 20 22 2c 20 6e 50 61 79 6c 6f  : %lld ", nPaylo
2bb0: 61 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b  ad);.    nDesc +
2bc0: 3d 20 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b  = strlen(&zDesc[
2bd0: 6e 44 65 73 63 5d 29 3b 0a 20 20 20 20 6e 4c 6f  nDesc]);.    nLo
2be0: 63 61 6c 20 3d 20 6c 6f 63 61 6c 50 61 79 6c 6f  cal = localPaylo
2bf0: 61 64 28 6e 50 61 79 6c 6f 61 64 2c 20 63 54 79  ad(nPayload, cTy
2c00: 70 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pe);.  }else{.  
2c10: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 4c 6f    nPayload = nLo
2c20: 63 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  cal = 0;.  }.  i
2c30: 66 28 20 63 54 79 70 65 3d 3d 35 20 7c 7c 20 63  f( cType==5 || c
2c40: 54 79 70 65 3d 3d 31 33 20 29 7b 0a 20 20 20 20  Type==13 ){.    
2c50: 69 20 3d 20 64 65 63 6f 64 65 56 61 72 69 6e 74  i = decodeVarint
2c60: 28 61 2c 20 26 72 6f 77 69 64 29 3b 0a 20 20 20  (a, &rowid);.   
2c70: 20 61 20 2b 3d 20 69 3b 0a 20 20 20 20 6e 20 2b   a += i;.    n +
2c80: 3d 20 69 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  = i;.    sprintf
2c90: 28 26 7a 44 65 73 63 5b 6e 44 65 73 63 5d 2c 20  (&zDesc[nDesc], 
2ca0: 22 72 3a 20 25 6c 6c 64 20 22 2c 20 72 6f 77 69  "r: %lld ", rowi
2cb0: 64 29 3b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d  d);.    nDesc +=
2cc0: 20 73 74 72 6c 65 6e 28 26 7a 44 65 73 63 5b 6e   strlen(&zDesc[n
2cd0: 44 65 73 63 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  Desc]);.  }.  if
2ce0: 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79 6c 6f 61  ( nLocal<nPayloa
2cf0: 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 76 66  d ){.    int ovf
2d00: 6c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  l;.    unsigned 
2d10: 63 68 61 72 20 2a 62 20 3d 20 26 61 5b 6e 4c 6f  char *b = &a[nLo
2d20: 63 61 6c 5d 3b 0a 20 20 20 20 6f 76 66 6c 20 3d  cal];.    ovfl =
2d30: 20 28 28 62 5b 30 5d 2a 32 35 36 20 2b 20 62 5b   ((b[0]*256 + b[
2d40: 31 5d 29 2a 32 35 36 20 2b 20 62 5b 32 5d 29 2a  1])*256 + b[2])*
2d50: 32 35 36 20 2b 20 62 5b 33 5d 3b 0a 20 20 20 20  256 + b[3];.    
2d60: 73 70 72 69 6e 74 66 28 26 7a 44 65 73 63 5b 6e  sprintf(&zDesc[n
2d70: 44 65 73 63 5d 2c 20 22 6f 76 3a 20 25 64 20 22  Desc], "ov: %d "
2d80: 2c 20 6f 76 66 6c 29 3b 0a 20 20 20 20 6e 44 65  , ovfl);.    nDe
2d90: 73 63 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 44  sc += strlen(&zD
2da0: 65 73 63 5b 6e 44 65 73 63 5d 29 3b 0a 20 20 20  esc[nDesc]);.   
2db0: 20 6e 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69   n += 4;.  }.  i
2dc0: 66 28 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65  f( showCellConte
2dd0: 6e 74 20 26 26 20 63 54 79 70 65 21 3d 35 20 29  nt && cType!=5 )
2de0: 7b 0a 20 20 20 20 6e 44 65 73 63 20 2b 3d 20 64  {.    nDesc += d
2df0: 65 73 63 72 69 62 65 43 6f 6e 74 65 6e 74 28 61  escribeContent(a
2e00: 2c 20 6e 4c 6f 63 61 6c 2c 20 26 7a 44 65 73 63  , nLocal, &zDesc
2e10: 5b 6e 44 65 73 63 2d 31 5d 29 3b 0a 20 20 7d 0a  [nDesc-1]);.  }.
2e20: 20 20 2a 70 7a 44 65 73 63 20 3d 20 7a 44 65 73    *pzDesc = zDes
2e30: 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 4c 6f 63  c;.  return nLoc
2e40: 61 6c 2b 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  al+n;.}../* Prin
2e50: 74 20 61 6e 20 6f 66 66 73 65 74 20 66 6f 6c 6c  t an offset foll
2e60: 6f 77 65 64 20 62 79 20 6e 42 79 74 65 20 62 79  owed by nByte by
2e70: 74 65 73 2e 20 20 41 64 64 20 65 78 74 72 61 20  tes.  Add extra 
2e80: 77 68 69 74 65 2d 73 70 61 63 65 0a 2a 2a 20 61  white-space.** a
2e90: 74 20 74 68 65 20 65 6e 64 20 73 6f 20 74 68 61  t the end so tha
2ea0: 74 20 73 75 62 73 65 71 75 65 6e 74 20 74 65 78  t subsequent tex
2eb0: 74 20 69 73 20 61 6c 69 67 6e 65 64 2e 0a 2a 2f  t is aligned..*/
2ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
2ed0: 6e 74 42 79 74 65 73 28 0a 20 20 75 6e 73 69 67  ntBytes(.  unsig
2ee0: 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 2c  ned char *aData,
2ef0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2f00: 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
2f10: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2f20: 72 20 2a 61 53 74 61 72 74 2c 20 20 20 20 20 2f  r *aStart,     /
2f30: 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 6e 74 65  * Start of conte
2f40: 6e 74 20 74 6f 20 62 65 20 70 72 69 6e 74 65 64  nt to be printed
2f50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2f80: 74 65 73 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a  tes to print */.
2f90: 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 70 72  ){.  int j;.  pr
2fa0: 69 6e 74 66 28 22 20 25 30 33 78 3a 20 22 2c 20  intf(" %03x: ", 
2fb0: 28 69 6e 74 29 28 61 53 74 61 72 74 2d 61 44 61  (int)(aStart-aDa
2fc0: 74 61 29 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  ta));.  for(j=0;
2fd0: 20 6a 3c 39 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<9; j++){.    
2fe0: 69 66 28 20 6a 3e 3d 6e 42 79 74 65 20 29 7b 0a  if( j>=nByte ){.
2ff0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20        printf("  
3000: 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
3010: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 30        printf("%0
3020: 32 78 20 22 2c 20 61 53 74 61 72 74 5b 6a 5d 29  2x ", aStart[j])
3030: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
3040: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 66 75  /*.** Write a fu
3050: 6c 6c 20 64 65 63 6f 64 65 20 6f 6e 20 73 74 64  ll decode on std
3060: 6f 75 74 20 66 6f 72 20 74 68 65 20 63 65 6c 6c  out for the cell
3070: 20 61 74 20 61 5b 6f 66 73 74 5d 2e 0a 2a 2a 20   at a[ofst]..** 
3080: 41 73 73 75 6d 65 20 74 68 65 20 70 61 67 65 20  Assume the page 
3090: 63 6f 6e 74 61 69 6e 73 20 61 20 68 65 61 64 65  contains a heade
30a0: 72 20 6f 66 20 73 69 7a 65 20 73 7a 50 67 48 64  r of size szPgHd
30b0: 72 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  r bytes..*/.stat
30c0: 69 63 20 76 6f 69 64 20 64 65 63 6f 64 65 43 65  ic void decodeCe
30d0: 6c 6c 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll(.  unsigned c
30e0: 68 61 72 20 2a 61 2c 20 20 20 20 20 20 20 2f 2a  har *a,       /*
30f0: 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 28 77   Page content (w
3100: 69 74 68 6f 75 74 20 74 68 65 20 70 61 67 65 2d  ithout the page-
3110: 31 20 68 65 61 64 65 72 29 20 2a 2f 0a 20 20 75  1 header) */.  u
3120: 6e 73 69 67 6e 65 64 20 70 67 6e 6f 2c 20 20 20  nsigned pgno,   
3130: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
3140: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  umber */.  int i
3150: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
3160: 20 20 20 2f 2a 20 43 65 6c 6c 20 69 6e 64 65 78     /* Cell index
3170: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 67 48 64   */.  int szPgHd
3180: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
3190: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
31a0: 65 20 68 65 61 64 65 72 2e 20 20 30 20 6f 72 20  e header.  0 or 
31b0: 31 30 30 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  100 */.  int ofs
31c0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
31d0: 20 2f 2a 20 43 65 6c 6c 20 62 65 67 69 6e 73 20   /* Cell begins 
31e0: 61 74 20 61 5b 6f 66 73 74 5d 20 2a 2f 0a 29 7b  at a[ofst] */.){
31f0: 0a 20 20 69 6e 74 20 69 2c 20 6a 20 3d 20 30 3b  .  int i, j = 0;
3200: 0a 20 20 69 6e 74 20 6c 65 66 74 43 68 69 6c 64  .  int leftChild
3210: 3b 0a 20 20 69 36 34 20 6b 3b 0a 20 20 69 36 34  ;.  i64 k;.  i64
3220: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69 36 34   nPayload;.  i64
3230: 20 72 6f 77 69 64 3b 0a 20 20 69 36 34 20 6e 48   rowid;.  i64 nH
3240: 64 72 3b 0a 20 20 69 36 34 20 69 54 79 70 65 3b  dr;.  i64 iType;
3250: 0a 20 20 69 36 34 20 6e 4c 6f 63 61 6c 3b 0a 20  .  i64 nLocal;. 
3260: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3270: 78 20 3d 20 61 20 2b 20 6f 66 73 74 3b 0a 20 20  x = a + ofst;.  
3280: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 65  unsigned char *e
3290: 6e 64 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  nd;.  unsigned c
32a0: 68 61 72 20 63 54 79 70 65 20 3d 20 61 5b 30 5d  har cType = a[0]
32b0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30  ;.  int nCol = 0
32c0: 3b 0a 20 20 69 6e 74 20 73 7a 43 6f 6c 5b 32 30  ;.  int szCol[20
32d0: 30 30 5d 3b 0a 20 20 69 6e 74 20 6f 66 73 74 43  00];.  int ofstC
32e0: 6f 6c 5b 32 30 30 30 5d 3b 0a 20 20 69 6e 74 20  ol[2000];.  int 
32f0: 74 79 70 65 43 6f 6c 5b 32 30 30 30 5d 3b 0a 0a  typeCol[2000];..
3300: 20 20 70 72 69 6e 74 66 28 22 43 65 6c 6c 5b 25    printf("Cell[%
3310: 64 5d 3a 5c 6e 22 2c 20 69 43 65 6c 6c 29 3b 0a  d]:\n", iCell);.
3320: 20 20 69 66 28 20 63 54 79 70 65 3c 3d 35 20 29    if( cType<=5 )
3330: 7b 0a 20 20 20 20 6c 65 66 74 43 68 69 6c 64 20  {.    leftChild 
3340: 3d 20 28 28 78 5b 30 5d 2a 32 35 36 20 2b 20 78  = ((x[0]*256 + x
3350: 5b 31 5d 29 2a 32 35 36 20 2b 20 78 5b 32 5d 29  [1])*256 + x[2])
3360: 2a 32 35 36 20 2b 20 78 5b 33 5d 3b 0a 20 20 20  *256 + x[3];.   
3370: 20 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20 78   printBytes(a, x
3380: 2c 20 34 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , 4);.    printf
3390: 28 22 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67  ("left child pag
33a0: 65 3a 3a 20 25 64 5c 6e 22 2c 20 6c 65 66 74 43  e:: %d\n", leftC
33b0: 68 69 6c 64 29 3b 0a 20 20 20 20 78 20 2b 3d 20  hild);.    x += 
33c0: 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 54 79  4;.  }.  if( cTy
33d0: 70 65 21 3d 35 20 29 7b 0a 20 20 20 20 69 20 3d  pe!=5 ){.    i =
33e0: 20 64 65 63 6f 64 65 56 61 72 69 6e 74 28 78 2c   decodeVarint(x,
33f0: 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20   &nPayload);.   
3400: 20 70 72 69 6e 74 42 79 74 65 73 28 61 2c 20 78   printBytes(a, x
3410: 2c 20 69 29 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c  , i);.    nLocal
3420: 20 3d 20 6c 6f 63 61 6c 50 61 79 6c 6f 61 64 28   = localPayload(
3430: 6e 50 61 79 6c 6f 61 64 2c 20 63 54 79 70 65 29  nPayload, cType)
3440: 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
3450: 3d 3d 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ==nPayload ){.  
3460: 20 20 20 20 70 72 69 6e 74 66 28 22 70 61 79 6c      printf("payl
3470: 6f 61 64 2d 73 69 7a 65 3a 20 25 6c 6c 64 5c 6e  oad-size: %lld\n
3480: 22 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ", nPayload);.  
3490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
34a0: 72 69 6e 74 66 28 22 70 61 79 6c 6f 61 64 2d 73  rintf("payload-s
34b0: 69 7a 65 3a 20 25 6c 6c 64 20 28 25 6c 6c 64 20  ize: %lld (%lld 
34c0: 6c 6f 63 61 6c 2c 20 25 6c 6c 64 20 6f 76 65 72  local, %lld over
34d0: 66 6c 6f 77 29 5c 6e 22 2c 0a 20 20 20 20 20 20  flow)\n",.      
34e0: 20 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 2c         nPayload,
34f0: 20 6e 4c 6f 63 61 6c 2c 20 6e 50 61 79 6c 6f 61   nLocal, nPayloa
3500: 64 2d 6e 4c 6f 63 61 6c 29 3b 0a 20 20 20 20 7d  d-nLocal);.    }
3510: 0a 20 20 20 20 78 20 2b 3d 20 69 3b 0a 20 20 7d  .    x += i;.  }
3520: 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  else{.    nPaylo
3530: 61 64 20 3d 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b  ad = nLocal = 0;
3540: 0a 20 20 7d 0a 20 20 65 6e 64 20 3d 20 78 20 2b  .  }.  end = x +
3550: 20 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 63   nLocal;.  if( c
3560: 54 79 70 65 3d 3d 35 20 7c 7c 20 63 54 79 70 65  Type==5 || cType
3570: 3d 3d 31 33 20 29 7b 0a 20 20 20 20 69 20 3d 20  ==13 ){.    i = 
3580: 64 65 63 6f 64 65 56 61 72 69 6e 74 28 78 2c 20  decodeVarint(x, 
3590: 26 72 6f 77 69 64 29 3b 0a 20 20 20 20 70 72 69  &rowid);.    pri
35a0: 6e 74 42 79 74 65 73 28 61 2c 20 78 2c 20 69 29  ntBytes(a, x, i)
35b0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 72 6f  ;.    printf("ro
35c0: 77 69 64 3a 20 25 6c 6c 64 5c 6e 22 2c 20 72 6f  wid: %lld\n", ro
35d0: 77 69 64 29 3b 0a 20 20 20 20 78 20 2b 3d 20 69  wid);.    x += i
35e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
35f0: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 69 20 3d 20  al>0 ){.    i = 
3600: 64 65 63 6f 64 65 56 61 72 69 6e 74 28 78 2c 20  decodeVarint(x, 
3610: 26 6e 48 64 72 29 3b 0a 20 20 20 20 70 72 69 6e  &nHdr);.    prin
3620: 74 42 79 74 65 73 28 61 2c 20 78 2c 20 69 29 3b  tBytes(a, x, i);
3630: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 72 65 63  .    printf("rec
3640: 6f 72 64 2d 68 65 61 64 65 72 2d 73 69 7a 65 3a  ord-header-size:
3650: 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 6e 48 64   %d\n", (int)nHd
3660: 72 29 3b 0a 20 20 20 20 6a 20 3d 20 69 3b 0a 20  r);.    j = i;. 
3670: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
3680: 20 6b 20 3d 20 6e 48 64 72 3b 0a 20 20 20 20 77   k = nHdr;.    w
3690: 68 69 6c 65 28 20 78 2b 6a 3c 65 6e 64 20 26 26  hile( x+j<end &&
36a0: 20 6a 3c 6e 48 64 72 20 29 7b 0a 20 20 20 20 20   j<nHdr ){.     
36b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
36c0: 79 70 65 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ypeName;.       
36d0: 69 6e 74 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20  int sz = 0;.    
36e0: 20 20 20 63 68 61 72 20 7a 4e 6d 5b 33 30 5d 3b     char zNm[30];
36f0: 0a 20 20 20 20 20 20 20 69 20 3d 20 64 65 63 6f  .       i = deco
3700: 64 65 56 61 72 69 6e 74 28 78 2b 6a 2c 20 26 69  deVarint(x+j, &i
3710: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 70 72  Type);.       pr
3720: 69 6e 74 42 79 74 65 73 28 61 2c 20 78 2b 6a 2c  intBytes(a, x+j,
3730: 20 69 29 3b 0a 20 20 20 20 20 20 20 70 72 69 6e   i);.       prin
3740: 74 66 28 22 74 79 70 65 63 6f 64 65 5b 25 64 5d  tf("typecode[%d]
3750: 3a 20 25 64 20 2d 20 22 2c 20 6e 43 6f 6c 2c 20  : %d - ", nCol, 
3760: 28 69 6e 74 29 69 54 79 70 65 29 3b 0a 20 20 20  (int)iType);.   
3770: 20 20 20 20 73 77 69 74 63 68 28 20 69 54 79 70      switch( iTyp
3780: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  e ){.         ca
3790: 73 65 20 30 3a 20 20 7a 54 79 70 65 4e 61 6d 65  se 0:  zTypeName
37a0: 20 3d 20 22 4e 55 4c 4c 22 3b 20 20 20 20 73 7a   = "NULL";    sz
37b0: 20 3d 20 30 3b 20 20 62 72 65 61 6b 3b 0a 20 20   = 0;  break;.  
37c0: 20 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20         case 1:  
37d0: 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74  zTypeName = "int
37e0: 38 22 3b 20 20 20 20 73 7a 20 3d 20 31 3b 20 20  8";    sz = 1;  
37f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
3800: 63 61 73 65 20 32 3a 20 20 7a 54 79 70 65 4e 61  case 2:  zTypeNa
3810: 6d 65 20 3d 20 22 69 6e 74 31 36 22 3b 20 20 20  me = "int16";   
3820: 73 7a 20 3d 20 32 3b 20 20 62 72 65 61 6b 3b 0a  sz = 2;  break;.
3830: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 33 3a           case 3:
3840: 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22 69    zTypeName = "i
3850: 6e 74 32 34 22 3b 20 20 20 73 7a 20 3d 20 33 3b  nt24";   sz = 3;
3860: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3870: 20 20 63 61 73 65 20 34 3a 20 20 7a 54 79 70 65    case 4:  zType
3880: 4e 61 6d 65 20 3d 20 22 69 6e 74 33 32 22 3b 20  Name = "int32"; 
3890: 20 20 73 7a 20 3d 20 34 3b 20 20 62 72 65 61 6b    sz = 4;  break
38a0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
38b0: 35 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20  5:  zTypeName = 
38c0: 22 69 6e 74 34 38 22 3b 20 20 20 73 7a 20 3d 20  "int48";   sz = 
38d0: 36 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  6;  break;.     
38e0: 20 20 20 20 63 61 73 65 20 36 3a 20 20 7a 54 79      case 6:  zTy
38f0: 70 65 4e 61 6d 65 20 3d 20 22 69 6e 74 36 34 22  peName = "int64"
3900: 3b 20 20 20 73 7a 20 3d 20 38 3b 20 20 62 72 65  ;   sz = 8;  bre
3910: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
3920: 65 20 37 3a 20 20 7a 54 79 70 65 4e 61 6d 65 20  e 7:  zTypeName 
3930: 3d 20 22 64 6f 75 62 6c 65 22 3b 20 20 73 7a 20  = "double";  sz 
3940: 3d 20 38 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  = 8;  break;.   
3950: 20 20 20 20 20 20 63 61 73 65 20 38 3a 20 20 7a        case 8:  z
3960: 54 79 70 65 4e 61 6d 65 20 3d 20 22 7a 65 72 6f  TypeName = "zero
3970: 22 3b 20 20 20 20 73 7a 20 3d 20 30 3b 20 20 62  ";    sz = 0;  b
3980: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
3990: 61 73 65 20 39 3a 20 20 7a 54 79 70 65 4e 61 6d  ase 9:  zTypeNam
39a0: 65 20 3d 20 22 6f 6e 65 22 3b 20 20 20 20 20 73  e = "one";     s
39b0: 7a 20 3d 20 30 3b 20 20 62 72 65 61 6b 3b 0a 20  z = 0;  break;. 
39c0: 20 20 20 20 20 20 20 20 63 61 73 65 20 31 30 3a          case 10:
39d0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 31  .         case 1
39e0: 31 3a 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 22  1: zTypeName = "
39f0: 65 72 72 6f 72 22 3b 20 20 20 73 7a 20 3d 20 30  error";   sz = 0
3a00: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
3a10: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
3a20: 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 28 69           sz = (i
3a30: 6e 74 29 28 69 54 79 70 65 2d 31 32 29 2f 32 3b  nt)(iType-12)/2;
3a40: 0a 20 20 20 20 20 20 20 20 20 20 20 73 70 72 69  .           spri
3a50: 6e 74 66 28 7a 4e 6d 2c 20 28 69 54 79 70 65 26  ntf(zNm, (iType&
3a60: 31 29 3d 3d 30 20 3f 20 22 62 6c 6f 62 28 25 64  1)==0 ? "blob(%d
3a70: 29 22 20 3a 20 22 74 65 78 74 28 25 64 29 22 2c  )" : "text(%d)",
3a80: 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20   sz);.          
3a90: 20 7a 54 79 70 65 4e 61 6d 65 20 3d 20 7a 4e 6d   zTypeName = zNm
3aa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;.           bre
3ab0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  ak;.         }. 
3ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
3ad0: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 54  rintf("%s\n", zT
3ae0: 79 70 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ypeName);.      
3af0: 20 73 7a 43 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 73   szCol[nCol] = s
3b00: 7a 3b 0a 20 20 20 20 20 20 20 6f 66 73 74 43 6f  z;.       ofstCo
3b10: 6c 5b 6e 43 6f 6c 5d 20 3d 20 28 69 6e 74 29 6b  l[nCol] = (int)k
3b20: 3b 0a 20 20 20 20 20 20 20 74 79 70 65 43 6f 6c  ;.       typeCol
3b30: 5b 6e 43 6f 6c 5d 20 3d 20 28 69 6e 74 29 69 54  [nCol] = (int)iT
3b40: 79 70 65 3b 0a 20 20 20 20 20 20 20 6b 20 2b 3d  ype;.       k +=
3b50: 20 73 7a 3b 0a 20 20 20 20 20 20 20 6e 43 6f 6c   sz;.       nCol
3b60: 2b 2b 3b 0a 20 20 20 20 20 20 20 6a 20 2b 3d 20  ++;.       j += 
3b70: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  i;.    }.    for
3b80: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  (i=0; i<nCol && 
3b90: 6f 66 73 74 43 6f 6c 5b 69 5d 2b 73 7a 43 6f 6c  ofstCol[i]+szCol
3ba0: 5b 69 5d 3c 3d 6e 4c 6f 63 61 6c 3b 20 69 2b 2b  [i]<=nLocal; i++
3bb0: 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 73 20  ){.       int s 
3bc0: 3d 20 6f 66 73 74 43 6f 6c 5b 69 5d 3b 0a 20 20  = ofstCol[i];.  
3bd0: 20 20 20 20 20 69 36 34 20 76 3b 0a 20 20 20 20       i64 v;.    
3be0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
3bf0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 3b 0a 20  d char *pData;. 
3c00: 20 20 20 20 20 20 69 66 28 20 73 7a 43 6f 6c 5b        if( szCol[
3c10: 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
3c20: 3b 0a 20 20 20 20 20 20 20 70 72 69 6e 74 42 79  ;.       printBy
3c30: 74 65 73 28 61 2c 20 78 2b 73 2c 20 73 7a 43 6f  tes(a, x+s, szCo
3c40: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 70 72  l[i]);.       pr
3c50: 69 6e 74 66 28 22 64 61 74 61 5b 25 64 5d 3a 20  intf("data[%d]: 
3c60: 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 70 44  ", i);.       pD
3c70: 61 74 61 20 3d 20 78 2b 73 3b 0a 20 20 20 20 20  ata = x+s;.     
3c80: 20 20 69 66 28 20 74 79 70 65 43 6f 6c 5b 69 5d    if( typeCol[i]
3c90: 3c 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=7 ){.         
3ca0: 76 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  v = (signed char
3cb0: 29 70 44 61 74 61 5b 30 5d 3b 0a 20 20 20 20 20  )pData[0];.     
3cc0: 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73      for(k=1; k<s
3cd0: 7a 43 6f 6c 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20  zCol[i]; k++){. 
3ce0: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 28 76            v = (v
3cf0: 3c 3c 38 29 20 2b 20 70 44 61 74 61 5b 6b 5d 3b  <<8) + pData[k];
3d00: 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  .         }.    
3d10: 20 20 20 20 20 69 66 28 20 74 79 70 65 43 6f 6c       if( typeCol
3d20: 5b 69 5d 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  [i]==7 ){.      
3d30: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20       double r;. 
3d40: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
3d50: 28 26 72 2c 20 26 76 2c 20 73 69 7a 65 6f 66 28  (&r, &v, sizeof(
3d60: 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r));.           
3d70: 70 72 69 6e 74 66 28 22 25 23 67 5c 6e 22 2c 20  printf("%#g\n", 
3d80: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 7d 65 6c  r);.         }el
3d90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70  se{.           p
3da0: 72 69 6e 74 66 28 22 25 6c 6c 64 5c 6e 22 2c 20  rintf("%lld\n", 
3db0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20  v);.         }. 
3dc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3dd0: 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a        int ii, jj
3de0: 3b 0a 20 20 20 20 20 20 20 20 20 63 68 61 72 20  ;.         char 
3df0: 7a 43 6f 6e 73 74 5b 33 32 5d 3b 0a 20 20 20 20  zConst[32];.    
3e00: 20 20 20 20 20 69 66 28 20 28 74 79 70 65 43 6f       if( (typeCo
3e10: 6c 5b 69 5d 26 31 29 3d 3d 30 20 29 7b 0a 20 20  l[i]&1)==0 ){.  
3e20: 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 73 74 5b           zConst[
3e30: 30 5d 20 3d 20 27 78 27 3b 0a 20 20 20 20 20 20  0] = 'x';.      
3e40: 20 20 20 20 20 7a 43 6f 6e 73 74 5b 31 5d 20 3d       zConst[1] =
3e50: 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 20   '\'';.         
3e60: 20 20 66 6f 72 28 69 69 3d 32 2c 20 6a 6a 3d 30    for(ii=2, jj=0
3e70: 3b 20 6a 6a 3c 73 7a 43 6f 6c 5b 69 5d 20 26 26  ; jj<szCol[i] &&
3e80: 20 69 69 3c 32 34 3b 20 6a 6a 2b 2b 2c 20 69 69   ii<24; jj++, ii
3e90: 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +=2){.          
3ea0: 20 20 20 73 70 72 69 6e 74 66 28 7a 43 6f 6e 73     sprintf(zCons
3eb0: 74 2b 69 69 2c 20 22 25 30 32 78 22 2c 20 70 44  t+ii, "%02x", pD
3ec0: 61 74 61 5b 6a 6a 5d 29 3b 0a 20 20 20 20 20 20  ata[jj]);.      
3ed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3ef0: 20 20 7a 43 6f 6e 73 74 5b 30 5d 20 3d 20 27 5c    zConst[0] = '\
3f00: 27 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 66  '';.           f
3f10: 6f 72 28 69 69 3d 31 2c 20 6a 6a 3d 30 3b 20 6a  or(ii=1, jj=0; j
3f20: 6a 3c 73 7a 43 6f 6c 5b 69 5d 20 26 26 20 69 69  j<szCol[i] && ii
3f30: 3c 32 34 3b 20 6a 6a 2b 2b 2c 20 69 69 2b 2b 29  <24; jj++, ii++)
3f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  {.             z
3f50: 43 6f 6e 73 74 5b 69 69 5d 20 3d 20 69 73 70 72  Const[ii] = ispr
3f60: 69 6e 74 28 70 44 61 74 61 5b 6a 6a 5d 29 20 3f  int(pData[jj]) ?
3f70: 20 70 44 61 74 61 5b 6a 6a 5d 20 3a 20 27 2e 27   pData[jj] : '.'
3f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
3f90: 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 73 74            zConst
3fa0: 5b 69 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  [ii] = 0;.      
3fb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 69 66     }.         if
3fc0: 28 20 6a 6a 3c 73 7a 43 6f 6c 5b 69 5d 20 29 7b  ( jj<szCol[i] ){
3fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  .           memc
3fe0: 70 79 28 7a 43 6f 6e 73 74 2b 69 69 2c 20 22 2e  py(zConst+ii, ".
3ff0: 2e 2e 27 22 2c 20 35 29 3b 0a 20 20 20 20 20 20  ..'", 5);.      
4000: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4010: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 6e       memcpy(zCon
4020: 73 74 2b 69 69 2c 20 22 27 22 2c 20 32 29 3b 0a  st+ii, "'", 2);.
4030: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4040: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e      printf("%s\n
4050: 22 2c 20 7a 43 6f 6e 73 74 29 3b 0a 20 20 20 20  ", zConst);.    
4060: 20 20 20 7d 0a 20 20 20 20 20 20 20 6a 20 3d 20     }.       j = 
4070: 6f 66 73 74 43 6f 6c 5b 69 5d 20 2b 20 73 7a 43  ofstCol[i] + szC
4080: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ol[i];.    }.  }
4090: 0a 20 20 69 66 28 20 6a 3c 6e 4c 6f 63 61 6c 20  .  if( j<nLocal 
40a0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 42 79 74 65  ){.    printByte
40b0: 73 28 61 2c 20 78 2b 6a 2c 20 30 29 3b 0a 20 20  s(a, x+j, 0);.  
40c0: 20 20 70 72 69 6e 74 66 28 22 2e 2e 2e 20 25 6c    printf("... %l
40d0: 6c 64 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74  ld bytes of cont
40e0: 65 6e 74 20 2e 2e 2e 5c 6e 22 2c 20 6e 4c 6f 63  ent ...\n", nLoc
40f0: 61 6c 2d 6a 29 3b 0a 20 20 7d 0a 20 20 69 66 28  al-j);.  }.  if(
4100: 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79 6c 6f 61 64   nLocal<nPayload
4110: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 42 79 74   ){.    printByt
4120: 65 73 28 61 2c 20 78 2b 6e 4c 6f 63 61 6c 2c 20  es(a, x+nLocal, 
4130: 34 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  4);.    printf("
4140: 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 3a 20 25  overflow-page: %
4150: 64 5c 6e 22 2c 20 64 65 63 6f 64 65 49 6e 74 33  d\n", decodeInt3
4160: 32 28 78 2b 6e 4c 6f 63 61 6c 29 29 3b 0a 20 20  2(x+nLocal));.  
4170: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  }.}.../*.** Deco
4180: 64 65 20 61 20 62 74 72 65 65 20 70 61 67 65 0a  de a btree page.
4190: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
41a0: 65 63 6f 64 65 5f 62 74 72 65 65 5f 70 61 67 65  ecode_btree_page
41b0: 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  (.  unsigned cha
41c0: 72 20 2a 61 2c 20 20 20 2f 2a 20 50 61 67 65 20  r *a,   /* Page 
41d0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
41e0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
41f0: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
4200: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 53 69 7a 65  */.  int hdrSize
4210: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ,        /* Size
4220: 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
4230: 64 65 72 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  der.  0 or 100 *
4240: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72 67 73 20  /.  char *zArgs 
4250: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
4260: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 66 6f 72 6d   to control form
4270: 61 74 74 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63  atting */.){.  c
4280: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
4290: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20   = "unknown";.  
42a0: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74  int nCell;.  int
42b0: 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 69 43 65   i, j;.  int iCe
42c0: 6c 6c 50 74 72 3b 0a 20 20 69 6e 74 20 73 68 6f  llPtr;.  int sho
42d0: 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 20 3d 20 30  wCellContent = 0
42e0: 3b 0a 20 20 69 6e 74 20 73 68 6f 77 4d 61 70 20  ;.  int showMap 
42f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 54  = 0;.  int cellT
4300: 6f 44 65 63 6f 64 65 20 3d 20 2d 32 3b 0a 20 20  oDecode = -2;.  
4310: 63 68 61 72 20 2a 7a 4d 61 70 20 3d 20 30 3b 0a  char *zMap = 0;.
4320: 20 20 73 77 69 74 63 68 28 20 61 5b 30 5d 20 29    switch( a[0] )
4330: 7b 0a 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a  {.    case 2:  z
4340: 54 79 70 65 20 3d 20 22 69 6e 64 65 78 20 69 6e  Type = "index in
4350: 74 65 72 69 6f 72 20 6e 6f 64 65 22 3b 20 20 62  terior node";  b
4360: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 35  reak;.    case 5
4370: 3a 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c  :  zType = "tabl
4380: 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 22  e interior node"
4390: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
43a0: 73 65 20 31 30 3a 20 7a 54 79 70 65 20 3d 20 22  se 10: zType = "
43b0: 69 6e 64 65 78 20 6c 65 61 66 22 3b 20 20 20 20  index leaf";    
43c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
43d0: 20 20 63 61 73 65 20 31 33 3a 20 7a 54 79 70 65    case 13: zType
43e0: 20 3d 20 22 74 61 62 6c 65 20 6c 65 61 66 22 3b   = "table leaf";
43f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
4400: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 7a  ;.  }.  while( z
4410: 41 72 67 73 5b 30 5d 20 29 7b 0a 20 20 20 20 73  Args[0] ){.    s
4420: 77 69 74 63 68 28 20 7a 41 72 67 73 5b 30 5d 20  witch( zArgs[0] 
4430: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 63  ){.      case 'c
4440: 27 3a 20 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65  ': showCellConte
4450: 6e 74 20 3d 20 31 3b 20 20 62 72 65 61 6b 3b 0a  nt = 1;  break;.
4460: 20 20 20 20 20 20 63 61 73 65 20 27 6d 27 3a 20        case 'm': 
4470: 73 68 6f 77 4d 61 70 20 3d 20 31 3b 20 20 20 20  showMap = 1;    
4480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4490: 20 20 20 63 61 73 65 20 27 64 27 3a 20 7b 0a 20     case 'd': {. 
44a0: 20 20 20 20 20 20 20 69 66 28 20 21 69 73 64 69         if( !isdi
44b0: 67 69 74 28 7a 41 72 67 73 5b 31 5d 29 20 29 7b  git(zArgs[1]) ){
44c0: 0a 20 20 20 20 20 20 20 20 20 20 63 65 6c 6c 54  .          cellT
44d0: 6f 44 65 63 6f 64 65 20 3d 20 2d 31 3b 0a 20 20  oDecode = -1;.  
44e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
44f0: 20 20 20 20 20 20 20 63 65 6c 6c 54 6f 44 65 63         cellToDec
4500: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
4510: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
4520: 74 28 7a 41 72 67 73 5b 31 5d 29 20 29 7b 0a 20  t(zArgs[1]) ){. 
4530: 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 73             zArgs
4540: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
4550: 63 65 6c 6c 54 6f 44 65 63 6f 64 65 20 3d 20 63  cellToDecode = c
4560: 65 6c 6c 54 6f 44 65 63 6f 64 65 2a 31 30 20 2b  ellToDecode*10 +
4570: 20 7a 41 72 67 73 5b 30 5d 20 2d 20 27 30 27 3b   zArgs[0] - '0';
4580: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
45a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
45b0: 20 20 7d 0a 20 20 20 20 7a 41 72 67 73 2b 2b 3b    }.    zArgs++;
45c0: 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 61  .  }.  nCell = a
45d0: 5b 33 5d 2a 32 35 36 20 2b 20 61 5b 34 5d 3b 0a  [3]*256 + a[4];.
45e0: 20 20 69 43 65 6c 6c 50 74 72 20 3d 20 28 61 5b    iCellPtr = (a[
45f0: 30 5d 3d 3d 32 20 7c 7c 20 61 5b 30 5d 3d 3d 35  0]==2 || a[0]==5
4600: 29 20 3f 20 31 32 20 3a 20 38 3b 0a 20 20 69 66  ) ? 12 : 8;.  if
4610: 28 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65 3e 3d  ( cellToDecode>=
4620: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 72 69  nCell ){.    pri
4630: 6e 74 66 28 22 50 61 67 65 20 25 64 20 68 61 73  ntf("Page %d has
4640: 20 6f 6e 6c 79 20 25 64 20 63 65 6c 6c 73 5c 6e   only %d cells\n
4650: 22 2c 20 70 67 6e 6f 2c 20 6e 43 65 6c 6c 29 3b  ", pgno, nCell);
4660: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4670: 0a 20 20 70 72 69 6e 74 66 28 22 48 65 61 64 65  .  printf("Heade
4680: 72 20 6f 6e 20 62 74 72 65 65 20 70 61 67 65 20  r on btree page 
4690: 25 64 3a 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a 20  %d:\n", pgno);. 
46a0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
46b0: 6e 65 28 61 2c 20 30 2c 20 31 2c 20 7a 54 79 70  ne(a, 0, 1, zTyp
46c0: 65 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  e);.  print_deco
46d0: 64 65 5f 6c 69 6e 65 28 61 2c 20 31 2c 20 32 2c  de_line(a, 1, 2,
46e0: 20 22 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73   "Offset to firs
46f0: 74 20 66 72 65 65 62 6c 6f 63 6b 22 29 3b 0a 20  t freeblock");. 
4700: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
4710: 6e 65 28 61 2c 20 33 2c 20 32 2c 20 22 4e 75 6d  ne(a, 3, 2, "Num
4720: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
4730: 74 68 69 73 20 70 61 67 65 22 29 3b 0a 20 20 70  this page");.  p
4740: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
4750: 28 61 2c 20 35 2c 20 32 2c 20 22 4f 66 66 73 65  (a, 5, 2, "Offse
4760: 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
4770: 74 20 61 72 65 61 22 29 3b 0a 20 20 70 72 69 6e  t area");.  prin
4780: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c  t_decode_line(a,
4790: 20 37 2c 20 31 2c 20 22 46 72 61 67 6d 65 6e 74   7, 1, "Fragment
47a0: 65 64 20 62 79 74 65 20 63 6f 75 6e 74 22 29 3b  ed byte count");
47b0: 0a 20 20 69 66 28 20 61 5b 30 5d 3d 3d 32 20 7c  .  if( a[0]==2 |
47c0: 7c 20 61 5b 30 5d 3d 3d 35 20 29 7b 0a 20 20 20  | a[0]==5 ){.   
47d0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
47e0: 6e 65 28 61 2c 20 38 2c 20 34 2c 20 22 52 69 67  ne(a, 8, 4, "Rig
47f0: 68 74 20 63 68 69 6c 64 22 29 3b 0a 20 20 7d 0a  ht child");.  }.
4800: 20 20 69 66 28 20 63 65 6c 6c 54 6f 44 65 63 6f    if( cellToDeco
4810: 64 65 3d 3d 28 2d 32 29 20 26 26 20 6e 43 65 6c  de==(-2) && nCel
4820: 6c 3e 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  l>0 ){.    print
4830: 66 28 22 20 6b 65 79 3a 20 6c 78 3d 6c 65 66 74  f(" key: lx=left
4840: 2d 63 68 69 6c 64 20 6e 3d 70 61 79 6c 6f 61 64  -child n=payload
4850: 2d 73 69 7a 65 20 72 3d 72 6f 77 69 64 5c 6e 22  -size r=rowid\n"
4860: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 68 6f  );.  }.  if( sho
4870: 77 4d 61 70 20 29 7b 0a 20 20 20 20 7a 4d 61 70  wMap ){.    zMap
4880: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
4890: 63 28 67 2e 70 61 67 65 73 69 7a 65 29 3b 0a 20  c(g.pagesize);. 
48a0: 20 20 20 6d 65 6d 73 65 74 28 7a 4d 61 70 2c 20     memset(zMap, 
48b0: 27 2e 27 2c 20 67 2e 70 61 67 65 73 69 7a 65 29  '.', g.pagesize)
48c0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 4d 61  ;.    memset(zMa
48d0: 70 2c 20 27 31 27 2c 20 68 64 72 53 69 7a 65 29  p, '1', hdrSize)
48e0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4d  ;.    memset(&zM
48f0: 61 70 5b 68 64 72 53 69 7a 65 5d 2c 20 27 48 27  ap[hdrSize], 'H'
4900: 2c 20 69 43 65 6c 6c 50 74 72 29 3b 0a 20 20 20  , iCellPtr);.   
4910: 20 6d 65 6d 73 65 74 28 26 7a 4d 61 70 5b 68 64   memset(&zMap[hd
4920: 72 53 69 7a 65 2b 69 43 65 6c 6c 50 74 72 5d 2c  rSize+iCellPtr],
4930: 20 27 50 27 2c 20 32 2a 6e 43 65 6c 6c 29 3b 0a   'P', 2*nCell);.
4940: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
4950: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
4960: 20 20 69 6e 74 20 63 6f 66 73 74 20 3d 20 69 43    int cofst = iC
4970: 65 6c 6c 50 74 72 20 2b 20 69 2a 32 3b 0a 20 20  ellPtr + i*2;.  
4980: 20 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20    char *zDesc;. 
4990: 20 20 20 69 36 34 20 6e 3b 0a 0a 20 20 20 20 63     i64 n;..    c
49a0: 6f 66 73 74 20 3d 20 61 5b 63 6f 66 73 74 5d 2a  ofst = a[cofst]*
49b0: 32 35 36 20 2b 20 61 5b 63 6f 66 73 74 2b 31 5d  256 + a[cofst+1]
49c0: 3b 0a 20 20 20 20 6e 20 3d 20 64 65 73 63 72 69  ;.    n = descri
49d0: 62 65 43 65 6c 6c 28 61 5b 30 5d 2c 20 26 61 5b  beCell(a[0], &a[
49e0: 63 6f 66 73 74 2d 68 64 72 53 69 7a 65 5d 2c 20  cofst-hdrSize], 
49f0: 73 68 6f 77 43 65 6c 6c 43 6f 6e 74 65 6e 74 2c  showCellContent,
4a00: 20 26 7a 44 65 73 63 29 3b 0a 20 20 20 20 69 66   &zDesc);.    if
4a10: 28 20 73 68 6f 77 4d 61 70 20 29 7b 0a 20 20 20  ( showMap ){.   
4a20: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d     char zBuf[30]
4a30: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
4a40: 7a 4d 61 70 5b 63 6f 66 73 74 5d 2c 20 27 2a 27  zMap[cofst], '*'
4a50: 2c 20 28 73 69 7a 65 5f 74 29 6e 29 3b 0a 20 20  , (size_t)n);.  
4a60: 20 20 20 20 7a 4d 61 70 5b 63 6f 66 73 74 5d 20      zMap[cofst] 
4a70: 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 7a 4d 61  = '[';.      zMa
4a80: 70 5b 63 6f 66 73 74 2b 6e 2d 31 5d 20 3d 20 27  p[cofst+n-1] = '
4a90: 5d 27 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74  ]';.      sprint
4aa0: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 69 29  f(zBuf, "%d", i)
4ab0: 3b 0a 20 20 20 20 20 20 6a 20 3d 20 28 69 6e 74  ;.      j = (int
4ac0: 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20  )strlen(zBuf);. 
4ad0: 20 20 20 20 20 69 66 28 20 6a 3c 3d 6e 2d 32 20       if( j<=n-2 
4ae0: 29 20 6d 65 6d 63 70 79 28 26 7a 4d 61 70 5b 63  ) memcpy(&zMap[c
4af0: 6f 66 73 74 2b 31 5d 2c 20 7a 42 75 66 2c 20 6a  ofst+1], zBuf, j
4b00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4b10: 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65 3d 3d 28   cellToDecode==(
4b20: 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69  -2) ){.      pri
4b30: 6e 74 66 28 22 20 25 30 33 78 3a 20 63 65 6c 6c  ntf(" %03x: cell
4b40: 5b 25 64 5d 20 25 73 5c 6e 22 2c 20 63 6f 66 73  [%d] %s\n", cofs
4b50: 74 2c 20 69 2c 20 7a 44 65 73 63 29 3b 0a 20 20  t, i, zDesc);.  
4b60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 65 6c 6c    }else if( cell
4b70: 54 6f 44 65 63 6f 64 65 3d 3d 28 2d 31 29 20 7c  ToDecode==(-1) |
4b80: 7c 20 63 65 6c 6c 54 6f 44 65 63 6f 64 65 3d 3d  | cellToDecode==
4b90: 69 20 29 7b 0a 20 20 20 20 20 20 64 65 63 6f 64  i ){.      decod
4ba0: 65 43 65 6c 6c 28 61 2c 20 70 67 6e 6f 2c 20 69  eCell(a, pgno, i
4bb0: 2c 20 68 64 72 53 69 7a 65 2c 20 63 6f 66 73 74  , hdrSize, cofst
4bc0: 2d 68 64 72 53 69 7a 65 29 3b 0a 20 20 20 20 7d  -hdrSize);.    }
4bd0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 68 6f 77 4d  .  }.  if( showM
4be0: 61 70 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ap ){.    printf
4bf0: 28 22 50 61 67 65 20 6d 61 70 3a 20 20 28 48 3d  ("Page map:  (H=
4c00: 68 65 61 64 65 72 20 50 3d 63 65 6c 6c 2d 69 6e  header P=cell-in
4c10: 64 65 78 20 31 3d 70 61 67 65 2d 31 2d 68 65 61  dex 1=page-1-hea
4c20: 64 65 72 20 2e 3d 66 72 65 65 2d 73 70 61 63 65  der .=free-space
4c30: 29 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  )\n");.    for(i
4c40: 3d 30 3b 20 69 3c 67 2e 70 61 67 65 73 69 7a 65  =0; i<g.pagesize
4c50: 3b 20 69 2b 3d 36 34 29 7b 0a 20 20 20 20 20 20  ; i+=64){.      
4c60: 70 72 69 6e 74 66 28 22 20 25 30 33 78 3a 20 25  printf(" %03x: %
4c70: 2e 36 34 73 5c 6e 22 2c 20 69 2c 20 26 7a 4d 61  .64s\n", i, &zMa
4c80: 70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p[i]);.    }.   
4c90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
4ca0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
4cb0: 2a 20 44 65 63 6f 64 65 20 61 20 66 72 65 65 6c  * Decode a freel
4cc0: 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 0a  ist trunk page..
4cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
4ce0: 65 63 6f 64 65 5f 74 72 75 6e 6b 5f 70 61 67 65  ecode_trunk_page
4cf0: 28 0a 20 20 69 6e 74 20 70 67 6e 6f 2c 20 20 20  (.  int pgno,   
4d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4d10: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
4d20: 20 20 69 6e 74 20 64 65 74 61 69 6c 2c 20 20 20    int detail,   
4d30: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20          /* Show 
4d40: 6c 65 61 66 20 70 61 67 65 73 20 69 66 20 74 72  leaf pages if tr
4d50: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 63 75  ue */.  int recu
4d60: 72 73 69 76 65 20 20 20 20 20 20 20 20 20 2f 2a  rsive         /*
4d70: 20 46 6f 6c 6c 6f 77 20 74 68 65 20 74 72 75 6e   Follow the trun
4d80: 6b 20 63 68 61 6e 67 65 20 69 66 20 74 72 75 65  k change if true
4d90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 2c 20   */.){.  int n, 
4da0: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
4db0: 61 72 20 2a 61 3b 0a 20 20 77 68 69 6c 65 28 20  ar *a;.  while( 
4dc0: 70 67 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 61 20  pgno>0 ){.    a 
4dd0: 3d 20 66 69 6c 65 52 65 61 64 28 28 70 67 6e 6f  = fileRead((pgno
4de0: 2d 31 29 2a 67 2e 70 61 67 65 73 69 7a 65 2c 20  -1)*g.pagesize, 
4df0: 67 2e 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 20  g.pagesize);.   
4e00: 20 70 72 69 6e 74 66 28 22 44 65 63 6f 64 65 20   printf("Decode 
4e10: 6f 66 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  of freelist trun
4e20: 6b 20 70 61 67 65 20 25 64 3a 5c 6e 22 2c 20 70  k page %d:\n", p
4e30: 67 6e 6f 29 3b 0a 20 20 20 20 70 72 69 6e 74 5f  gno);.    print_
4e40: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61 2c 20 30  decode_line(a, 0
4e50: 2c 20 34 2c 20 22 4e 65 78 74 20 66 72 65 65 6c  , 4, "Next freel
4e60: 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 22 29  ist trunk page")
4e70: 3b 0a 20 20 20 20 70 72 69 6e 74 5f 64 65 63 6f  ;.    print_deco
4e80: 64 65 5f 6c 69 6e 65 28 61 2c 20 34 2c 20 34 2c  de_line(a, 4, 4,
4e90: 20 22 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72   "Number of entr
4ea0: 69 65 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  ies on this page
4eb0: 22 29 3b 0a 20 20 20 20 69 66 28 20 64 65 74 61  ");.    if( deta
4ec0: 69 6c 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  il ){.      n = 
4ed0: 28 69 6e 74 29 64 65 63 6f 64 65 49 6e 74 33 32  (int)decodeInt32
4ee0: 28 26 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 66  (&a[4]);.      f
4ef0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
4f00: 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  ){.        unsig
4f10: 6e 65 64 20 69 6e 74 20 78 20 3d 20 64 65 63 6f  ned int x = deco
4f20: 64 65 49 6e 74 33 32 28 26 61 5b 38 2b 34 2a 69  deInt32(&a[8+4*i
4f30: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ]);.        char
4f40: 20 7a 49 64 78 5b 31 30 5d 3b 0a 20 20 20 20 20   zIdx[10];.     
4f50: 20 20 20 73 70 72 69 6e 74 66 28 7a 49 64 78 2c     sprintf(zIdx,
4f60: 20 22 5b 25 64 5d 22 2c 20 69 29 3b 0a 20 20 20   "[%d]", i);.   
4f70: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 25       printf("  %
4f80: 35 73 20 25 37 75 22 2c 20 7a 49 64 78 2c 20 78  5s %7u", zIdx, x
4f90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
4fa0: 25 35 3d 3d 34 20 29 20 70 72 69 6e 74 66 28 22  %5==4 ) printf("
4fb0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
4fc0: 20 20 20 20 69 66 28 20 69 25 35 21 3d 30 20 29      if( i%5!=0 )
4fd0: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
4fe0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 72 65     }.    if( !re
4ff0: 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
5000: 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 7d   pgno = 0;.    }
5010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f  else{.      pgno
5020: 20 3d 20 28 69 6e 74 29 64 65 63 6f 64 65 49 6e   = (int)decodeIn
5030: 74 33 32 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20  t32(&a[0]);.    
5040: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
5050: 65 65 28 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(a);.  }.}../*
5060: 0a 2a 2a 20 41 20 73 68 6f 72 74 20 74 65 78 74  .** A short text
5070: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
5080: 75 73 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  use of each page
5090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
50a0: 20 2a 2a 7a 50 61 67 65 55 73 65 3b 0a 0a 2f 2a   **zPageUse;../*
50b0: 0a 2a 2a 20 41 64 64 20 61 20 63 6f 6d 6d 65 6e  .** Add a commen
50c0: 74 20 6f 6e 20 74 68 65 20 75 73 65 20 6f 66 20  t on the use of 
50d0: 61 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  a page..*/.stati
50e0: 63 20 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67  c void page_usag
50f0: 65 5f 6d 73 67 28 69 6e 74 20 70 67 6e 6f 2c 20  e_msg(int pgno, 
5100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
5110: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5120: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
5130: 2a 7a 4d 73 67 3b 0a 0a 20 20 76 61 5f 73 74 61  *zMsg;..  va_sta
5140: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
5150: 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  .  zMsg = sqlite
5160: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
5170: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
5180: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 70 67 6e  d(ap);.  if( pgn
5190: 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f 3e 67 2e 6d  o<=0 || pgno>g.m
51a0: 78 50 61 67 65 20 29 7b 0a 20 20 20 20 70 72 69  xPage ){.    pri
51b0: 6e 74 66 28 22 45 52 52 4f 52 3a 20 70 61 67 65  ntf("ERROR: page
51c0: 20 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   %d out of range
51d0: 20 31 2e 2e 25 64 3a 20 25 73 5c 6e 22 2c 0a 20   1..%d: %s\n",. 
51e0: 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 2c             pgno,
51f0: 20 67 2e 6d 78 50 61 67 65 2c 20 7a 4d 73 67 29   g.mxPage, zMsg)
5200: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
5210: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 72 65  ee(zMsg);.    re
5220: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5230: 7a 50 61 67 65 55 73 65 5b 70 67 6e 6f 5d 21 3d  zPageUse[pgno]!=
5240: 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  0 ){.    printf(
5250: 22 45 52 52 4f 52 3a 20 70 61 67 65 20 25 64 20  "ERROR: page %d 
5260: 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  used multiple ti
5270: 6d 65 73 3a 5c 6e 22 2c 20 70 67 6e 6f 29 3b 0a  mes:\n", pgno);.
5280: 20 20 20 20 70 72 69 6e 74 66 28 22 45 52 52 4f      printf("ERRO
5290: 52 3a 20 20 20 20 70 72 65 76 69 6f 75 73 3a 20  R:    previous: 
52a0: 25 73 5c 6e 22 2c 20 7a 50 61 67 65 55 73 65 5b  %s\n", zPageUse[
52b0: 70 67 6e 6f 5d 29 3b 0a 20 20 20 20 70 72 69 6e  pgno]);.    prin
52c0: 74 66 28 22 45 52 52 4f 52 3a 20 20 20 20 63 75  tf("ERROR:    cu
52d0: 72 72 65 6e 74 3a 20 20 25 73 5c 6e 22 2c 20 7a  rrent:  %s\n", z
52e0: 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
52f0: 33 5f 66 72 65 65 28 7a 50 61 67 65 55 73 65 5b  3_free(zPageUse[
5300: 70 67 6e 6f 5d 29 3b 0a 20 20 7d 0a 20 20 7a 50  pgno]);.  }.  zP
5310: 61 67 65 55 73 65 5b 70 67 6e 6f 5d 20 3d 20 7a  ageUse[pgno] = z
5320: 4d 73 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Msg;.}../*.** Fi
5330: 6e 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nd overflow page
5340: 73 20 6f 66 20 61 20 63 65 6c 6c 20 61 6e 64 20  s of a cell and 
5350: 64 65 73 63 72 69 62 65 20 74 68 65 69 72 20 75  describe their u
5360: 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
5370: 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67 65 5f  void page_usage_
5380: 63 65 6c 6c 28 0a 20 20 75 6e 73 69 67 6e 65 64  cell(.  unsigned
5390: 20 63 68 61 72 20 63 54 79 70 65 2c 20 20 20 20   char cType,    
53a0: 2f 2a 20 50 61 67 65 20 74 79 70 65 20 2a 2f 0a  /* Page type */.
53b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
53c0: 2a 61 2c 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  *a,       /* Cel
53d0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
53e0: 6e 74 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  nt pgno,        
53f0: 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 20 63         /* page c
5400: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
5410: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ll */.  int cell
5420: 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
5430: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
5440: 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
5450: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5460: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69    int n = 0;.  i
5470: 36 34 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 69  64 nPayload;.  i
5480: 36 34 20 72 6f 77 69 64 3b 0a 20 20 69 36 34 20  64 rowid;.  i64 
5490: 6e 4c 6f 63 61 6c 3b 0a 20 20 69 20 3d 20 30 3b  nLocal;.  i = 0;
54a0: 0a 20 20 69 66 28 20 63 54 79 70 65 3c 3d 35 20  .  if( cType<=5 
54b0: 29 7b 0a 20 20 20 20 61 20 2b 3d 20 34 3b 0a 20  ){.    a += 4;. 
54c0: 20 20 20 6e 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20     n += 4;.  }. 
54d0: 20 69 66 28 20 63 54 79 70 65 21 3d 35 20 29 7b   if( cType!=5 ){
54e0: 0a 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56  .    i = decodeV
54f0: 61 72 69 6e 74 28 61 2c 20 26 6e 50 61 79 6c 6f  arint(a, &nPaylo
5500: 61 64 29 3b 0a 20 20 20 20 61 20 2b 3d 20 69 3b  ad);.    a += i;
5510: 0a 20 20 20 20 6e 20 2b 3d 20 69 3b 0a 20 20 20  .    n += i;.   
5520: 20 6e 4c 6f 63 61 6c 20 3d 20 6c 6f 63 61 6c 50   nLocal = localP
5530: 61 79 6c 6f 61 64 28 6e 50 61 79 6c 6f 61 64 2c  ayload(nPayload,
5540: 20 63 54 79 70 65 29 3b 0a 20 20 7d 65 6c 73 65   cType);.  }else
5550: 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
5560: 20 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 7d   nLocal = 0;.  }
5570: 0a 20 20 69 66 28 20 63 54 79 70 65 3d 3d 35 20  .  if( cType==5 
5580: 7c 7c 20 63 54 79 70 65 3d 3d 31 33 20 29 7b 0a  || cType==13 ){.
5590: 20 20 20 20 69 20 3d 20 64 65 63 6f 64 65 56 61      i = decodeVa
55a0: 72 69 6e 74 28 61 2c 20 26 72 6f 77 69 64 29 3b  rint(a, &rowid);
55b0: 0a 20 20 20 20 61 20 2b 3d 20 69 3b 0a 20 20 20  .    a += i;.   
55c0: 20 6e 20 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 69   n += i;.  }.  i
55d0: 66 28 20 6e 4c 6f 63 61 6c 3c 6e 50 61 79 6c 6f  f( nLocal<nPaylo
55e0: 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 76  ad ){.    int ov
55f0: 66 6c 20 3d 20 64 65 63 6f 64 65 49 6e 74 33 32  fl = decodeInt32
5600: 28 61 2b 6e 4c 6f 63 61 6c 29 3b 0a 20 20 20 20  (a+nLocal);.    
5610: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
5620: 20 77 68 69 6c 65 28 20 6f 76 66 6c 20 26 26 20   while( ovfl && 
5630: 28 63 6e 74 2b 2b 29 3c 67 2e 6d 78 50 61 67 65  (cnt++)<g.mxPage
5640: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 75   ){.      page_u
5650: 73 61 67 65 5f 6d 73 67 28 6f 76 66 6c 2c 20 22  sage_msg(ovfl, "
5660: 6f 76 65 72 66 6c 6f 77 20 25 64 20 66 72 6f 6d  overflow %d from
5670: 20 63 65 6c 6c 20 25 64 20 6f 66 20 70 61 67 65   cell %d of page
5680: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
5690: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20             cnt, 
56a0: 63 65 6c 6c 6e 6f 2c 20 70 67 6e 6f 29 3b 0a 20  cellno, pgno);. 
56b0: 20 20 20 20 20 61 20 3d 20 66 69 6c 65 52 65 61       a = fileRea
56c0: 64 28 28 6f 76 66 6c 2d 31 29 2a 67 2e 70 61 67  d((ovfl-1)*g.pag
56d0: 65 73 69 7a 65 2c 20 34 29 3b 0a 20 20 20 20 20  esize, 4);.     
56e0: 20 6f 76 66 6c 20 3d 20 64 65 63 6f 64 65 49 6e   ovfl = decodeIn
56f0: 74 33 32 28 61 29 3b 0a 20 20 20 20 20 20 73 71  t32(a);.      sq
5700: 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
5710: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
5720: 2a 2a 20 44 65 73 63 72 69 62 65 20 74 68 65 20  ** Describe the 
5730: 75 73 61 67 65 73 20 6f 66 20 61 20 62 2d 74 72  usages of a b-tr
5740: 65 65 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69  ee page.*/.stati
5750: 63 20 76 6f 69 64 20 70 61 67 65 5f 75 73 61 67  c void page_usag
5760: 65 5f 62 74 72 65 65 28 0a 20 20 69 6e 74 20 70  e_btree(.  int p
5770: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
5780: 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65 73 63   /* Page to desc
5790: 72 69 62 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ribe */.  int pa
57a0: 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
57b0: 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 69  /* Parent of thi
57c0: 73 20 70 61 67 65 2e 20 20 30 20 66 6f 72 20 72  s page.  0 for r
57d0: 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  oot pages */.  i
57e0: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
57f0: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 68       /* Which ch
5800: 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
5810: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
5820: 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 2f 2a 20  r *zName     /* 
5830: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
5840: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
5850: 65 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 63 6f  ed char *a;.  co
5860: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
5870: 3d 20 22 63 6f 72 72 75 70 74 20 6e 6f 64 65 22  = "corrupt node"
5880: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
5890: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 64   int i;.  int hd
58a0: 72 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  r = pgno==1 ? 10
58b0: 30 20 3a 20 30 3b 0a 0a 20 20 69 66 28 20 70 67  0 : 0;..  if( pg
58c0: 6e 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f 3e 67 2e  no<=0 || pgno>g.
58d0: 6d 78 50 61 67 65 20 29 20 72 65 74 75 72 6e 3b  mxPage ) return;
58e0: 0a 20 20 61 20 3d 20 66 69 6c 65 52 65 61 64 28  .  a = fileRead(
58f0: 28 70 67 6e 6f 2d 31 29 2a 67 2e 70 61 67 65 73  (pgno-1)*g.pages
5900: 69 7a 65 2c 20 67 2e 70 61 67 65 73 69 7a 65 29  ize, g.pagesize)
5910: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 5b 68 64  ;.  switch( a[hd
5920: 72 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20 32  r] ){.    case 2
5930: 3a 20 20 7a 54 79 70 65 20 3d 20 22 69 6e 74 65  :  zType = "inte
5940: 72 69 6f 72 20 6e 6f 64 65 20 6f 66 20 69 6e 64  rior node of ind
5950: 65 78 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ex";  break;.   
5960: 20 63 61 73 65 20 35 3a 20 20 7a 54 79 70 65 20   case 5:  zType 
5970: 3d 20 22 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  = "interior node
5980: 20 6f 66 20 74 61 62 6c 65 22 3b 20 20 62 72 65   of table";  bre
5990: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 31 30 3a  ak;.    case 10:
59a0: 20 7a 54 79 70 65 20 3d 20 22 6c 65 61 66 20 6f   zType = "leaf o
59b0: 66 20 69 6e 64 65 78 22 3b 20 20 20 20 20 20 20  f index";       
59c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
59d0: 61 73 65 20 31 33 3a 20 7a 54 79 70 65 20 3d 20  ase 13: zType = 
59e0: 22 6c 65 61 66 20 6f 66 20 74 61 62 6c 65 22 3b  "leaf of table";
59f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
5a00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 72 65  ;.  }.  if( pare
5a10: 6e 74 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 75  nt ){.    page_u
5a20: 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f 2c 20 22  sage_msg(pgno, "
5a30: 25 73 20 5b 25 73 5d 2c 20 63 68 69 6c 64 20 25  %s [%s], child %
5a40: 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 0a 20  d of page %d",. 
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 2c 20    zType, zName, 
5a70: 69 64 78 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  idx, parent);.  
5a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 67 65 5f  }else{.    page_
5a90: 75 73 61 67 65 5f 6d 73 67 28 70 67 6e 6f 2c 20  usage_msg(pgno, 
5aa0: 22 72 6f 6f 74 20 25 73 20 5b 25 73 5d 22 2c 20  "root %s [%s]", 
5ab0: 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zType, zName);. 
5ac0: 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 61 5b 68   }.  nCell = a[h
5ad0: 64 72 2b 33 5d 2a 32 35 36 20 2b 20 61 5b 68 64  dr+3]*256 + a[hd
5ae0: 72 2b 34 5d 3b 0a 20 20 69 66 28 20 61 5b 68 64  r+4];.  if( a[hd
5af0: 72 5d 3d 3d 32 20 7c 7c 20 61 5b 68 64 72 5d 3d  r]==2 || a[hdr]=
5b00: 3d 35 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 65  =5 ){.    int ce
5b10: 6c 6c 73 74 61 72 74 20 3d 20 68 64 72 2b 31 32  llstart = hdr+12
5b20: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
5b30: 6e 74 20 63 68 69 6c 64 3b 0a 20 20 20 20 66 6f  nt child;.    fo
5b40: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
5b50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
5b60: 6f 66 73 74 3b 0a 0a 20 20 20 20 20 20 6f 66 73  ofst;..      ofs
5b70: 74 20 3d 20 63 65 6c 6c 73 74 61 72 74 20 2b 20  t = cellstart + 
5b80: 69 2a 32 3b 0a 20 20 20 20 20 20 6f 66 73 74 20  i*2;.      ofst 
5b90: 3d 20 61 5b 6f 66 73 74 5d 2a 32 35 36 20 2b 20  = a[ofst]*256 + 
5ba0: 61 5b 6f 66 73 74 2b 31 5d 3b 0a 20 20 20 20 20  a[ofst+1];.     
5bb0: 20 63 68 69 6c 64 20 3d 20 64 65 63 6f 64 65 49   child = decodeI
5bc0: 6e 74 33 32 28 61 2b 6f 66 73 74 29 3b 0a 20 20  nt32(a+ofst);.  
5bd0: 20 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 62      page_usage_b
5be0: 74 72 65 65 28 63 68 69 6c 64 2c 20 70 67 6e 6f  tree(child, pgno
5bf0: 2c 20 69 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  , i, zName);.   
5c00: 20 7d 0a 20 20 20 20 63 68 69 6c 64 20 3d 20 64   }.    child = d
5c10: 65 63 6f 64 65 49 6e 74 33 32 28 61 2b 63 65 6c  ecodeInt32(a+cel
5c20: 6c 73 74 61 72 74 2d 34 29 3b 0a 20 20 20 20 70  lstart-4);.    p
5c30: 61 67 65 5f 75 73 61 67 65 5f 62 74 72 65 65 28  age_usage_btree(
5c40: 63 68 69 6c 64 2c 20 70 67 6e 6f 2c 20 69 2c 20  child, pgno, i, 
5c50: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  zName);.  }.  if
5c60: 28 20 61 5b 68 64 72 5d 3d 3d 32 20 7c 7c 20 61  ( a[hdr]==2 || a
5c70: 5b 68 64 72 5d 3d 3d 31 30 20 7c 7c 20 61 5b 68  [hdr]==10 || a[h
5c80: 64 72 5d 3d 3d 31 33 20 29 7b 0a 20 20 20 20 69  dr]==13 ){.    i
5c90: 6e 74 20 63 65 6c 6c 73 74 61 72 74 20 3d 20 68  nt cellstart = h
5ca0: 64 72 20 2b 20 38 20 2b 20 34 2a 28 61 5b 68 64  dr + 8 + 4*(a[hd
5cb0: 72 5d 3c 3d 35 29 3b 0a 20 20 20 20 66 6f 72 28  r]<=5);.    for(
5cc0: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
5cd0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 66  +){.      int of
5ce0: 73 74 3b 0a 20 20 20 20 20 20 6f 66 73 74 20 3d  st;.      ofst =
5cf0: 20 63 65 6c 6c 73 74 61 72 74 20 2b 20 69 2a 32   cellstart + i*2
5d00: 3b 0a 20 20 20 20 20 20 6f 66 73 74 20 3d 20 61  ;.      ofst = a
5d10: 5b 6f 66 73 74 5d 2a 32 35 36 20 2b 20 61 5b 6f  [ofst]*256 + a[o
5d20: 66 73 74 2b 31 5d 3b 0a 20 20 20 20 20 20 70 61  fst+1];.      pa
5d30: 67 65 5f 75 73 61 67 65 5f 63 65 6c 6c 28 61 5b  ge_usage_cell(a[
5d40: 68 64 72 5d 2c 20 61 2b 6f 66 73 74 2c 20 70 67  hdr], a+ofst, pg
5d50: 6e 6f 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  no, i);.    }.  
5d60: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
5d70: 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  (a);.}../*.** De
5d80: 74 65 72 6d 69 6e 65 20 70 61 67 65 20 75 73 61  termine page usa
5d90: 67 65 20 62 79 20 74 68 65 20 66 72 65 65 6c 69  ge by the freeli
5da0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
5db0: 64 20 70 61 67 65 5f 75 73 61 67 65 5f 66 72 65  d page_usage_fre
5dc0: 65 6c 69 73 74 28 69 6e 74 20 70 67 6e 6f 29 7b  elist(int pgno){
5dd0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5de0: 20 2a 61 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *a;.  int cnt =
5df0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
5e00: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 4e 65 78  nt n;.  int iNex
5e10: 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 20  t;.  int parent 
5e20: 3d 20 31 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70  = 1;..  while( p
5e30: 67 6e 6f 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 67  gno>0 && pgno<=g
5e40: 2e 6d 78 50 61 67 65 20 26 26 20 28 63 6e 74 2b  .mxPage && (cnt+
5e50: 2b 29 3c 67 2e 6d 78 50 61 67 65 20 29 7b 0a 20  +)<g.mxPage ){. 
5e60: 20 20 20 70 61 67 65 5f 75 73 61 67 65 5f 6d 73     page_usage_ms
5e70: 67 28 70 67 6e 6f 2c 20 22 66 72 65 65 6c 69 73  g(pgno, "freelis
5e80: 74 20 74 72 75 6e 6b 20 23 25 64 20 63 68 69 6c  t trunk #%d chil
5e90: 64 20 6f 66 20 25 64 22 2c 20 63 6e 74 2c 20 70  d of %d", cnt, p
5ea0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 61 20 3d 20  arent);.    a = 
5eb0: 66 69 6c 65 52 65 61 64 28 28 70 67 6e 6f 2d 31  fileRead((pgno-1
5ec0: 29 2a 67 2e 70 61 67 65 73 69 7a 65 2c 20 67 2e  )*g.pagesize, g.
5ed0: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 69  pagesize);.    i
5ee0: 4e 65 78 74 20 3d 20 64 65 63 6f 64 65 49 6e 74  Next = decodeInt
5ef0: 33 32 28 61 29 3b 0a 20 20 20 20 6e 20 3d 20 64  32(a);.    n = d
5f00: 65 63 6f 64 65 49 6e 74 33 32 28 61 2b 34 29 3b  ecodeInt32(a+4);
5f10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5f20: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
5f30: 6e 74 20 63 68 69 6c 64 20 3d 20 64 65 63 6f 64  nt child = decod
5f40: 65 49 6e 74 33 32 28 61 20 2b 20 28 69 2a 34 2b  eInt32(a + (i*4+
5f50: 38 29 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f  8));.      page_
5f60: 75 73 61 67 65 5f 6d 73 67 28 63 68 69 6c 64 2c  usage_msg(child,
5f70: 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 2c   "freelist leaf,
5f80: 20 63 68 69 6c 64 20 25 64 20 6f 66 20 74 72 75   child %d of tru
5f90: 6e 6b 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20  nk page %d",.   
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 20 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20    i, pgno);.    
5fc0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
5fd0: 65 65 28 61 29 3b 0a 20 20 20 20 70 61 72 65 6e  ee(a);.    paren
5fe0: 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67  t = pgno;.    pg
5ff0: 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
6000: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
6010: 6e 65 20 70 61 67 65 73 20 75 73 65 64 20 61 73  ne pages used as
6020: 20 50 54 52 4d 41 50 20 70 61 67 65 73 0a 2a 2f   PTRMAP pages.*/
6030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
6040: 65 5f 75 73 61 67 65 5f 70 74 72 6d 61 70 28 75  e_usage_ptrmap(u
6050: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29  nsigned char *a)
6060: 7b 0a 20 20 69 66 28 20 61 5b 35 35 5d 20 29 7b  {.  if( a[55] ){
6070: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 20  .    int usable 
6080: 3d 20 67 2e 70 61 67 65 73 69 7a 65 20 2d 20 61  = g.pagesize - a
6090: 5b 32 30 5d 3b 0a 20 20 20 20 69 6e 74 20 70 67  [20];.    int pg
60a0: 6e 6f 20 3d 20 32 3b 0a 20 20 20 20 69 6e 74 20  no = 2;.    int 
60b0: 70 65 72 50 61 67 65 20 3d 20 75 73 61 62 6c 65  perPage = usable
60c0: 2f 35 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  /5;.    while( p
60d0: 67 6e 6f 3c 3d 67 2e 6d 78 50 61 67 65 20 29 7b  gno<=g.mxPage ){
60e0: 0a 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67  .      page_usag
60f0: 65 5f 6d 73 67 28 70 67 6e 6f 2c 20 22 50 54 52  e_msg(pgno, "PTR
6100: 4d 41 50 20 70 61 67 65 20 63 6f 76 65 72 69 6e  MAP page coverin
6110: 67 20 25 64 2e 2e 25 64 22 2c 0a 20 20 20 20 20  g %d..%d",.     
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 20 20 20 20 70 67 6e 6f 2b 31 2c 20 70 67        pgno+1, pg
6140: 6e 6f 2b 70 65 72 50 61 67 65 29 3b 0a 20 20 20  no+perPage);.   
6150: 20 20 20 70 67 6e 6f 20 2b 3d 20 70 65 72 50 61     pgno += perPa
6160: 67 65 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ge + 1;.    }.  
6170: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
6180: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77  o figure out how
6190: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
61a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
61b0: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 0a   is being used..
61c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
61d0: 61 67 65 5f 75 73 61 67 65 5f 72 65 70 6f 72 74  age_usage_report
61e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72  (const char *zPr
61f0: 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
6200: 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  DbName){.  int i
6210: 2c 20 6a 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  , j;.  int rc;. 
6220: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
6230: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
6240: 74 6d 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  tmt;.  unsigned 
6250: 63 68 61 72 20 2a 61 3b 0a 20 20 63 68 61 72 20  char *a;.  char 
6260: 7a 51 75 65 72 79 5b 32 30 30 5d 3b 0a 0a 20 20  zQuery[200];..  
6270: 2f 2a 20 41 76 6f 69 64 20 74 68 65 20 70 61 74  /* Avoid the pat
6280: 68 6f 6c 6f 67 69 63 61 6c 20 63 61 73 65 20 2a  hological case *
6290: 2f 0a 20 20 69 66 28 20 67 2e 6d 78 50 61 67 65  /.  if( g.mxPage
62a0: 3c 31 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  <1 ){.    printf
62b0: 28 22 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  ("empty database
62c0: 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
62d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
62e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
62f0: 6c 65 20 2a 2f 0a 20 20 64 62 20 3d 20 6f 70 65  le */.  db = ope
6300: 6e 44 61 74 61 62 61 73 65 28 7a 50 72 67 2c 20  nDatabase(zPrg, 
6310: 7a 44 62 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  zDbName);..  /* 
6320: 53 65 74 20 75 70 20 67 6c 6f 62 61 6c 20 76 61  Set up global va
6330: 72 69 61 62 6c 65 73 20 7a 50 61 67 65 55 73 65  riables zPageUse
6340: 5b 5d 20 61 6e 64 20 67 2e 6d 78 50 61 67 65 20  [] and g.mxPage 
6350: 74 6f 20 72 65 63 6f 72 64 20 70 61 67 65 0a 20  to record page. 
6360: 20 2a 2a 20 75 73 61 67 65 73 20 2a 2f 0a 20 20   ** usages */.  
6370: 7a 50 61 67 65 55 73 65 20 3d 20 73 71 6c 69 74  zPageUse = sqlit
6380: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
6390: 66 28 7a 50 61 67 65 55 73 65 5b 30 5d 29 2a 28  f(zPageUse[0])*(
63a0: 67 2e 6d 78 50 61 67 65 2b 31 29 20 29 3b 0a 20  g.mxPage+1) );. 
63b0: 20 69 66 28 20 7a 50 61 67 65 55 73 65 3d 3d 30   if( zPageUse==0
63c0: 20 29 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79   ) out_of_memory
63d0: 28 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 50 61  ();.  memset(zPa
63e0: 67 65 55 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  geUse, 0, sizeof
63f0: 28 7a 50 61 67 65 55 73 65 5b 30 5d 29 2a 28 67  (zPageUse[0])*(g
6400: 2e 6d 78 50 61 67 65 2b 31 29 29 3b 0a 0a 20 20  .mxPage+1));..  
6410: 2f 2a 20 44 69 73 63 6f 76 65 72 20 74 68 65 20  /* Discover the 
6420: 75 73 61 67 65 20 6f 66 20 65 61 63 68 20 70 61  usage of each pa
6430: 67 65 20 2a 2f 0a 20 20 61 20 3d 20 66 69 6c 65  ge */.  a = file
6440: 52 65 61 64 28 30 2c 20 31 30 30 29 3b 0a 20 20  Read(0, 100);.  
6450: 70 61 67 65 5f 75 73 61 67 65 5f 66 72 65 65 6c  page_usage_freel
6460: 69 73 74 28 64 65 63 6f 64 65 49 6e 74 33 32 28  ist(decodeInt32(
6470: 61 2b 33 32 29 29 3b 0a 20 20 70 61 67 65 5f 75  a+32));.  page_u
6480: 73 61 67 65 5f 70 74 72 6d 61 70 28 61 29 3b 0a  sage_ptrmap(a);.
6490: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
64a0: 29 3b 0a 20 20 70 61 67 65 5f 75 73 61 67 65 5f  );.  page_usage_
64b0: 62 74 72 65 65 28 31 2c 20 30 2c 20 30 2c 20 22  btree(1, 0, 0, "
64c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b  sqlite_master");
64d0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
64e0: 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
64f0: 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c  able_schema=ON",
6500: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72   0, 0, 0);.  for
6510: 28 6a 3d 30 3b 20 6a 3c 32 3b 20 6a 2b 2b 29 7b  (j=0; j<2; j++){
6520: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
6530: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 51 75  rintf(sizeof(zQu
6540: 65 72 79 29 2c 20 7a 51 75 65 72 79 2c 0a 20 20  ery), zQuery,.  
6550: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
6560: 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72  CT type, name, r
6570: 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 53 51 4c  ootpage FROM SQL
6580: 49 54 45 5f 4d 41 53 54 45 52 20 57 48 45 52 45  ITE_MASTER WHERE
6590: 20 72 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20   rootpage".     
65a0: 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
65b0: 42 59 20 72 6f 77 69 64 20 25 73 22 2c 20 6a 3f  BY rowid %s", j?
65c0: 22 44 45 53 43 22 3a 22 22 29 3b 0a 20 20 20 20  "DESC":"");.    
65d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
65e0: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 51 75 65  pare_v2(db, zQue
65f0: 72 79 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ry, -1, &pStmt, 
6600: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
6610: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6620: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
6630: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
6640: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
6650: 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20       int pgno = 
6660: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
6670: 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  nt(pStmt, 2);.  
6680: 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67 65        page_usage
6690: 5f 62 74 72 65 65 28 70 67 6e 6f 2c 20 30 2c 20  _btree(pgno, 0, 
66a0: 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  0, (const char*)
66b0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
66c0: 65 78 74 28 70 53 74 6d 74 2c 31 29 29 3b 0a 20  ext(pStmt,1));. 
66d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
66e0: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
66f0: 45 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 71 75  ERROR: cannot qu
6700: 65 72 79 20 64 61 74 61 62 61 73 65 3a 20 25 73  ery database: %s
6710: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
6720: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
6730: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6740: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
6750: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6760: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
6770: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63  .  }.  sqlite3_c
6780: 6c 6f 73 65 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  lose(db);..  /* 
6790: 50 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74  Print the report
67a0: 20 61 6e 64 20 66 72 65 65 20 6d 65 6d 6f 72 79   and free memory
67b0: 20 75 73 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69   used */.  for(i
67c0: 3d 31 3b 20 69 3c 3d 67 2e 6d 78 50 61 67 65 3b  =1; i<=g.mxPage;
67d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74   i++){.    print
67e0: 66 28 22 25 35 64 3a 20 25 73 5c 6e 22 2c 20 69  f("%5d: %s\n", i
67f0: 2c 20 7a 50 61 67 65 55 73 65 5b 69 5d 20 3f 20  , zPageUse[i] ? 
6800: 7a 50 61 67 65 55 73 65 5b 69 5d 20 3a 20 22 3f  zPageUse[i] : "?
6810: 3f 3f 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ??");.    sqlite
6820: 33 5f 66 72 65 65 28 7a 50 61 67 65 55 73 65 5b  3_free(zPageUse[
6830: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  i]);.  }.  sqlit
6840: 65 33 5f 66 72 65 65 28 7a 50 61 67 65 55 73 65  e3_free(zPageUse
6850: 29 3b 0a 20 20 7a 50 61 67 65 55 73 65 20 3d 20  );.  zPageUse = 
6860: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  0;.}../*.** Try 
6870: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 68 6f  to figure out ho
6880: 77 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20  w every page in 
6890: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
68a0: 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  e is being used.
68b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
68c0: 70 74 72 6d 61 70 5f 63 6f 76 65 72 61 67 65 5f  ptrmap_coverage_
68d0: 72 65 70 6f 72 74 28 63 6f 6e 73 74 20 63 68 61  report(const cha
68e0: 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
68f0: 6e 74 20 70 67 6e 6f 3b 0a 20 20 75 6e 73 69 67  nt pgno;.  unsig
6900: 6e 65 64 20 63 68 61 72 20 2a 61 48 64 72 3b 0a  ned char *aHdr;.
6910: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6920: 2a 61 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  *a;.  int usable
6930: 3b 0a 20 20 69 6e 74 20 70 65 72 50 61 67 65 3b  ;.  int perPage;
6940: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
6950: 41 76 6f 69 64 20 74 68 65 20 70 61 74 68 6f 6c  Avoid the pathol
6960: 6f 67 69 63 61 6c 20 63 61 73 65 20 2a 2f 0a 20  ogical case */. 
6970: 20 69 66 28 20 67 2e 6d 78 50 61 67 65 3c 31 20   if( g.mxPage<1 
6980: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 65  ){.    printf("e
6990: 6d 70 74 79 20 64 61 74 61 62 61 73 65 5c 6e 22  mpty database\n"
69a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
69b0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
69c0: 72 65 20 50 54 52 4d 41 50 73 20 61 72 65 20 75  re PTRMAPs are u
69d0: 73 65 64 20 69 6e 20 74 68 69 73 20 64 61 74 61  sed in this data
69e0: 62 61 73 65 20 2a 2f 0a 20 20 61 48 64 72 20 3d  base */.  aHdr =
69f0: 20 66 69 6c 65 52 65 61 64 28 30 2c 20 31 30 30   fileRead(0, 100
6a00: 29 3b 0a 20 20 69 66 28 20 61 48 64 72 5b 35 35  );.  if( aHdr[55
6a10: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 72 69 6e  ]==0 ){.    prin
6a20: 74 66 28 22 64 61 74 61 62 61 73 65 20 64 6f 65  tf("database doe
6a30: 73 20 6e 6f 74 20 75 73 65 20 50 54 52 4d 41 50  s not use PTRMAP
6a40: 20 70 61 67 65 73 5c 6e 22 29 3b 0a 20 20 20 20   pages\n");.    
6a50: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 75 73  return;.  }.  us
6a60: 61 62 6c 65 20 3d 20 67 2e 70 61 67 65 73 69 7a  able = g.pagesiz
6a70: 65 20 2d 20 61 48 64 72 5b 32 30 5d 3b 0a 20 20  e - aHdr[20];.  
6a80: 70 65 72 50 61 67 65 20 3d 20 75 73 61 62 6c 65  perPage = usable
6a90: 2f 35 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  /5;.  sqlite3_fr
6aa0: 65 65 28 61 48 64 72 29 3b 0a 20 20 70 72 69 6e  ee(aHdr);.  prin
6ab0: 74 66 28 22 25 35 64 3a 20 72 6f 6f 74 20 6f 66  tf("%5d: root of
6ac0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e   sqlite_master\n
6ad0: 22 2c 20 31 29 3b 0a 20 20 66 6f 72 28 70 67 6e  ", 1);.  for(pgn
6ae0: 6f 3d 32 3b 20 70 67 6e 6f 3c 3d 67 2e 6d 78 50  o=2; pgno<=g.mxP
6af0: 61 67 65 3b 20 70 67 6e 6f 20 2b 3d 20 70 65 72  age; pgno += per
6b00: 50 61 67 65 2b 31 29 7b 0a 20 20 20 20 70 72 69  Page+1){.    pri
6b10: 6e 74 66 28 22 25 35 64 3a 20 50 54 52 4d 41 50  ntf("%5d: PTRMAP
6b20: 20 70 61 67 65 20 63 6f 76 65 72 69 6e 67 20 25   page covering %
6b30: 64 2e 2e 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 0a  d..%d\n", pgno,.
6b40: 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 2b             pgno+
6b50: 31 2c 20 70 67 6e 6f 2b 70 65 72 50 61 67 65 29  1, pgno+perPage)
6b60: 3b 0a 20 20 20 20 61 20 3d 20 66 69 6c 65 52 65  ;.    a = fileRe
6b70: 61 64 28 28 70 67 6e 6f 2d 31 29 2a 67 2e 70 61  ad((pgno-1)*g.pa
6b80: 67 65 73 69 7a 65 2c 20 75 73 61 62 6c 65 29 3b  gesize, usable);
6b90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 2b  .    for(i=0; i+
6ba0: 35 3c 3d 75 73 61 62 6c 65 20 26 26 20 70 67 6e  5<=usable && pgn
6bb0: 6f 2b 31 2b 69 2f 35 3c 3d 67 2e 6d 78 50 61 67  o+1+i/5<=g.mxPag
6bc0: 65 3b 20 69 2b 3d 35 29 7b 0a 20 20 20 20 20 20  e; i+=5){.      
6bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
6be0: 65 20 3d 20 22 3f 3f 3f 22 3b 0a 20 20 20 20 20  e = "???";.     
6bf0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 46   unsigned int iF
6c00: 72 6f 6d 20 3d 20 64 65 63 6f 64 65 49 6e 74 33  rom = decodeInt3
6c10: 32 28 26 61 5b 69 2b 31 5d 29 3b 0a 20 20 20 20  2(&a[i+1]);.    
6c20: 20 20 73 77 69 74 63 68 28 20 61 5b 69 5d 20 29    switch( a[i] )
6c30: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31  {.        case 1
6c40: 3a 20 20 7a 54 79 70 65 20 3d 20 22 62 2d 74 72  :  zType = "b-tr
6c50: 65 65 20 72 6f 6f 74 20 70 61 67 65 22 3b 20 20  ee root page";  
6c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c70: 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 7a 54       case 2:  zT
6c80: 79 70 65 20 3d 20 22 66 72 65 65 6c 69 73 74 20  ype = "freelist 
6c90: 70 61 67 65 22 3b 20 20 20 20 20 20 20 20 20 20  page";          
6ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6cb0: 63 61 73 65 20 33 3a 20 20 7a 54 79 70 65 20 3d  case 3:  zType =
6cc0: 20 22 66 69 72 73 74 20 70 61 67 65 20 6f 66 20   "first page of 
6cd0: 6f 76 65 72 66 6c 6f 77 22 3b 20 20 62 72 65 61  overflow";  brea
6ce0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
6cf0: 34 3a 20 20 7a 54 79 70 65 20 3d 20 22 6c 61 74  4:  zType = "lat
6d00: 65 72 20 70 61 67 65 20 6f 66 20 6f 76 65 72 66  er page of overf
6d10: 6c 6f 77 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  low";  break;.  
6d20: 20 20 20 20 20 20 63 61 73 65 20 35 3a 20 20 7a        case 5:  z
6d30: 54 79 70 65 20 3d 20 22 62 2d 74 72 65 65 20 6e  Type = "b-tree n
6d40: 6f 6e 2d 72 6f 6f 74 20 70 61 67 65 22 3b 20 20  on-root page";  
6d50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6d60: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
6d70: 35 64 3a 20 25 73 2c 20 70 61 72 65 6e 74 3d 25  5d: %s, parent=%
6d80: 75 5c 6e 22 2c 20 70 67 6e 6f 2b 31 2b 69 2f 35  u\n", pgno+1+i/5
6d90: 2c 20 7a 54 79 70 65 2c 20 69 46 72 6f 6d 29 3b  , zType, iFrom);
6da0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6db0: 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 7d 0a  e3_free(a);.  }.
6dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
6dd0: 20 75 73 61 67 65 20 63 6f 6d 6d 65 6e 74 0a 2a   usage comment.*
6de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  /.static void us
6df0: 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  age(const char *
6e00: 61 72 67 76 30 29 7b 0a 20 20 66 70 72 69 6e 74  argv0){.  fprint
6e10: 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
6e20: 20 25 73 20 3f 2d 2d 75 72 69 3f 20 46 49 4c 45   %s ?--uri? FILE
6e30: 4e 41 4d 45 20 3f 61 72 67 73 2e 2e 2e 3f 5c 6e  NAME ?args...?\n
6e40: 5c 6e 22 2c 20 61 72 67 76 30 29 3b 0a 20 20 66  \n", argv0);.  f
6e50: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
6e60: 20 20 20 22 73 77 69 74 63 68 65 73 3a 5c 6e 22     "switches:\n"
6e70: 0a 20 20 20 20 22 20 20 20 20 2d 2d 72 61 77 20  .    "    --raw 
6e80: 20 20 20 20 20 20 20 20 20 20 52 65 61 64 20 64            Read d
6e90: 62 20 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2c  b file directly,
6ea0: 20 62 79 70 61 73 73 69 6e 67 20 53 51 4c 69 74   bypassing SQLit
6eb0: 65 20 56 46 53 5c 6e 22 0a 20 20 20 20 22 61 72  e VFS\n".    "ar
6ec0: 67 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  gs:\n".    "    
6ed0: 64 62 68 65 61 64 65 72 20 20 20 20 20 20 20 20  dbheader        
6ee0: 53 68 6f 77 20 64 61 74 61 62 61 73 65 20 68 65  Show database he
6ef0: 61 64 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20  ader\n".    "   
6f00: 20 70 67 69 64 78 20 20 20 20 20 20 20 20 20 20   pgidx          
6f10: 20 49 6e 64 65 78 20 6f 66 20 68 6f 77 20 65 61   Index of how ea
6f20: 63 68 20 70 61 67 65 20 69 73 20 75 73 65 64 5c  ch page is used\
6f30: 6e 22 0a 20 20 20 20 22 20 20 20 20 70 74 72 6d  n".    "    ptrm
6f40: 61 70 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  ap          Show
6f50: 20 61 6c 6c 20 50 54 52 4d 41 50 20 70 61 67 65   all PTRMAP page
6f60: 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20   content\n".    
6f70: 22 20 20 20 20 4e 4e 4e 2e 2e 4d 4d 4d 20 20 20  "    NNN..MMM   
6f80: 20 20 20 20 20 53 68 6f 77 20 68 65 78 20 6f 66       Show hex of
6f90: 20 70 61 67 65 73 20 4e 4e 4e 20 74 68 72 6f 75   pages NNN throu
6fa0: 67 68 20 4d 4d 4d 5c 6e 22 0a 20 20 20 20 22 20  gh MMM\n".    " 
6fb0: 20 20 20 4e 4e 4e 2e 2e 65 6e 64 20 20 20 20 20     NNN..end     
6fc0: 20 20 20 53 68 6f 77 20 68 65 78 20 6f 66 20 70     Show hex of p
6fd0: 61 67 65 73 20 4e 4e 4e 20 74 68 72 6f 75 67 68  ages NNN through
6fe0: 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 0a   end of file\n".
6ff0: 20 20 20 20 22 20 20 20 20 4e 4e 4e 62 20 20 20      "    NNNb   
7000: 20 20 20 20 20 20 20 20 20 44 65 63 6f 64 65 20           Decode 
7010: 62 74 72 65 65 20 70 61 67 65 20 4e 4e 4e 5c 6e  btree page NNN\n
7020: 22 0a 20 20 20 20 22 20 20 20 20 4e 4e 4e 62 63  ".    "    NNNbc
7030: 20 20 20 20 20 20 20 20 20 20 20 44 65 63 6f 64             Decod
7040: 65 20 62 74 72 65 65 20 70 61 67 65 20 4e 4e 4e  e btree page NNN
7050: 20 61 6e 64 20 73 68 6f 77 20 63 6f 6e 74 65 6e   and show conten
7060: 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e 4e  t\n".    "    NN
7070: 4e 62 6d 20 20 20 20 20 20 20 20 20 20 20 44 65  Nbm           De
7080: 63 6f 64 65 20 62 74 72 65 65 20 70 61 67 65 20  code btree page 
7090: 4e 4e 4e 20 61 6e 64 20 73 68 6f 77 20 61 20 6c  NNN and show a l
70a0: 61 79 6f 75 74 20 6d 61 70 5c 6e 22 0a 20 20 20  ayout map\n".   
70b0: 20 22 20 20 20 20 4e 4e 4e 62 64 43 43 43 20 20   "    NNNbdCCC  
70c0: 20 20 20 20 20 20 44 65 63 6f 64 65 20 63 65 6c        Decode cel
70d0: 6c 20 43 43 43 20 6f 6e 20 62 74 72 65 65 20 70  l CCC on btree p
70e0: 61 67 65 20 4e 4e 4e 5c 6e 22 0a 20 20 20 20 22  age NNN\n".    "
70f0: 20 20 20 20 4e 4e 4e 74 20 20 20 20 20 20 20 20      NNNt        
7100: 20 20 20 20 44 65 63 6f 64 65 20 66 72 65 65 6c      Decode freel
7110: 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 4e  ist trunk page N
7120: 4e 4e 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 4e  NN\n".    "    N
7130: 4e 4e 74 64 20 20 20 20 20 20 20 20 20 20 20 53  NNtd           S
7140: 68 6f 77 20 6c 65 61 66 20 66 72 65 65 6c 69 73  how leaf freelis
7150: 74 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 64  t pages on the d
7160: 65 63 6f 64 65 5c 6e 22 0a 20 20 20 20 22 20 20  ecode\n".    "  
7170: 20 20 4e 4e 4e 74 72 20 20 20 20 20 20 20 20 20    NNNtr         
7180: 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65    Recursively de
7190: 63 6f 64 65 20 66 72 65 65 6c 69 73 74 20 73 74  code freelist st
71a0: 61 72 74 69 6e 67 20 61 74 20 4e 4e 4e 5c 6e 22  arting at NNN\n"
71b0: 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69  .  );.}..int mai
71c0: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
71d0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73 71 6c 69   **argv){.  sqli
71e0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
71f0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
7200: 72 20 2a 7a 50 67 53 7a 3b 0a 20 20 63 6f 6e 73  r *zPgSz;.  cons
7210: 74 20 63 68 61 72 20 2a 7a 50 72 67 20 3d 20 61  t char *zPrg = a
7220: 72 67 76 5b 30 5d 3b 20 20 20 20 20 2f 2a 20 4e  rgv[0];     /* N
7230: 61 6d 65 20 6f 66 20 74 68 69 73 20 65 78 65 63  ame of this exec
7240: 75 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72  utable */.  char
7250: 20 2a 2a 61 7a 41 72 67 20 3d 20 61 72 67 76 3b   **azArg = argv;
7260: 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 61 72  .  int nArg = ar
7270: 67 63 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  gc;..  /* Check 
7280: 66 6f 72 20 74 68 65 20 22 2d 2d 75 72 69 22 20  for the "--uri" 
7290: 6f 72 20 22 2d 75 72 69 22 20 73 77 69 74 63 68  or "-uri" switch
72a0: 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e  . */.  if( nArg>
72b0: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  1 ){.    if( sql
72c0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 2d 72  ite3_stricmp("-r
72d0: 61 77 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d  aw", azArg[1])==
72e0: 30 20 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  0 .     || sqlit
72f0: 65 33 5f 73 74 72 69 63 6d 70 28 22 2d 2d 72 61  e3_stricmp("--ra
7300: 77 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30  w", azArg[1])==0
7310: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 2e  .    ){.      g.
7320: 62 52 61 77 20 3d 20 31 3b 0a 20 20 20 20 20 20  bRaw = 1;.      
7330: 61 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 20 20 6e  azArg++;.      n
7340: 41 72 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Arg--;.    }.  }
7350: 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29  ..  if( nArg<2 )
7360: 7b 0a 20 20 20 20 75 73 61 67 65 28 7a 50 72 67  {.    usage(zPrg
7370: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
7380: 20 20 7d 0a 0a 20 20 66 69 6c 65 4f 70 65 6e 28    }..  fileOpen(
7390: 7a 50 72 67 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  zPrg, azArg[1]);
73a0: 0a 20 20 73 7a 46 69 6c 65 20 3d 20 66 69 6c 65  .  szFile = file
73b0: 47 65 74 73 69 7a 65 28 29 3b 0a 0a 20 20 7a 50  Getsize();..  zP
73c0: 67 53 7a 20 3d 20 66 69 6c 65 52 65 61 64 28 31  gSz = fileRead(1
73d0: 36 2c 20 32 29 3b 0a 20 20 67 2e 70 61 67 65 73  6, 2);.  g.pages
73e0: 69 7a 65 20 3d 20 7a 50 67 53 7a 5b 30 5d 2a 32  ize = zPgSz[0]*2
73f0: 35 36 20 2b 20 7a 50 67 53 7a 5b 31 5d 2a 36 35  56 + zPgSz[1]*65
7400: 35 33 36 3b 0a 20 20 69 66 28 20 67 2e 70 61 67  536;.  if( g.pag
7410: 65 73 69 7a 65 3d 3d 30 20 29 20 67 2e 70 61 67  esize==0 ) g.pag
7420: 65 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  esize = 1024;.  
7430: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 67  sqlite3_free(zPg
7440: 53 7a 29 3b 0a 0a 20 20 70 72 69 6e 74 66 28 22  Sz);..  printf("
7450: 50 61 67 65 73 69 7a 65 3a 20 25 64 5c 6e 22 2c  Pagesize: %d\n",
7460: 20 67 2e 70 61 67 65 73 69 7a 65 29 3b 0a 20 20   g.pagesize);.  
7470: 67 2e 6d 78 50 61 67 65 20 3d 20 28 73 7a 46 69  g.mxPage = (szFi
7480: 6c 65 2b 67 2e 70 61 67 65 73 69 7a 65 2d 31 29  le+g.pagesize-1)
7490: 2f 67 2e 70 61 67 65 73 69 7a 65 3b 0a 0a 20 20  /g.pagesize;..  
74a0: 70 72 69 6e 74 66 28 22 41 76 61 69 6c 61 62 6c  printf("Availabl
74b0: 65 20 70 61 67 65 73 3a 20 31 2e 2e 25 64 5c 6e  e pages: 1..%d\n
74c0: 22 2c 20 67 2e 6d 78 50 61 67 65 29 3b 0a 20 20  ", g.mxPage);.  
74d0: 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
74e0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
74f0: 72 28 69 3d 31 3b 20 69 3c 3d 67 2e 6d 78 50 61  r(i=1; i<=g.mxPa
7500: 67 65 3b 20 69 2b 2b 29 20 70 72 69 6e 74 5f 70  ge; i++) print_p
7510: 61 67 65 28 69 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(i);.  }else{
7520: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7530: 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b  for(i=2; i<nArg;
7540: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
7550: 20 69 53 74 61 72 74 2c 20 69 45 6e 64 3b 0a 20   iStart, iEnd;. 
7560: 20 20 20 20 20 63 68 61 72 20 2a 7a 4c 65 66 74       char *zLeft
7570: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
7580: 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 64 62  mp(azArg[i], "db
7590: 68 65 61 64 65 72 22 29 3d 3d 30 20 29 7b 0a 20  header")==0 ){. 
75a0: 20 20 20 20 20 20 20 70 72 69 6e 74 5f 64 62 5f         print_db_
75b0: 68 65 61 64 65 72 28 29 3b 0a 20 20 20 20 20 20  header();.      
75c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
75d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
75e0: 72 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22  rcmp(azArg[i], "
75f0: 70 67 69 64 78 22 29 3d 3d 30 20 29 7b 0a 20 20  pgidx")==0 ){.  
7600: 20 20 20 20 20 20 70 61 67 65 5f 75 73 61 67 65        page_usage
7610: 5f 72 65 70 6f 72 74 28 7a 50 72 67 2c 20 61 7a  _report(zPrg, az
7620: 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
7630: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7640: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
7650: 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 70  cmp(azArg[i], "p
7660: 74 72 6d 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20  trmap")==0 ){.  
7670: 20 20 20 20 20 20 70 74 72 6d 61 70 5f 63 6f 76        ptrmap_cov
7680: 65 72 61 67 65 5f 72 65 70 6f 72 74 28 61 7a 41  erage_report(azA
7690: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
76a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
76b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  }.      if( strc
76c0: 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 68 65  mp(azArg[i], "he
76d0: 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
76e0: 20 20 20 75 73 61 67 65 28 7a 50 72 67 29 3b 0a     usage(zPrg);.
76f0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7710: 69 66 28 20 21 69 73 64 69 67 69 74 28 61 7a 41  if( !isdigit(azA
7720: 72 67 5b 69 5d 5b 30 5d 29 20 29 7b 0a 20 20 20  rg[i][0]) ){.   
7730: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
7740: 65 72 72 2c 20 22 25 73 3a 20 75 6e 6b 6e 6f 77  err, "%s: unknow
7750: 6e 20 6f 70 74 69 6f 6e 3a 20 5b 25 73 5d 5c 6e  n option: [%s]\n
7760: 22 2c 20 7a 50 72 67 2c 20 61 7a 41 72 67 5b 69  ", zPrg, azArg[i
7770: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ]);.        cont
7780: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
7790: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 74 72      iStart = str
77a0: 74 6f 6c 28 61 7a 41 72 67 5b 69 5d 2c 20 26 7a  tol(azArg[i], &z
77b0: 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Left, 0);.      
77c0: 69 66 28 20 7a 4c 65 66 74 20 26 26 20 73 74 72  if( zLeft && str
77d0: 63 6d 70 28 7a 4c 65 66 74 2c 22 2e 2e 65 6e 64  cmp(zLeft,"..end
77e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
77f0: 20 69 45 6e 64 20 3d 20 67 2e 6d 78 50 61 67 65   iEnd = g.mxPage
7800: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7810: 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c 65 66 74  ( zLeft && zLeft
7820: 5b 30 5d 3d 3d 27 2e 27 20 26 26 20 7a 4c 65 66  [0]=='.' && zLef
7830: 74 5b 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  t[1]=='.' ){.   
7840: 20 20 20 20 20 69 45 6e 64 20 3d 20 73 74 72 74       iEnd = strt
7850: 6f 6c 28 26 7a 4c 65 66 74 5b 32 5d 2c 20 30 2c  ol(&zLeft[2], 0,
7860: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
7870: 20 69 66 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c   if( zLeft && zL
7880: 65 66 74 5b 30 5d 3d 3d 27 62 27 20 29 7b 0a 20  eft[0]=='b' ){. 
7890: 20 20 20 20 20 20 20 69 6e 74 20 6f 66 73 74 2c         int ofst,
78a0: 20 6e 42 79 74 65 2c 20 68 64 72 53 69 7a 65 3b   nByte, hdrSize;
78b0: 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
78c0: 64 20 63 68 61 72 20 2a 61 3b 0a 20 20 20 20 20  d char *a;.     
78d0: 20 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 31     if( iStart==1
78e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 66   ){.          of
78f0: 73 74 20 3d 20 68 64 72 53 69 7a 65 20 3d 20 31  st = hdrSize = 1
7900: 30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42  00;.          nB
7910: 79 74 65 20 3d 20 67 2e 70 61 67 65 73 69 7a 65  yte = g.pagesize
7920: 2d 31 30 30 3b 0a 20 20 20 20 20 20 20 20 7d 65  -100;.        }e
7930: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 68  lse{.          h
7940: 64 72 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  drSize = 0;.    
7950: 20 20 20 20 20 20 6f 66 73 74 20 3d 20 28 69 53        ofst = (iS
7960: 74 61 72 74 2d 31 29 2a 67 2e 70 61 67 65 73 69  tart-1)*g.pagesi
7970: 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42  ze;.          nB
7980: 79 74 65 20 3d 20 67 2e 70 61 67 65 73 69 7a 65  yte = g.pagesize
7990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
79a0: 20 20 20 20 61 20 3d 20 66 69 6c 65 52 65 61 64      a = fileRead
79b0: 28 6f 66 73 74 2c 20 6e 42 79 74 65 29 3b 0a 20  (ofst, nByte);. 
79c0: 20 20 20 20 20 20 20 64 65 63 6f 64 65 5f 62 74         decode_bt
79d0: 72 65 65 5f 70 61 67 65 28 61 2c 20 69 53 74 61  ree_page(a, iSta
79e0: 72 74 2c 20 68 64 72 53 69 7a 65 2c 20 26 7a 4c  rt, hdrSize, &zL
79f0: 65 66 74 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  eft[1]);.       
7a00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
7a10: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
7a20: 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ue;.      }else 
7a30: 69 66 28 20 7a 4c 65 66 74 20 26 26 20 7a 4c 65  if( zLeft && zLe
7a40: 66 74 5b 30 5d 3d 3d 27 74 27 20 29 7b 0a 20 20  ft[0]=='t' ){.  
7a50: 20 20 20 20 20 20 69 6e 74 20 64 65 74 61 69 6c        int detail
7a60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
7a70: 74 20 72 65 63 75 72 73 69 76 65 20 3d 20 30 3b  t recursive = 0;
7a80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
7a90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
7aa0: 20 7a 4c 65 66 74 5b 69 5d 3b 20 69 2b 2b 29 7b   zLeft[i]; i++){
7ab0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
7ac0: 4c 65 66 74 5b 69 5d 3d 3d 27 72 27 20 29 20 72  Left[i]=='r' ) r
7ad0: 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
7ae0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 65 66          if( zLef
7af0: 74 5b 69 5d 3d 3d 27 64 27 20 29 20 64 65 74 61  t[i]=='d' ) deta
7b00: 69 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  il = 1;.        
7b10: 7d 0a 20 20 20 20 20 20 20 20 64 65 63 6f 64 65  }.        decode
7b20: 5f 74 72 75 6e 6b 5f 70 61 67 65 28 69 53 74 61  _trunk_page(iSta
7b30: 72 74 2c 20 64 65 74 61 69 6c 2c 20 72 65 63 75  rt, detail, recu
7b40: 72 73 69 76 65 29 3b 0a 20 20 20 20 20 20 20 20  rsive);.        
7b50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7b60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7b70: 45 6e 64 20 3d 20 69 53 74 61 72 74 3b 0a 20 20  End = iStart;.  
7b80: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7b90: 69 53 74 61 72 74 3c 31 20 7c 7c 20 69 45 6e 64  iStart<1 || iEnd
7ba0: 3c 69 53 74 61 72 74 20 7c 7c 20 69 45 6e 64 3e  <iStart || iEnd>
7bb0: 67 2e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  g.mxPage ){.    
7bc0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
7bd0: 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 22 50  rr,.          "P
7be0: 61 67 65 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  age argument sho
7bf0: 75 6c 64 20 62 65 20 4c 4f 57 45 52 3f 2e 2e 55  uld be LOWER?..U
7c00: 50 50 45 52 3f 2e 20 20 52 61 6e 67 65 20 31 20  PPER?.  Range 1 
7c10: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
7c20: 20 20 20 20 67 2e 6d 78 50 61 67 65 29 3b 0a 20      g.mxPage);. 
7c30: 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
7c40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
7c50: 69 6c 65 28 20 69 53 74 61 72 74 3c 3d 69 45 6e  ile( iStart<=iEn
7c60: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  d ){.        pri
7c70: 6e 74 5f 70 61 67 65 28 69 53 74 61 72 74 29 3b  nt_page(iStart);
7c80: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 2b  .        iStart+
7c90: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
7ca0: 0a 20 20 7d 0a 20 20 66 69 6c 65 43 6c 6f 73 65  .  }.  fileClose
7cb0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ();.  return 0;.
7cc0: 7d 0a                                            }.