/ Hex Artifact Content
Login

Artifact 202801a2056995b763864d60c2dee744d46f1677:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  /*.** This progr
0010: 61 6d 20 69 73 20 61 20 64 65 62 75 67 67 69 6e  am is a debuggin
0020: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 75  g and analysis u
0030: 74 69 6c 69 74 79 20 74 68 61 74 20 64 69 73 70  tility that disp
0040: 6c 61 79 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  lays.** informat
0050: 69 6f 6e 20 61 62 6f 75 74 20 61 6e 20 46 54 53  ion about an FTS
0060: 33 20 6f 72 20 46 54 53 34 20 69 6e 64 65 78 2e  3 or FTS4 index.
0070: 0a 2a 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 69 73  .**.** Link this
0080: 20 70 72 6f 67 72 61 6d 20 61 67 61 69 6e 73 74   program against
0090: 20 74 68 65 20 53 51 4c 69 74 65 33 20 61 6d 61   the SQLite3 ama
00a0: 6c 67 61 6d 61 74 69 6f 6e 20 77 69 74 68 20 74  lgamation with t
00b0: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41  he.** SQLITE_ENA
00c0: 42 4c 45 5f 46 54 53 34 20 63 6f 6d 70 69 6c 65  BLE_FTS4 compile
00d0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 54  -time option.  T
00e0: 68 65 6e 20 72 75 6e 20 69 74 20 61 73 3a 0a 2a  hen run it as:.*
00f0: 2a 0a 2a 2a 20 20 20 20 66 74 73 33 76 69 65 77  *.**    fts3view
0100: 20 44 41 54 41 42 41 53 45 0a 2a 2a 0a 2a 2a 20   DATABASE.**.** 
0110: 74 6f 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66  to get a list of
0120: 20 61 6c 6c 20 46 54 53 33 2f 34 20 74 61 62 6c   all FTS3/4 tabl
0130: 65 73 20 69 6e 20 44 41 54 41 42 41 53 45 2c 20  es in DATABASE, 
0140: 6f 72 20 64 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 66  or do.**.**    f
0150: 74 73 33 76 69 65 77 20 44 41 54 41 42 41 53 45  ts3view DATABASE
0160: 20 54 41 42 4c 45 20 43 4f 4d 4d 41 4e 44 20 2e   TABLE COMMAND .
0170: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 6f 20 73 65 65  ....**.** to see
0180: 20 76 61 72 69 6f 75 73 20 61 73 70 65 63 74 73   various aspects
0190: 20 6f 66 20 74 68 65 20 54 41 42 4c 45 20 74 61   of the TABLE ta
01a0: 62 6c 65 2e 20 20 54 79 70 65 20 66 74 73 33 76  ble.  Type fts3v
01b0: 69 65 77 20 77 69 74 68 20 6e 6f 0a 2a 2a 20 61  iew with no.** a
01c0: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c  rguments for a l
01d0: 69 73 74 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ist of available
01e0: 20 43 4f 4d 4d 41 4e 44 73 2e 0a 2a 2f 0a 23 69   COMMANDs..*/.#i
01f0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
0200: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72  .#include <stdar
0210: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  g.h>.#include <s
0220: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0230: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0240: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0250: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0260: 33 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72  3.h"../*.** Extr
0270: 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61  a command-line a
0280: 72 67 75 6d 65 6e 74 73 3a 0a 2a 2f 0a 69 6e 74  rguments:.*/.int
0290: 20 6e 45 78 74 72 61 3b 0a 63 68 61 72 20 2a 2a   nExtra;.char **
02a0: 61 7a 45 78 74 72 61 3b 0a 0a 2f 2a 0a 2a 2a 20  azExtra;../*.** 
02b0: 4c 6f 6f 6b 20 66 6f 72 20 61 20 63 6f 6d 6d 61  Look for a comma
02c0: 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
02d0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
02e0: 2a 66 69 6e 64 4f 70 74 69 6f 6e 28 63 6f 6e 73  *findOption(cons
02f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
0300: 6e 74 20 68 61 73 41 72 67 2c 20 63 6f 6e 73 74  nt hasArg, const
0310: 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29   char *zDefault)
0320: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  {.  int i;.  con
0330: 73 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  st char *zResult
0340: 20 3d 20 7a 44 65 66 61 75 6c 74 3b 0a 20 20 66   = zDefault;.  f
0350: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 74 72 61  or(i=0; i<nExtra
0360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
0370: 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 45 78  t char *z = azEx
0380: 74 72 61 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c  tra[i];.    whil
0390: 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  e( z[0]=='-' ) z
03a0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ++;.    if( strc
03b0: 6d 70 28 7a 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  mp(z, zName)==0 
03c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
03d0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61   1;.      if( ha
03e0: 73 41 72 67 3d 3d 30 20 7c 7c 20 69 3d 3d 6e 45  sArg==0 || i==nE
03f0: 78 74 72 61 2d 31 20 29 20 6a 20 3d 20 30 3b 0a  xtra-1 ) j = 0;.
0400: 20 20 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20        zResult = 
0410: 61 7a 45 78 74 72 61 5b 69 2b 6a 5d 3b 0a 20 20  azExtra[i+j];.  
0420: 20 20 20 20 77 68 69 6c 65 28 20 69 2b 6a 3c 6e      while( i+j<n
0430: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 20 20 20  Extra ){.       
0440: 20 61 7a 45 78 74 72 61 5b 69 5d 20 3d 20 61 7a   azExtra[i] = az
0450: 45 78 74 72 61 5b 69 2b 6a 2b 31 5d 3b 0a 20 20  Extra[i+j+1];.  
0460: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
0470: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
0480: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
0490: 72 6e 20 7a 52 65 73 75 6c 74 3b 20 20 20 20 20  rn zResult;     
04a0: 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65    .}.../*.** Pre
04b0: 70 61 72 65 20 61 6e 20 53 51 4c 20 71 75 65 72  pare an SQL quer
04c0: 79 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  y.*/.static sqli
04d0: 74 65 33 5f 73 74 6d 74 20 2a 70 72 65 70 61 72  te3_stmt *prepar
04e0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
04f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
0500: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
0510: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
0520: 7a 53 71 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  zSql;.  sqlite3_
0530: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
0540: 6e 74 20 72 63 3b 0a 0a 20 20 76 61 5f 73 74 61  nt rc;..  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
0570: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
0580: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
0590: 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  d(ap);.  rc = sq
05a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
05b0: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
05c0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
05d0: 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e   rc ){.    fprin
05e0: 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
05f0: 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 25 73 5c 6e  r: %s\nSQL: %s\n
0600: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
0610: 67 28 64 62 29 2c 20 7a 53 71 6c 29 3b 0a 20 20  g(db), zSql);.  
0620: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
0630: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
0640: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 53  ql);.  return pS
0650: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  tmt;.}../*.** Ru
0660: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
0670: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nt.*/.static int
0680: 20 72 75 6e 53 71 6c 28 73 71 6c 69 74 65 33 20   runSql(sqlite3 
0690: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
06a0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
06b0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
06c0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
06d0: 74 20 72 63 3b 0a 0a 20 20 76 61 5f 73 74 61 72  t rc;..  va_star
06e0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
06f0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
0700: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
0710: 74 2c 20 61 70 29 3b 0a 20 20 72 63 20 3d 20 73  t, ap);.  rc = s
0720: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
0730: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
0740: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
0750: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
0760: 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 74 61 62  .** Show the tab
0770: 6c 65 20 73 63 68 65 6d 61 0a 2a 2f 0a 73 74 61  le schema.*/.sta
0780: 74 69 63 20 76 6f 69 64 20 73 68 6f 77 53 63 68  tic void showSch
0790: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
07a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
07b0: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  b){.  sqlite3_st
07c0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 70 53 74  mt *pStmt;.  pSt
07d0: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
07e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
07f0: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
0800: 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
0810: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
0820: 20 6e 61 6d 65 20 4c 49 4b 45 20 27 25 71 25 25   name LIKE '%q%%
0830: 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  '".            "
0840: 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20   ORDER BY 1",.  
0850: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 29 3b            zTab);
0860: 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
0870: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
0880: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
0890: 20 70 72 69 6e 74 66 28 22 25 73 3b 5c 6e 22 2c   printf("%s;\n",
08a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
08b0: 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
08c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
08d0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
08e0: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72    pStmt = prepar
08f0: 65 28 64 62 2c 20 22 50 52 41 47 4d 41 20 70 61  e(db, "PRAGMA pa
0900: 67 65 5f 73 69 7a 65 22 29 3b 0a 20 20 77 68 69  ge_size");.  whi
0910: 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
0920: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
0930: 52 4f 57 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ROW ){.    print
0940: 66 28 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  f("PRAGMA page_s
0950: 69 7a 65 3d 25 73 3b 5c 6e 22 2c 20 73 71 6c 69  ize=%s;\n", sqli
0960: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
0970: 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 0a  pStmt, 0));.  }.
0980: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
0990: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 70 53 74  ze(pStmt);.  pSt
09a0: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
09b0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
09c0: 5f 6d 6f 64 65 22 29 3b 0a 20 20 77 68 69 6c 65  _mode");.  while
09d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
09e0: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
09f0: 57 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  W ){.    printf(
0a00: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
0a10: 6d 6f 64 65 3d 25 73 3b 5c 6e 22 2c 20 73 71 6c  mode=%s;\n", sql
0a20: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
0a30: 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d  (pStmt, 0));.  }
0a40: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
0a50: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 70 53  ize(pStmt);.  pS
0a60: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62  tmt = prepare(db
0a70: 2c 20 22 50 52 41 47 4d 41 20 61 75 74 6f 5f 76  , "PRAGMA auto_v
0a80: 61 63 75 75 6d 22 29 3b 0a 20 20 77 68 69 6c 65  acuum");.  while
0a90: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
0aa0: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
0ab0: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
0ac0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22 3f 3f  har *zType = "??
0ad0: 3f 22 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ?";.    switch( 
0ae0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
0af0: 6e 74 28 70 53 74 6d 74 2c 20 30 29 20 29 7b 0a  nt(pStmt, 0) ){.
0b00: 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 7a        case 0:  z
0b10: 54 79 70 65 20 3d 20 22 4f 46 46 22 3b 20 20 20  Type = "OFF";   
0b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0b30: 20 20 20 63 61 73 65 20 31 3a 20 20 7a 54 79 70     case 1:  zTyp
0b40: 65 20 3d 20 22 46 55 4c 4c 22 3b 20 20 20 20 20  e = "FULL";     
0b50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
0b60: 63 61 73 65 20 32 3a 20 20 7a 54 79 70 65 20 3d  case 2:  zType =
0b70: 20 22 49 4e 43 52 45 4d 45 4e 54 41 4c 22 3b 20   "INCREMENTAL"; 
0b80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
0b90: 20 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20   printf("PRAGMA 
0ba0: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 25 73 3b 5c  auto_vacuum=%s;\
0bb0: 6e 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  n", zType);.  }.
0bc0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
0bd0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 70 53 74  ze(pStmt);.  pSt
0be0: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
0bf0: 20 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e   "PRAGMA encodin
0c00: 67 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  g");.  while( sq
0c10: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
0c20: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
0c30: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 52 41  .    printf("PRA
0c40: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 3d 25 73 3b  GMA encoding=%s;
0c50: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
0c60: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
0c70: 30 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  0));.  }.  sqlit
0c80: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
0c90: 74 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  t);.}../* .** Re
0ca0: 61 64 20 61 20 36 34 2d 62 69 74 20 76 61 72 69  ad a 64-bit vari
0cb0: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
0cc0: 67 65 72 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20  ger from memory 
0cd0: 73 74 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d  starting at p[0]
0ce0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
0cf0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
0d00: 72 65 61 64 2c 20 6f 72 20 30 20 6f 6e 20 65 72  read, or 0 on er
0d10: 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ror..** The valu
0d20: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a  e is stored in *
0d30: 76 2e 0a 2a 2f 0a 69 6e 74 20 67 65 74 56 61 72  v..*/.int getVar
0d40: 69 6e 74 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  int(const unsign
0d50: 65 64 20 63 68 61 72 20 2a 70 2c 20 73 71 6c 69  ed char *p, sqli
0d60: 74 65 5f 69 6e 74 36 34 20 2a 76 29 7b 0a 20 20  te_int64 *v){.  
0d70: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
0d80: 68 61 72 20 2a 71 20 3d 20 70 3b 0a 20 20 73 71  har *q = p;.  sq
0d90: 6c 69 74 65 5f 75 69 6e 74 36 34 20 78 20 3d 20  lite_uint64 x = 
0da0: 30 2c 20 79 20 3d 20 31 3b 0a 20 20 77 68 69 6c  0, y = 1;.  whil
0db0: 65 28 20 28 2a 71 26 30 78 38 30 29 3d 3d 30 78  e( (*q&0x80)==0x
0dc0: 38 30 20 26 26 20 71 2d 28 75 6e 73 69 67 6e 65  80 && q-(unsigne
0dd0: 64 20 63 68 61 72 20 2a 29 70 3c 39 20 29 7b 0a  d char *)p<9 ){.
0de0: 20 20 20 20 78 20 2b 3d 20 79 20 2a 20 28 2a 71      x += y * (*q
0df0: 2b 2b 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  ++ & 0x7f);.    
0e00: 79 20 3c 3c 3d 20 37 3b 0a 20 20 7d 0a 20 20 78  y <<= 7;.  }.  x
0e10: 20 2b 3d 20 79 20 2a 20 28 2a 71 2b 2b 29 3b 0a   += y * (*q++);.
0e20: 20 20 2a 76 20 3d 20 28 73 71 6c 69 74 65 5f 69    *v = (sqlite_i
0e30: 6e 74 36 34 29 20 78 3b 0a 20 20 72 65 74 75 72  nt64) x;.  retur
0e40: 6e 20 28 69 6e 74 29 20 28 71 20 2d 20 28 75 6e  n (int) (q - (un
0e50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 29  signed char *)p)
0e60: 3b 0a 7d 0a 0a 0a 2f 2a 20 53 68 6f 77 20 74 68  ;.}.../* Show th
0e70: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
0e80: 20 25 5f 73 74 61 74 20 74 61 62 6c 65 0a 2a 2f   %_stat table.*/
0e90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 6f  .static void sho
0ea0: 77 53 74 61 74 28 73 71 6c 69 74 65 33 20 2a 64  wStat(sqlite3 *d
0eb0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0ec0: 54 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Tab){.  sqlite3_
0ed0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 70  stmt *pStmt;.  p
0ee0: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64  Stmt = prepare(d
0ef0: 62 2c 20 22 53 45 4c 45 43 54 20 69 64 2c 20 76  b, "SELECT id, v
0f00: 61 6c 75 65 20 46 52 4f 4d 20 27 25 71 5f 73 74  alue FROM '%q_st
0f10: 61 74 27 22 2c 20 7a 54 61 62 29 3b 0a 20 20 77  at'", zTab);.  w
0f20: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
0f30: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
0f40: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 70 72 69  E_ROW ){.    pri
0f50: 6e 74 66 28 22 73 74 61 74 5b 25 64 5d 20 3d 22  ntf("stat[%d] ="
0f60: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
0f70: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  _int(pStmt, 0));
0f80: 0a 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c  .    switch( sql
0f90: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
0fa0: 28 70 53 74 6d 74 2c 20 31 29 20 29 7b 0a 20 20  (pStmt, 1) ){.  
0fb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0fc0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
0fd0: 20 20 20 70 72 69 6e 74 66 28 22 20 25 64 5c 6e     printf(" %d\n
0fe0: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
0ff0: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 29  n_int(pStmt, 1))
1000: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1020: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
1030: 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
1040: 6e 65 64 20 63 68 61 72 20 2a 78 20 3d 20 28 75  ned char *x = (u
1050: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 73 71  nsigned char*)sq
1060: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1070: 62 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  b(pStmt, 1);.   
1080: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73       int len = s
1090: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
10a0: 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  tes(pStmt, 1);. 
10b0: 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30         int i = 0
10c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10d0: 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20 20 20  3_int64 v;.     
10e0: 20 20 20 77 68 69 6c 65 28 20 69 3c 6c 65 6e 20     while( i<len 
10f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  ){.          i +
1100: 3d 20 67 65 74 56 61 72 69 6e 74 28 78 2c 20 26  = getVarint(x, &
1110: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  v);.          pr
1120: 69 6e 74 66 28 22 20 25 6c 6c 64 22 2c 20 76 29  intf(" %lld", v)
1130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1140: 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
1150: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1170: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
1180: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
1190: 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 6f 6e  ./*.** Report on
11a0: 20 74 68 65 20 76 6f 63 61 62 75 6c 61 72 79 2e   the vocabulary.
11b0: 20 20 54 68 69 73 20 63 72 65 61 74 65 73 20 61    This creates a
11c0: 6e 20 66 74 73 34 61 75 78 20 74 61 62 6c 65 20  n fts4aux table 
11d0: 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 0a 2a 2a  with a random.**
11e0: 20 6e 61 6d 65 2c 20 62 75 74 20 64 65 6c 65 74   name, but delet
11f0: 65 73 20 69 74 20 69 6e 20 74 68 65 20 65 6e 64  es it in the end
1200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1210: 20 73 68 6f 77 56 6f 63 61 62 75 6c 61 72 79 28   showVocabulary(
1220: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1230: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
1240: 20 20 63 68 61 72 20 2a 7a 41 75 78 3b 0a 20 20    char *zAux;.  
1250: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
1260: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1270: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 6e   *pStmt;.  int n
1280: 44 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Doc = 0;.  int n
1290: 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  Token = 0;.  int
12a0: 20 6e 4f 63 63 75 72 72 65 6e 63 65 20 3d 20 30   nOccurrence = 0
12b0: 3b 0a 20 20 69 6e 74 20 6e 54 6f 70 3b 0a 20 20  ;.  int nTop;.  
12c0: 69 6e 74 20 6e 2c 20 69 3b 0a 0a 20 20 73 71 6c  int n, i;..  sql
12d0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
12e0: 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
12f0: 20 20 7a 41 75 78 20 3d 20 73 71 6c 69 74 65 33    zAux = sqlite3
1300: 5f 6d 70 72 69 6e 74 66 28 22 76 69 65 77 65 72  _mprintf("viewer
1310: 5f 25 6c 6c 78 22 2c 20 7a 54 61 62 2c 20 72 29  _%llx", zTab, r)
1320: 3b 0a 20 20 72 75 6e 53 71 6c 28 64 62 2c 20 22  ;.  runSql(db, "
1330: 42 45 47 49 4e 22 29 3b 0a 20 20 70 53 74 6d 74  BEGIN");.  pStmt
1340: 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c 20 22   = prepare(db, "
1350: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1360: 46 52 4f 4d 20 25 51 22 2c 20 7a 54 61 62 29 3b  FROM %Q", zTab);
1370: 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
1380: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
1390: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
13a0: 20 6e 44 6f 63 20 3d 20 73 71 6c 69 74 65 33 5f   nDoc = sqlite3_
13b0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
13c0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
13d0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
13e0: 6d 74 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 4e  mt);.  printf("N
13f0: 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
1400: 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ts..............
1410: 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 64 5c 6e 22 2c  ........ %9d\n",
1420: 20 6e 44 6f 63 29 3b 0a 0a 20 20 72 75 6e 53 71   nDoc);..  runSq
1430: 6c 28 64 62 2c 20 22 43 52 45 41 54 45 20 56 49  l(db, "CREATE VI
1440: 52 54 55 41 4c 20 54 41 42 4c 45 20 25 73 20 55  RTUAL TABLE %s U
1450: 53 49 4e 47 20 66 74 73 34 61 75 78 28 25 51 29  SING fts4aux(%Q)
1460: 22 2c 20 7a 41 75 78 2c 20 7a 54 61 62 29 3b 0a  ", zAux, zTab);.
1470: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72    pStmt = prepar
1480: 65 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  e(db, .         
1490: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
14a0: 74 28 2a 29 2c 20 73 75 6d 28 6f 63 63 75 72 72  t(*), sum(occurr
14b0: 65 6e 63 65 73 29 20 46 52 4f 4d 20 25 73 20 57  ences) FROM %s W
14c0: 48 45 52 45 20 63 6f 6c 3d 27 2a 27 22 2c 0a 20  HERE col='*'",. 
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 75 78              zAux
14e0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
14f0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
1500: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1510: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
1520: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
1530: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 6e 4f  Stmt, 0);.    nO
1540: 63 63 75 72 72 65 6e 63 65 20 3d 20 73 71 6c 69  ccurrence = sqli
1550: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
1560: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  Stmt, 1);.  }.  
1570: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1580: 28 70 53 74 6d 74 29 3b 0a 20 20 70 72 69 6e 74  (pStmt);.  print
1590: 66 28 22 54 6f 74 61 6c 20 74 6f 6b 65 6e 73 20  f("Total tokens 
15a0: 69 6e 20 61 6c 6c 20 64 6f 63 75 6d 65 6e 74 73  in all documents
15b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 64  ............ %9d
15c0: 5c 6e 22 2c 20 6e 4f 63 63 75 72 72 65 6e 63 65  \n", nOccurrence
15d0: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 54 6f 74  );.  printf("Tot
15e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 73  al number of dis
15f0: 74 69 6e 63 74 20 74 6f 6b 65 6e 73 2e 2e 2e 2e  tinct tokens....
1600: 2e 2e 2e 2e 2e 2e 20 25 39 64 5c 6e 22 2c 20 6e  ...... %9d\n", n
1610: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 6e 54  Token);.  if( nT
1620: 6f 6b 65 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 65  oken==0 ) goto e
1630: 6e 64 5f 76 6f 63 61 62 3b 0a 0a 20 20 6e 20 3d  nd_vocab;..  n =
1640: 20 30 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 72   0;.  pStmt = pr
1650: 65 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45 43  epare(db, "SELEC
1660: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1670: 25 73 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %s".            
1680: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
1690: 45 20 63 6f 6c 3d 27 2a 27 20 41 4e 44 20 6f 63  E col='*' AND oc
16a0: 63 75 72 72 65 6e 63 65 73 3d 3d 31 22 2c 20 7a  currences==1", z
16b0: 41 75 78 29 3b 0a 20 20 77 68 69 6c 65 28 20 73  Aux);.  while( s
16c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
16d0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
16e0: 7b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  {.    n = sqlite
16f0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
1700: 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  mt, 0);.  }.  sq
1710: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1720: 53 74 6d 74 29 3b 0a 20 20 70 72 69 6e 74 66 28  Stmt);.  printf(
1730: 22 54 6f 6b 65 6e 73 20 75 73 65 64 20 65 78 61  "Tokens used exa
1740: 63 74 6c 79 20 6f 6e 63 65 2e 2e 2e 2e 2e 2e 2e  ctly once.......
1750: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 64 20 25  .......... %9d %
1760: 35 2e 32 66 25 25 5c 6e 22 2c 0a 20 20 20 20 20  5.2f%%\n",.     
1770: 20 20 20 20 20 6e 2c 20 6e 2a 31 30 30 2e 30 2f       n, n*100.0/
1780: 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 6e 20 3d 20  nToken);..  n = 
1790: 30 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 72 65  0;.  pStmt = pre
17a0: 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45 43 54  pare(db, "SELECT
17b0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25   count(*) FROM %
17c0: 73 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s".             
17d0: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
17e0: 20 63 6f 6c 3d 27 2a 27 20 41 4e 44 20 64 6f 63   col='*' AND doc
17f0: 75 6d 65 6e 74 73 3d 3d 31 22 2c 20 7a 41 75 78  uments==1", zAux
1800: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
1810: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
1820: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1830: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63     n = sqlite3_c
1840: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
1850: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1860: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1870: 74 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 54 6f  t);.  printf("To
1880: 6b 65 6e 73 20 75 73 65 64 20 69 6e 20 6f 6e 6c  kens used in onl
1890: 79 20 6f 6e 65 20 64 6f 63 75 6d 65 6e 74 2e 2e  y one document..
18a0: 2e 2e 2e 2e 2e 2e 2e 20 25 39 64 20 25 35 2e 32  ....... %9d %5.2
18b0: 66 25 25 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  f%%\n",.        
18c0: 20 20 6e 2c 20 6e 2a 31 30 30 2e 30 2f 6e 54 6f    n, n*100.0/nTo
18d0: 6b 65 6e 29 3b 0a 0a 20 20 69 66 28 20 6e 44 6f  ken);..  if( nDo
18e0: 63 3e 3d 32 30 30 30 20 29 7b 0a 20 20 20 20 6e  c>=2000 ){.    n
18f0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 6d 74 20   = 0;.    pStmt 
1900: 3d 20 70 72 65 70 61 72 65 28 64 62 2c 20 22 53  = prepare(db, "S
1910: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1920: 52 4f 4d 20 25 73 22 0a 20 20 20 20 20 20 20 20  ROM %s".        
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 22 20 57 48 45 52 45 20 63 6f 6c 3d 27 2a 27 20  " WHERE col='*' 
1950: 41 4e 44 20 6f 63 63 75 72 72 65 6e 63 65 73 3c  AND occurrences<
1960: 3d 25 64 22 2c 20 7a 41 75 78 2c 20 6e 44 6f 63  =%d", zAux, nDoc
1970: 2f 31 30 30 30 29 3b 0a 20 20 20 20 77 68 69 6c  /1000);.    whil
1980: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
1990: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
19a0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  OW ){.      n = 
19b0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
19c0: 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
19d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
19e0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
19f0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 54 6f 6b  .    printf("Tok
1a00: 65 6e 73 20 75 73 65 64 20 69 6e 20 30 2e 31 25  ens used in 0.1%
1a10: 25 20 6f 72 20 6c 65 73 73 20 6f 66 20 64 6f 63  % or less of doc
1a20: 73 2e 2e 2e 2e 2e 2e 20 25 39 64 20 25 35 2e 32  s...... %9d %5.2
1a30: 66 25 25 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  f%%\n",.        
1a40: 20 20 20 20 6e 2c 20 6e 2a 31 30 30 2e 30 2f 6e      n, n*100.0/n
1a50: 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69  Token);.  }..  i
1a60: 66 28 20 6e 44 6f 63 3e 3d 32 30 30 20 29 7b 0a  f( nDoc>=200 ){.
1a70: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 70      n = 0;.    p
1a80: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64  Stmt = prepare(d
1a90: 62 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  b, "SELECT count
1aa0: 28 2a 29 20 46 52 4f 4d 20 25 73 22 0a 20 20 20  (*) FROM %s".   
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 22 20 57 48 45 52 45 20 63 6f 6c       " WHERE col
1ad0: 3d 27 2a 27 20 41 4e 44 20 6f 63 63 75 72 72 65  ='*' AND occurre
1ae0: 6e 63 65 73 3c 3d 25 64 22 2c 20 7a 41 75 78 2c  nces<=%d", zAux,
1af0: 20 6e 44 6f 63 2f 31 30 30 29 3b 0a 20 20 20 20   nDoc/100);.    
1b00: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
1b10: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1b20: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
1b30: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
1b40: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
1b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b60: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1b70: 6d 74 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  mt);.    printf(
1b80: 22 54 6f 6b 65 6e 73 20 75 73 65 64 20 69 6e 20  "Tokens used in 
1b90: 31 25 25 20 6f 72 20 6c 65 73 73 20 6f 66 20 64  1%% or less of d
1ba0: 6f 63 73 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 64 20  ocs........ %9d 
1bb0: 25 35 2e 32 66 25 25 5c 6e 22 2c 0a 20 20 20 20  %5.2f%%\n",.    
1bc0: 20 20 20 20 20 20 20 20 6e 2c 20 6e 2a 31 30 30          n, n*100
1bd0: 2e 30 2f 6e 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  .0/nToken);.  }.
1be0: 0a 20 20 6e 54 6f 70 20 3d 20 61 74 6f 69 28 66  .  nTop = atoi(f
1bf0: 69 6e 64 4f 70 74 69 6f 6e 28 22 74 6f 70 22 2c  indOption("top",
1c00: 20 31 2c 20 22 32 35 22 29 29 3b 0a 20 20 70 72   1, "25"));.  pr
1c10: 69 6e 74 66 28 22 54 68 65 20 25 64 20 6d 6f 73  intf("The %d mos
1c20: 74 20 63 6f 6d 6d 6f 6e 20 74 6f 6b 65 6e 73 3a  t common tokens:
1c30: 5c 6e 22 2c 20 6e 54 6f 70 29 3b 0a 20 20 70 53  \n", nTop);.  pS
1c40: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62  tmt = prepare(db
1c50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
1c60: 45 4c 45 43 54 20 74 65 72 6d 2c 20 64 6f 63 75  ELECT term, docu
1c70: 6d 65 6e 74 73 20 46 52 4f 4d 20 25 73 22 0a 20  ments FROM %s". 
1c80: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
1c90: 52 45 20 63 6f 6c 3d 27 2a 27 22 0a 20 20 20 20  RE col='*'".    
1ca0: 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
1cb0: 42 59 20 64 6f 63 75 6d 65 6e 74 73 20 44 45 53  BY documents DES
1cc0: 43 2c 20 74 65 72 6d 22 0a 20 20 20 20 20 20 20  C, term".       
1cd0: 20 20 20 20 20 22 20 4c 49 4d 49 54 20 25 64 22       " LIMIT %d"
1ce0: 2c 20 7a 41 75 78 2c 20 6e 54 6f 70 29 3b 0a 20  , zAux, nTop);. 
1cf0: 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
1d00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1d10: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1d20: 20 29 7b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   ){.    i++;.   
1d30: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   n = sqlite3_col
1d40: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
1d50: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  );.    printf(" 
1d60: 20 25 32 64 2e 20 25 2d 33 30 73 20 25 39 64 20   %2d. %-30s %9d 
1d70: 64 6f 63 73 20 25 35 2e 32 66 25 25 5c 6e 22 2c  docs %5.2f%%\n",
1d80: 20 69 2c 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i,.      sqlite
1d90: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
1da0: 74 6d 74 2c 20 30 29 2c 20 6e 2c 20 6e 2a 31 30  tmt, 0), n, n*10
1db0: 30 2e 30 2f 6e 44 6f 63 29 3b 0a 20 20 7d 0a 20  0.0/nDoc);.  }. 
1dc0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1dd0: 65 28 70 53 74 6d 74 29 3b 0a 0a 65 6e 64 5f 76  e(pStmt);..end_v
1de0: 6f 63 61 62 3a 0a 20 20 72 75 6e 53 71 6c 28 64  ocab:.  runSql(d
1df0: 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 29 3b 0a  b, "ROLLBACK");.
1e00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1e10: 41 75 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Aux);.}../*.** R
1e20: 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 6e 75 6d  eport on the num
1e30: 62 65 72 20 61 6e 64 20 73 69 7a 65 73 20 6f 66  ber and sizes of
1e40: 20 73 65 67 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   segments.*/.sta
1e50: 74 69 63 20 76 6f 69 64 20 73 68 6f 77 53 65 67  tic void showSeg
1e60: 6d 65 6e 74 53 74 61 74 73 28 73 71 6c 69 74 65  mentStats(sqlite
1e70: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1e80: 72 20 2a 7a 54 61 62 29 7b 0a 20 20 73 71 6c 69  r *zTab){.  sqli
1e90: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1ea0: 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
1eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1ec0: 20 73 7a 53 65 67 20 3d 20 30 2c 20 6d 78 53 65   szSeg = 0, mxSe
1ed0: 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 49 64  g = 0;.  int nId
1ee0: 78 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  x = 0;.  sqlite3
1ef0: 5f 69 6e 74 36 34 20 73 7a 49 64 78 20 3d 20 30  _int64 szIdx = 0
1f00: 2c 20 6d 78 49 64 78 20 3d 20 30 3b 0a 20 20 69  , mxIdx = 0;.  i
1f10: 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b 0a 20 20  nt nRoot = 0;.  
1f20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
1f30: 52 6f 6f 74 20 3d 20 30 2c 20 6d 78 52 6f 6f 74  Root = 0, mxRoot
1f40: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1f50: 69 6e 74 36 34 20 6d 78 3b 0a 20 20 69 6e 74 20  int64 mx;.  int 
1f60: 6e 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 3b 0a  nLeaf;.  int n;.
1f70: 20 20 69 6e 74 20 70 67 73 7a 3b 0a 20 20 69 6e    int pgsz;.  in
1f80: 74 20 6d 78 4c 65 76 65 6c 3b 0a 20 20 69 6e 74  t mxLevel;.  int
1f90: 20 69 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 70   i;..  pStmt = p
1fa0: 72 65 70 61 72 65 28 64 62 2c 0a 20 20 20 20 20  repare(db,.     
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
1fc0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 73  LECT count(*), s
1fd0: 75 6d 28 6c 65 6e 67 74 68 28 62 6c 6f 63 6b 29  um(length(block)
1fe0: 29 2c 20 6d 61 78 28 6c 65 6e 67 74 68 28 62 6c  ), max(length(bl
1ff0: 6f 63 6b 29 29 22 0a 20 20 20 20 20 20 20 20 20  ock))".         
2000: 20 20 20 20 20 20 20 20 20 22 20 46 52 4f 4d 20           " FROM 
2010: 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 22 2c 0a  '%q_segments'",.
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c 65    zTab);.  while
2040: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
2050: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
2060: 57 20 29 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20  W ){.    nSeg = 
2070: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2080: 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
2090: 20 20 73 7a 53 65 67 20 3d 20 73 71 6c 69 74 65    szSeg = sqlite
20a0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
20b0: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 6d 78  Stmt, 1);.    mx
20c0: 53 65 67 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Seg = sqlite3_co
20d0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
20e0: 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 2);.  }.  sqli
20f0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2100: 6d 74 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70  mt);.  pStmt = p
2110: 72 65 70 61 72 65 28 64 62 2c 0a 20 20 20 20 20  repare(db,.     
2120: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
2130: 6f 75 6e 74 28 2a 29 2c 20 73 75 6d 28 6c 65 6e  ount(*), sum(len
2140: 67 74 68 28 62 6c 6f 63 6b 29 29 2c 20 6d 61 78  gth(block)), max
2150: 28 6c 65 6e 67 74 68 28 62 6c 6f 63 6b 29 29 22  (length(block))"
2160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20  .            "  
2170: 46 52 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e 74  FROM '%q_segment
2180: 73 27 20 61 20 4a 4f 49 4e 20 27 25 71 5f 73 65  s' a JOIN '%q_se
2190: 67 64 69 72 27 20 62 22 0a 20 20 20 20 20 20 20  gdir' b".       
21a0: 20 20 20 20 20 22 20 57 48 45 52 45 20 61 2e 62       " WHERE a.b
21b0: 6c 6f 63 6b 69 64 20 42 45 54 57 45 45 4e 20 62  lockid BETWEEN b
21c0: 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  .leaves_end_bloc
21d0: 6b 2b 31 20 41 4e 44 20 62 2e 65 6e 64 5f 62 6c  k+1 AND b.end_bl
21e0: 6f 63 6b 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ock",.          
21f0: 20 20 7a 54 61 62 2c 20 7a 54 61 62 29 3b 0a 20    zTab, zTab);. 
2200: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
2210: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2220: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 6e  ITE_ROW ){.    n
2230: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Idx = sqlite3_co
2240: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2250: 30 29 3b 0a 20 20 20 20 73 7a 49 64 78 20 3d 20  0);.    szIdx = 
2260: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2270: 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
2280: 20 20 20 20 6d 78 49 64 78 20 3d 20 73 71 6c 69      mxIdx = sqli
2290: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
22a0: 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 7d 0a  (pStmt, 2);.  }.
22b0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
22c0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 70 53 74  ze(pStmt);.  pSt
22d0: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
22e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
22f0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 73  LECT count(*), s
2300: 75 6d 28 6c 65 6e 67 74 68 28 72 6f 6f 74 29 29  um(length(root))
2310: 2c 20 6d 61 78 28 6c 65 6e 67 74 68 28 72 6f 6f  , max(length(roo
2320: 74 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  t))".           
2330: 20 22 20 20 46 52 4f 4d 20 27 25 71 5f 73 65 67   "  FROM '%q_seg
2340: 64 69 72 27 22 2c 0a 20 20 20 20 20 20 20 20 20  dir'",.         
2350: 20 20 20 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c     zTab);.  whil
2360: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
2370: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
2380: 4f 57 20 29 7b 0a 20 20 20 20 6e 52 6f 6f 74 20  OW ){.    nRoot 
2390: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
23a0: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
23b0: 20 20 20 20 73 7a 52 6f 6f 74 20 3d 20 73 71 6c      szRoot = sql
23c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
23d0: 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  4(pStmt, 1);.   
23e0: 20 6d 78 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65   mxRoot = sqlite
23f0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
2400: 53 74 6d 74 2c 20 32 29 3b 0a 20 20 7d 0a 20 20  Stmt, 2);.  }.  
2410: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2420: 28 70 53 74 6d 74 29 3b 0a 0a 20 20 70 72 69 6e  (pStmt);..  prin
2430: 74 66 28 22 4e 75 6d 62 65 72 20 6f 66 20 73 65  tf("Number of se
2440: 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  gments..........
2450: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39  ............. %9
2460: 64 5c 6e 22 2c 20 6e 53 65 67 2b 6e 52 6f 6f 74  d\n", nSeg+nRoot
2470: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 4e 75 6d  );.  printf("Num
2480: 62 65 72 20 6f 66 20 6c 65 61 66 20 73 65 67 6d  ber of leaf segm
2490: 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ents............
24a0: 2e 2e 2e 2e 2e 2e 20 25 39 64 5c 6e 22 2c 20 6e  ...... %9d\n", n
24b0: 53 65 67 2d 6e 49 64 78 29 3b 0a 20 20 70 72 69  Seg-nIdx);.  pri
24c0: 6e 74 66 28 22 4e 75 6d 62 65 72 20 6f 66 20 69  ntf("Number of i
24d0: 6e 64 65 78 20 73 65 67 6d 65 6e 74 73 2e 2e 2e  ndex segments...
24e0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25  .............. %
24f0: 39 64 5c 6e 22 2c 20 6e 49 64 78 29 3b 0a 20 20  9d\n", nIdx);.  
2500: 70 72 69 6e 74 66 28 22 4e 75 6d 62 65 72 20 6f  printf("Number o
2510: 66 20 72 6f 6f 74 20 73 65 67 6d 65 6e 74 73 2e  f root segments.
2520: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
2530: 2e 20 25 39 64 5c 6e 22 2c 20 6e 52 6f 6f 74 29  . %9d\n", nRoot)
2540: 3b 0a 20 20 70 72 69 6e 74 66 28 22 54 6f 74 61  ;.  printf("Tota
2550: 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 73 65  l size of all se
2560: 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  gments..........
2570: 2e 2e 2e 2e 2e 20 25 39 6c 6c 64 5c 6e 22 2c 20  ..... %9lld\n", 
2580: 73 7a 53 65 67 2b 73 7a 52 6f 6f 74 29 3b 0a 20  szSeg+szRoot);. 
2590: 20 70 72 69 6e 74 66 28 22 54 6f 74 61 6c 20 73   printf("Total s
25a0: 69 7a 65 20 6f 66 20 61 6c 6c 20 6c 65 61 66 20  ize of all leaf 
25b0: 73 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e  segments........
25c0: 2e 2e 20 25 39 6c 6c 64 5c 6e 22 2c 20 73 7a 53  .. %9lld\n", szS
25d0: 65 67 2d 73 7a 49 64 78 29 3b 0a 20 20 70 72 69  eg-szIdx);.  pri
25e0: 6e 74 66 28 22 54 6f 74 61 6c 20 73 69 7a 65 20  ntf("Total size 
25f0: 6f 66 20 61 6c 6c 20 69 6e 64 65 78 20 73 65 67  of all index seg
2600: 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25  ments......... %
2610: 39 6c 6c 64 5c 6e 22 2c 20 73 7a 49 64 78 29 3b  9lld\n", szIdx);
2620: 0a 20 20 70 72 69 6e 74 66 28 22 54 6f 74 61 6c  .  printf("Total
2630: 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 72 6f 6f   size of all roo
2640: 74 20 73 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e  t segments......
2650: 2e 2e 2e 2e 20 25 39 6c 6c 64 5c 6e 22 2c 20 73  .... %9lld\n", s
2660: 7a 52 6f 6f 74 29 3b 0a 20 20 69 66 28 20 6e 53  zRoot);.  if( nS
2670: 65 67 3e 30 20 29 7b 0a 20 20 20 20 70 72 69 6e  eg>0 ){.    prin
2680: 74 66 28 22 41 76 65 72 61 67 65 20 73 69 7a 65  tf("Average size
2690: 20 6f 66 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   of all segments
26a0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25 31  ............. %1
26b0: 31 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  1.1f\n",.       
26c0: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 73 7a       (double)(sz
26d0: 53 65 67 2b 73 7a 52 6f 6f 74 29 2f 28 64 6f 75  Seg+szRoot)/(dou
26e0: 62 6c 65 29 28 6e 53 65 67 2b 6e 52 6f 6f 74 29  ble)(nSeg+nRoot)
26f0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 41  );.    printf("A
2700: 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 6c  verage size of l
2710: 65 61 66 20 73 65 67 6d 65 6e 74 73 2e 2e 2e 2e  eaf segments....
2720: 2e 2e 2e 2e 2e 2e 2e 2e 20 25 31 31 2e 31 66 5c  ........ %11.1f\
2730: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2740: 28 64 6f 75 62 6c 65 29 28 73 7a 53 65 67 2d 73  (double)(szSeg-s
2750: 7a 49 64 78 29 2f 28 64 6f 75 62 6c 65 29 28 6e  zIdx)/(double)(n
2760: 53 65 67 2d 6e 49 64 78 29 29 3b 0a 20 20 7d 0a  Seg-nIdx));.  }.
2770: 20 20 69 66 28 20 6e 49 64 78 3e 30 20 29 7b 0a    if( nIdx>0 ){.
2780: 20 20 20 20 70 72 69 6e 74 66 28 22 41 76 65 72      printf("Aver
2790: 61 67 65 20 73 69 7a 65 20 6f 66 20 69 6e 64 65  age size of inde
27a0: 78 20 73 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e  x segments......
27b0: 2e 2e 2e 2e 2e 20 25 31 31 2e 31 66 5c 6e 22 2c  ..... %11.1f\n",
27c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f  .            (do
27d0: 75 62 6c 65 29 73 7a 49 64 78 2f 28 64 6f 75 62  uble)szIdx/(doub
27e0: 6c 65 29 6e 49 64 78 29 3b 0a 20 20 7d 0a 20 20  le)nIdx);.  }.  
27f0: 69 66 28 20 6e 52 6f 6f 74 3e 30 20 29 7b 0a 20  if( nRoot>0 ){. 
2800: 20 20 20 70 72 69 6e 74 66 28 22 41 76 65 72 61     printf("Avera
2810: 67 65 20 73 69 7a 65 20 6f 66 20 72 6f 6f 74 20  ge size of root 
2820: 73 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e  segments........
2830: 2e 2e 2e 2e 20 25 31 31 2e 31 66 5c 6e 22 2c 0a  .... %11.1f\n",.
2840: 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f 75              (dou
2850: 62 6c 65 29 73 7a 52 6f 6f 74 2f 28 64 6f 75 62  ble)szRoot/(doub
2860: 6c 65 29 6e 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20  le)nRoot);.  }. 
2870: 20 6d 78 20 3d 20 6d 78 53 65 67 3b 0a 20 20 69   mx = mxSeg;.  i
2880: 66 28 20 6d 78 3c 6d 78 52 6f 6f 74 20 29 20 6d  f( mx<mxRoot ) m
2890: 78 20 3d 20 6d 78 52 6f 6f 74 3b 0a 20 20 70 72  x = mxRoot;.  pr
28a0: 69 6e 74 66 28 22 4d 61 78 69 6d 75 6d 20 73 65  intf("Maximum se
28b0: 67 6d 65 6e 74 20 73 69 7a 65 2e 2e 2e 2e 2e 2e  gment size......
28c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20  ............... 
28d0: 25 39 6c 6c 64 5c 6e 22 2c 20 6d 78 29 3b 0a 20  %9lld\n", mx);. 
28e0: 20 70 72 69 6e 74 66 28 22 4d 61 78 69 6d 75 6d   printf("Maximum
28f0: 20 69 6e 64 65 78 20 73 65 67 6d 65 6e 74 20 73   index segment s
2900: 69 7a 65 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ize.............
2910: 2e 2e 20 25 39 6c 6c 64 5c 6e 22 2c 20 6d 78 49  .. %9lld\n", mxI
2920: 64 78 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 4d  dx);.  printf("M
2930: 61 78 69 6d 75 6d 20 72 6f 6f 74 20 73 65 67 6d  aximum root segm
2940: 65 6e 74 20 73 69 7a 65 2e 2e 2e 2e 2e 2e 2e 2e  ent size........
2950: 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 6c 6c 64 5c 6e  ........ %9lld\n
2960: 22 2c 20 6d 78 52 6f 6f 74 29 3b 0a 0a 20 20 70  ", mxRoot);..  p
2970: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64  Stmt = prepare(d
2980: 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f  b, "PRAGMA page_
2990: 73 69 7a 65 22 29 3b 0a 20 20 70 67 73 7a 20 3d  size");.  pgsz =
29a0: 20 31 30 32 34 3b 0a 20 20 77 68 69 6c 65 28 20   1024;.  while( 
29b0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
29c0: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
29d0: 29 7b 0a 20 20 20 20 70 67 73 7a 20 3d 20 73 71  ){.    pgsz = sq
29e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
29f0: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
2a00: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2a10: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 70 72 69  ze(pStmt);.  pri
2a20: 6e 74 66 28 22 44 61 74 61 62 61 73 65 20 70 61  ntf("Database pa
2a30: 67 65 20 73 69 7a 65 2e 2e 2e 2e 2e 2e 2e 2e 2e  ge size.........
2a40: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25  .............. %
2a50: 39 64 5c 6e 22 2c 20 70 67 73 7a 29 3b 0a 20 20  9d\n", pgsz);.  
2a60: 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28  pStmt = prepare(
2a70: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2a80: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
2a90: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ".            " 
2aa0: 20 46 52 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e   FROM '%q_segmen
2ab0: 74 73 27 20 61 20 4a 4f 49 4e 20 27 25 71 5f 73  ts' a JOIN '%q_s
2ac0: 65 67 64 69 72 27 20 62 22 0a 20 20 20 20 20 20  egdir' b".      
2ad0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 61 2e        " WHERE a.
2ae0: 62 6c 6f 63 6b 69 64 20 42 45 54 57 45 45 4e 20  blockid BETWEEN 
2af0: 62 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 41 4e  b.start_block AN
2b00: 44 20 62 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62  D b.leaves_end_b
2b10: 6c 6f 63 6b 22 0a 20 20 20 20 20 20 20 20 20 20  lock".          
2b20: 20 20 22 20 20 20 41 4e 44 20 6c 65 6e 67 74 68    "   AND length
2b30: 28 61 2e 62 6c 6f 63 6b 29 3e 25 64 22 2c 0a 20  (a.block)>%d",. 
2b40: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c             zTab,
2b50: 20 7a 54 61 62 2c 20 70 67 73 7a 2d 34 35 29 3b   zTab, pgsz-45);
2b60: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  n = 0;.  whil
2b70: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
2b80: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
2b90: 4f 57 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 71  OW ){.    n = sq
2ba0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2bb0: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
2bc0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2bd0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 6e 4c 65  ze(pStmt);.  nLe
2be0: 61 66 20 3d 20 6e 53 65 67 20 2d 20 6e 49 64 78  af = nSeg - nIdx
2bf0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 4c 65 61 66  ;.  printf("Leaf
2c00: 20 73 65 67 6d 65 6e 74 73 20 6c 61 72 67 65 72   segments larger
2c10: 20 74 68 61 6e 20 25 35 64 20 62 79 74 65 73 2e   than %5d bytes.
2c20: 2e 2e 2e 20 25 39 64 20 20 20 25 35 2e 32 66 25  ... %9d   %5.2f%
2c30: 25 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  %\n",.         p
2c40: 67 73 7a 2d 34 35 2c 20 6e 2c 20 6e 4c 65 61 66  gsz-45, n, nLeaf
2c50: 3e 30 20 3f 20 6e 2a 31 30 30 2e 30 2f 6e 4c 65  >0 ? n*100.0/nLe
2c60: 61 66 20 3a 20 30 2e 30 29 3b 0a 0a 20 20 70 53  af : 0.0);..  pS
2c70: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62  tmt = prepare(db
2c80: 2c 20 22 53 45 4c 45 43 54 20 6d 61 78 28 6c 65  , "SELECT max(le
2c90: 76 65 6c 25 25 31 30 32 34 29 20 46 52 4f 4d 20  vel%%1024) FROM 
2ca0: 27 25 71 5f 73 65 67 64 69 72 27 22 2c 20 7a 54  '%q_segdir'", zT
2cb0: 61 62 29 3b 0a 20 20 6d 78 4c 65 76 65 6c 20 3d  ab);.  mxLevel =
2cc0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
2cd0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2ce0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2cf0: 20 20 20 20 6d 78 4c 65 76 65 6c 20 3d 20 73 71      mxLevel = sq
2d00: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2d10: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
2d20: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2d30: 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 20 20 66 6f  ze(pStmt);..  fo
2d40: 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 4c 65 76 65  r(i=0; i<=mxLeve
2d50: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 74  l; i++){.    pSt
2d60: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
2d70: 0a 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  .           "SEL
2d80: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 73 75  ECT count(*), su
2d90: 6d 28 6c 65 6e 29 2c 20 61 76 67 28 6c 65 6e 29  m(len), avg(len)
2da0: 2c 20 6d 61 78 28 6c 65 6e 29 2c 20 73 75 6d 28  , max(len), sum(
2db0: 6c 65 6e 3e 25 64 29 2c 22 0a 20 20 20 20 20 20  len>%d),".      
2dc0: 20 20 20 20 20 22 20 20 20 20 20 20 20 63 6f 75       "       cou
2dd0: 6e 74 28 64 69 73 74 69 6e 63 74 20 69 64 78 29  nt(distinct idx)
2de0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 20  ".           "  
2df0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6c 65 6e  FROM (SELECT len
2e00: 67 74 68 28 61 2e 62 6c 6f 63 6b 29 20 41 53 20  gth(a.block) AS 
2e10: 6c 65 6e 2c 20 69 64 78 22 0a 20 20 20 20 20 20  len, idx".      
2e20: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20       "          
2e30: 46 52 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e 74  FROM '%q_segment
2e40: 73 27 20 61 20 4a 4f 49 4e 20 27 25 71 5f 73 65  s' a JOIN '%q_se
2e50: 67 64 69 72 27 20 62 22 0a 20 20 20 20 20 20 20  gdir' b".       
2e60: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 57 48      "         WH
2e70: 45 52 45 20 28 61 2e 62 6c 6f 63 6b 69 64 20 42  ERE (a.blockid B
2e80: 45 54 57 45 45 4e 20 62 2e 73 74 61 72 74 5f 62  ETWEEN b.start_b
2e90: 6c 6f 63 6b 22 0a 20 20 20 20 20 20 20 20 20 20  lock".          
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41               " A
2ec0: 4e 44 20 62 2e 6c 65 61 76 65 73 5f 65 6e 64 5f  ND b.leaves_end_
2ed0: 62 6c 6f 63 6b 29 22 0a 20 20 20 20 20 20 20 20  block)".        
2ee0: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 41     "           A
2ef0: 4e 44 20 28 62 2e 6c 65 76 65 6c 25 25 31 30 32  ND (b.level%%102
2f00: 34 29 3d 3d 25 64 29 22 2c 0a 20 20 20 20 20 20  4)==%d)",.      
2f10: 20 20 20 20 20 70 67 73 7a 2d 34 35 2c 20 7a 54       pgsz-45, zT
2f20: 61 62 2c 20 7a 54 61 62 2c 20 69 29 3b 0a 20 20  ab, zTab, i);.  
2f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2f40: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2f50: 45 5f 52 4f 57 0a 20 20 20 20 20 26 26 20 28 6e  E_ROW.     && (n
2f60: 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63  Leaf = sqlite3_c
2f70: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2f80: 20 30 29 29 3e 30 0a 20 20 20 20 29 7b 0a 20 20   0))>0.    ){.  
2f90: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2fa0: 34 20 73 7a 3b 0a 20 20 20 20 20 20 6e 49 64 78  4 sz;.      nIdx
2fb0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2fc0: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 3b  n_int(pStmt, 5);
2fd0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 46  .      printf("F
2fe0: 6f 72 20 6c 65 76 65 6c 20 25 64 3a 5c 6e 22 2c  or level %d:\n",
2ff0: 20 69 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74   i);.      print
3000: 66 28 22 20 20 4e 75 6d 62 65 72 20 6f 66 20 69  f("  Number of i
3010: 6e 64 65 78 65 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ndexes..........
3020: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 64  ............ %9d
3030: 5c 6e 22 2c 20 6e 49 64 78 29 3b 0a 20 20 20 20  \n", nIdx);.    
3040: 20 20 70 72 69 6e 74 66 28 22 20 20 4e 75 6d 62    printf("  Numb
3050: 65 72 20 6f 66 20 6c 65 61 66 20 73 65 67 6d 65  er of leaf segme
3060: 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  nts.............
3070: 2e 2e 2e 20 25 39 64 5c 6e 22 2c 20 6e 4c 65 61  ... %9d\n", nLea
3080: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 49  f);.      if( nI
3090: 64 78 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  dx>1 ){.        
30a0: 70 72 69 6e 74 66 28 22 20 20 41 76 65 72 61 67  printf("  Averag
30b0: 65 20 6c 65 61 66 20 73 65 67 6d 65 6e 74 73 20  e leaf segments 
30c0: 70 65 72 20 69 6e 64 65 78 2e 2e 2e 2e 2e 2e 2e  per index.......
30d0: 2e 20 25 31 31 2e 31 66 5c 6e 22 2c 0a 20 20 20  . %11.1f\n",.   
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 64 6f 75              (dou
30f0: 62 6c 65 29 6e 4c 65 61 66 2f 28 64 6f 75 62 6c  ble)nLeaf/(doubl
3100: 65 29 6e 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  e)nIdx);.      }
3110: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
3120: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61   Total size of a
3130: 6c 6c 20 6c 65 61 66 20 73 65 67 6d 65 6e 74 73  ll leaf segments
3140: 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 6c 6c 64 5c 6e  ........ %9lld\n
3150: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
3160: 28 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  (sz = sqlite3_co
3170: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
3180: 2c 20 31 29 29 29 3b 0a 20 20 20 20 20 20 70 72  , 1)));.      pr
3190: 69 6e 74 66 28 22 20 20 41 76 65 72 61 67 65 20  intf("  Average 
31a0: 73 69 7a 65 20 6f 66 20 6c 65 61 66 20 73 65 67  size of leaf seg
31b0: 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20  ments.......... 
31c0: 25 31 31 2e 31 66 5c 6e 22 2c 0a 20 20 20 20 20  %11.1f\n",.     
31d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31e0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
31f0: 74 6d 74 2c 20 32 29 29 3b 0a 20 20 20 20 20 20  tmt, 2));.      
3200: 69 66 28 20 6e 49 64 78 3e 31 20 29 7b 0a 20 20  if( nIdx>1 ){.  
3210: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20        printf("  
3220: 41 76 65 72 61 67 65 20 6c 65 61 66 20 73 65 67  Average leaf seg
3230: 6d 65 6e 74 20 73 69 7a 65 20 70 65 72 20 69 6e  ment size per in
3240: 64 65 78 2e 2e 2e 2e 20 25 31 31 2e 31 66 5c 6e  dex.... %11.1f\n
3250: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
3260: 20 20 28 64 6f 75 62 6c 65 29 73 7a 2f 28 64 6f    (double)sz/(do
3270: 75 62 6c 65 29 6e 49 64 78 29 3b 0a 20 20 20 20  uble)nIdx);.    
3280: 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
3290: 28 22 20 20 4d 61 78 69 6d 75 6d 20 6c 65 61 66  ("  Maximum leaf
32a0: 20 73 65 67 6d 65 6e 74 20 73 69 7a 65 2e 2e 2e   segment size...
32b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 6c 6c  ........... %9ll
32c0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
32d0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
32e0: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33  n_int64(pStmt, 3
32f0: 29 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  ));.      n = sq
3300: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
3310: 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20  (pStmt, 4);.    
3320: 20 20 70 72 69 6e 74 66 28 22 20 20 4c 65 61 66    printf("  Leaf
3330: 20 73 65 67 6d 65 6e 74 73 20 6c 61 72 67 65 72   segments larger
3340: 20 74 68 61 6e 20 25 35 64 20 62 79 74 65 73 2e   than %5d bytes.
3350: 2e 20 25 39 64 20 20 20 25 35 2e 32 66 25 25 5c  . %9d   %5.2f%%\
3360: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
3370: 20 70 67 73 7a 2d 34 35 2c 20 6e 2c 20 6e 2a 31   pgsz-45, n, n*1
3380: 30 30 2e 30 2f 6e 4c 65 61 66 29 3b 0a 20 20 20  00.0/nLeaf);.   
3390: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
33a0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
33b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69    }.}../*.** Pri
33c0: 6e 74 20 61 20 73 69 6e 67 6c 65 20 22 74 72 65  nt a single "tre
33d0: 65 22 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 73  e" line of the s
33e0: 65 67 64 69 72 20 6d 61 70 20 6f 75 74 70 75 74  egdir map output
33f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3400: 20 70 72 69 6e 74 54 72 65 65 4c 69 6e 65 28 73   printTreeLine(s
3410: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 6f  qlite3_int64 iLo
3420: 77 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  wer, sqlite3_int
3430: 36 34 20 69 55 70 70 65 72 29 7b 0a 20 20 70 72  64 iUpper){.  pr
3440: 69 6e 74 66 28 22 20 20 20 20 20 20 20 20 20 20  intf("          
3450: 20 20 20 20 20 20 20 74 72 65 65 20 20 20 25 39         tree   %9
3460: 6c 6c 64 22 2c 20 69 4c 6f 77 65 72 29 3b 0a 20  lld", iLower);. 
3470: 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77   if( iUpper>iLow
3480: 65 72 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  er ){.    printf
3490: 28 22 20 74 68 72 75 20 25 39 6c 6c 64 20 20 28  (" thru %9lld  (
34a0: 25 6c 6c 64 20 62 6c 6f 63 6b 73 29 22 2c 20 69  %lld blocks)", i
34b0: 55 70 70 65 72 2c 20 69 55 70 70 65 72 2d 69 4c  Upper, iUpper-iL
34c0: 6f 77 65 72 2b 31 29 3b 0a 20 20 7d 0a 20 20 70  ower+1);.  }.  p
34d0: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 7d 0a 0a  rintf("\n");.}..
34e0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
34f0: 65 65 20 69 66 20 74 68 65 20 62 6c 6f 63 6b 20  ee if the block 
3500: 6f 66 20 61 20 25 5f 73 65 67 6d 65 6e 74 73 20  of a %_segments 
3510: 65 6e 74 72 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  entry is NULL..*
3520: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
3530: 75 6c 6c 53 65 67 6d 65 6e 74 28 73 71 6c 69 74  ullSegment(sqlit
3540: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
3550: 61 72 20 2a 7a 54 61 62 2c 20 73 71 6c 69 74 65  ar *zTab, sqlite
3560: 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 49 64  3_int64 iBlockId
3570: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
3580: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
3590: 72 63 20 3d 20 31 3b 0a 0a 20 20 70 53 74 6d 74  rc = 1;..  pStmt
35a0: 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c 20 22   = prepare(db, "
35b0: 53 45 4c 45 43 54 20 62 6c 6f 63 6b 20 49 53 20  SELECT block IS 
35c0: 4e 55 4c 4c 20 46 52 4f 4d 20 27 25 71 5f 73 65  NULL FROM '%q_se
35d0: 67 6d 65 6e 74 73 27 22 0a 20 20 20 20 20 20 20  gments'".       
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
35f0: 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 3d 25   WHERE blockid=%
3600: 6c 6c 64 22 2c 20 7a 54 61 62 2c 20 69 42 6c 6f  lld", zTab, iBlo
3610: 63 6b 49 64 29 3b 0a 20 20 69 66 28 20 73 71 6c  ckId);.  if( sql
3620: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
3630: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
3640: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3650: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
3660: 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  t, 0);.  }.  sql
3670: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
3680: 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tmt);.  return r
3690: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77  c;.}../*.** Show
36a0: 20 61 20 6d 61 70 20 6f 66 20 73 65 67 6d 65 6e   a map of segmen
36b0: 74 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  ts derived from 
36c0: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
36d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
36e0: 69 64 20 73 68 6f 77 53 65 67 64 69 72 4d 61 70  id showSegdirMap
36f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
3700: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b  nst char *zTab){
3710: 0a 20 20 69 6e 74 20 6d 78 49 6e 64 65 78 2c 20  .  int mxIndex, 
3720: 69 49 6e 64 65 78 3b 0a 20 20 73 71 6c 69 74 65  iIndex;.  sqlite
3730: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
3740: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
3750: 74 20 2a 70 53 74 6d 74 32 20 3d 20 30 3b 0a 20  t *pStmt2 = 0;. 
3760: 20 69 6e 74 20 70 72 65 76 4c 65 76 65 6c 3b 0a   int prevLevel;.
3770: 0a 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61  .  pStmt = prepa
3780: 72 65 28 64 62 2c 20 22 53 45 4c 45 43 54 20 6d  re(db, "SELECT m
3790: 61 78 28 6c 65 76 65 6c 2f 31 30 32 34 29 20 46  ax(level/1024) F
37a0: 52 4f 4d 20 27 25 71 5f 73 65 67 64 69 72 27 22  ROM '%q_segdir'"
37b0: 2c 20 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 73  , zTab);.  if( s
37c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
37d0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
37e0: 7b 0a 20 20 20 20 6d 78 49 6e 64 65 78 20 3d 20  {.    mxIndex = 
37f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
3800: 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
3810: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 78 49 6e 64  }else{.    mxInd
3820: 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ex = 0;.  }.  sq
3830: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
3840: 53 74 6d 74 29 3b 0a 0a 20 20 70 72 69 6e 74 66  Stmt);..  printf
3850: 28 22 4e 75 6d 62 65 72 20 6f 66 20 69 6e 76 65  ("Number of inve
3860: 72 74 65 64 20 69 6e 64 69 63 65 73 2e 2e 2e 2e  rted indices....
3870: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20 25 33 64 5c  ........... %3d\
3880: 6e 22 2c 20 6d 78 49 6e 64 65 78 2b 31 29 3b 0a  n", mxIndex+1);.
3890: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72    pStmt = prepar
38a0: 65 28 64 62 2c 0a 20 20 20 20 22 53 45 4c 45 43  e(db,.    "SELEC
38b0: 54 20 6c 65 76 65 6c 2c 20 69 64 78 2c 20 73 74  T level, idx, st
38c0: 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65  art_block, leave
38d0: 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64  s_end_block, end
38e0: 5f 62 6c 6f 63 6b 2c 20 72 6f 77 69 64 22 0a 20  _block, rowid". 
38f0: 20 20 20 22 20 20 46 52 4f 4d 20 27 25 71 5f 73     "  FROM '%q_s
3900: 65 67 64 69 72 27 22 0a 20 20 20 20 22 20 57 48  egdir'".    " WH
3910: 45 52 45 20 6c 65 76 65 6c 2f 31 30 32 34 3d 3d  ERE level/1024==
3920: 3f 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42  ?".    " ORDER B
3930: 59 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64  Y level DESC, id
3940: 78 22 2c 0a 20 20 20 20 7a 54 61 62 29 3b 0a 20  x",.    zTab);. 
3950: 20 70 53 74 6d 74 32 20 3d 20 70 72 65 70 61 72   pStmt2 = prepar
3960: 65 28 64 62 2c 0a 20 20 20 20 22 53 45 4c 45 43  e(db,.    "SELEC
3970: 54 20 62 6c 6f 63 6b 69 64 20 46 52 4f 4d 20 27  T blockid FROM '
3980: 25 71 5f 73 65 67 6d 65 6e 74 73 27 22 0a 20 20  %q_segments'".  
3990: 20 20 22 20 57 48 45 52 45 20 62 6c 6f 63 6b 69    " WHERE blocki
39a0: 64 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  d BETWEEN ? AND 
39b0: 3f 20 4f 52 44 45 52 20 42 59 20 62 6c 6f 63 6b  ? ORDER BY block
39c0: 69 64 22 2c 0a 20 20 20 20 7a 54 61 62 29 3b 0a  id",.    zTab);.
39d0: 20 20 66 6f 72 28 69 49 6e 64 65 78 3d 30 3b 20    for(iIndex=0; 
39e0: 69 49 6e 64 65 78 3c 3d 6d 78 49 6e 64 65 78 3b  iIndex<=mxIndex;
39f0: 20 69 49 6e 64 65 78 2b 2b 29 7b 0a 20 20 20 20   iIndex++){.    
3a00: 69 66 28 20 6d 78 49 6e 64 65 78 3e 30 20 29 7b  if( mxIndex>0 ){
3a10: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 2a  .      printf("*
3a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 49 6e 64 65  *********** Inde
3a40: 78 20 25 64 20 22 0a 20 20 20 20 20 20 20 20 20  x %d ".         
3a50: 20 20 20 20 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a      "***********
3a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a70: 2a 5c 6e 22 2c 20 69 49 6e 64 65 78 29 3b 0a 20  *\n", iIndex);. 
3a80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3a90: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
3aa0: 20 31 2c 20 69 49 6e 64 65 78 29 3b 0a 20 20 20   1, iIndex);.   
3ab0: 20 70 72 65 76 4c 65 76 65 6c 20 3d 20 2d 31 3b   prevLevel = -1;
3ac0: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
3ad0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
3ae0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
3af0: 20 20 20 20 20 69 6e 74 20 69 4c 65 76 65 6c 20       int iLevel 
3b00: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
3b10: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 25 31  _int(pStmt, 0)%1
3b20: 30 32 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  024;.      int i
3b30: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Idx = sqlite3_co
3b40: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
3b50: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
3b60: 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 20 3d  3_int64 iStart =
3b70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3b80: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 29 3b  int64(pStmt, 2);
3b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
3ba0: 6e 74 36 34 20 69 4c 45 6e 64 20 3d 20 73 71 6c  nt64 iLEnd = sql
3bb0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
3bc0: 34 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  4(pStmt, 3);.   
3bd0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
3be0: 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f   iEnd = sqlite3_
3bf0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
3c00: 6d 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 68  mt, 4);.      ch
3c10: 61 72 20 72 74 61 67 5b 32 30 5d 3b 0a 20 20 20  ar rtag[20];.   
3c20: 20 20 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 70     if( iLevel!=p
3c30: 72 65 76 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  revLevel ){.    
3c40: 20 20 20 20 70 72 69 6e 74 66 28 22 6c 65 76 65      printf("leve
3c50: 6c 20 25 32 64 20 69 64 78 20 25 32 64 22 2c 20  l %2d idx %2d", 
3c60: 69 4c 65 76 65 6c 2c 20 69 49 64 78 29 3b 0a 20  iLevel, iIdx);. 
3c70: 20 20 20 20 20 20 20 70 72 65 76 4c 65 76 65 6c         prevLevel
3c80: 20 3d 20 69 4c 65 76 65 6c 3b 0a 20 20 20 20 20   = iLevel;.     
3c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3ca0: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20  printf("        
3cb0: 20 69 64 78 20 25 32 64 22 2c 20 69 49 64 78 29   idx %2d", iIdx)
3cc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3cd0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3ce0: 28 73 69 7a 65 6f 66 28 72 74 61 67 29 2c 20 72  (sizeof(rtag), r
3cf0: 74 61 67 2c 20 22 72 25 6c 6c 64 22 2c 0a 20 20  tag, "r%lld",.  
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
3d20: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
3d30: 35 29 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  5));.      print
3d40: 66 28 22 20 20 72 6f 6f 74 20 20 20 25 39 73 5c  f("  root   %9s\
3d50: 6e 22 2c 20 72 74 61 67 29 3b 0a 20 20 20 20 20  n", rtag);.     
3d60: 20 69 66 28 20 69 4c 45 6e 64 3e 69 53 74 61 72   if( iLEnd>iStar
3d70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
3d80: 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 6f 77 65  ite3_int64 iLowe
3d90: 72 2c 20 69 50 72 65 76 20 3d 20 30 2c 20 69 58  r, iPrev = 0, iX
3da0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  ;.        if( iL
3db0: 45 6e 64 2b 31 3c 3d 69 45 6e 64 20 29 7b 0a 20  End+1<=iEnd ){. 
3dc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3dd0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
3de0: 74 32 2c 20 31 2c 20 69 4c 45 6e 64 2b 31 29 3b  t2, 1, iLEnd+1);
3df0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3e00: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
3e10: 74 6d 74 32 2c 20 32 2c 20 69 45 6e 64 29 3b 0a  tmt2, 2, iEnd);.
3e20: 20 20 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72            iLower
3e30: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 0a 20   = -1;        . 
3e40: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
3e50: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
3e60: 6d 74 32 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  mt2)==SQLITE_ROW
3e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3e80: 69 58 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  iX = sqlite3_col
3e90: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 32  umn_int64(pStmt2
3ea0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
3eb0: 20 20 69 66 28 20 69 4c 6f 77 65 72 3c 30 20 29    if( iLower<0 )
3ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3ed0: 69 4c 6f 77 65 72 20 3d 20 69 50 72 65 76 20 3d  iLower = iPrev =
3ee0: 20 69 58 3b 0a 20 20 20 20 20 20 20 20 20 20 20   iX;.           
3ef0: 20 7d 65 6c 73 65 20 69 66 28 20 69 58 3d 3d 69   }else if( iX==i
3f00: 50 72 65 76 2b 31 20 29 7b 0a 20 20 20 20 20 20  Prev+1 ){.      
3f10: 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20          iPrev = 
3f20: 69 58 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  iX;.            
3f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3f40: 20 20 20 20 20 70 72 69 6e 74 54 72 65 65 4c 69       printTreeLi
3f50: 6e 65 28 69 4c 6f 77 65 72 2c 20 69 50 72 65 76  ne(iLower, iPrev
3f60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3f70: 20 69 4c 6f 77 65 72 20 3d 20 69 50 72 65 76 20   iLower = iPrev 
3f80: 3d 20 69 58 3b 0a 20 20 20 20 20 20 20 20 20 20  = iX;.          
3f90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
3fa0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3fb0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 32 29 3b  3_reset(pStmt2);
3fc0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
3fd0: 4c 6f 77 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20  Lower>=0 ){.    
3fe0: 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 6f 77          if( iLow
3ff0: 65 72 3d 3d 69 50 72 65 76 20 26 26 20 69 4c 6f  er==iPrev && iLo
4000: 77 65 72 3d 3d 69 45 6e 64 0a 20 20 20 20 20 20  wer==iEnd.      
4010: 20 20 20 20 20 20 20 26 26 20 69 73 4e 75 6c 6c         && isNull
4020: 53 65 67 6d 65 6e 74 28 64 62 2c 7a 54 61 62 2c  Segment(db,zTab,
4030: 69 4c 6f 77 65 72 29 0a 20 20 20 20 20 20 20 20  iLower).        
4040: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
4050: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20       printf("   
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
4070: 6c 6c 20 20 20 25 39 6c 6c 64 5c 6e 22 2c 20 69  ll   %9lld\n", i
4080: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
4090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
40a0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 54 72           printTr
40b0: 65 65 4c 69 6e 65 28 69 4c 6f 77 65 72 2c 20 69  eeLine(iLower, i
40c0: 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20  Prev);.         
40d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
40e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
40f0: 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20     printf("     
4100: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 61 76              leav
4110: 65 73 20 25 39 6c 6c 64 20 74 68 72 75 20 25 39  es %9lld thru %9
4120: 6c 6c 64 20 20 28 25 6c 6c 64 20 62 6c 6f 63 6b  lld  (%lld block
4130: 73 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s)\n",.         
4140: 20 20 20 20 20 20 69 53 74 61 72 74 2c 20 69 4c        iStart, iL
4150: 45 6e 64 2c 20 69 4c 45 6e 64 20 2d 20 69 53 74  End, iLEnd - iSt
4160: 61 72 74 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  art + 1);.      
4170: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4180: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
4190: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
41a0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
41b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
41c0: 69 7a 65 28 70 53 74 6d 74 32 29 3b 0a 7d 0a 0a  ize(pStmt2);.}..
41d0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73  /*.** Decode a s
41e0: 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 6c  ingle segment bl
41f0: 6f 63 6b 20 61 6e 64 20 64 69 73 70 6c 61 79 20  ock and display 
4200: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e 20 73  the results on s
4210: 74 64 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tdout..*/.static
4220: 20 76 6f 69 64 20 64 65 63 6f 64 65 53 65 67 6d   void decodeSegm
4230: 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ent(.  const uns
4240: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
4250: 61 2c 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20  a,   /* Content 
4260: 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e  to print */.  in
4270: 74 20 6e 44 61 74 61 20 20 20 20 20 20 20 20 20  t nData         
4280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4290: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
42a0: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a  f content */.){.
42b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
42c0: 69 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 73 71  iChild = 0;.  sq
42d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65  lite3_int64 iPre
42e0: 66 69 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  fix;.  sqlite3_i
42f0: 6e 74 36 34 20 6e 54 65 72 6d 3b 0a 20 20 73 71  nt64 nTerm;.  sq
4300: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 20  lite3_int64 n;. 
4310: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
4320: 44 6f 63 73 7a 3b 0a 20 20 69 6e 74 20 69 48 65  Docsz;.  int iHe
4330: 69 67 68 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ight;.  sqlite3_
4340: 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 69  int64 i = 0;.  i
4350: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 68  nt cnt = 0;.  ch
4360: 61 72 20 7a 54 65 72 6d 5b 31 30 30 30 5d 3b 0a  ar zTerm[1000];.
4370: 0a 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e  .  i += getVarin
4380: 74 28 61 44 61 74 61 2c 20 26 6e 29 3b 0a 20 20  t(aData, &n);.  
4390: 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 6e  iHeight = (int)n
43a0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 68 65 69 67  ;.  printf("heig
43b0: 68 74 3a 20 25 64 5c 6e 22 2c 20 69 48 65 69 67  ht: %d\n", iHeig
43c0: 68 74 29 3b 0a 20 20 69 66 28 20 69 48 65 69 67  ht);.  if( iHeig
43d0: 68 74 3e 30 20 29 7b 0a 20 20 20 20 69 20 2b 3d  ht>0 ){.    i +=
43e0: 20 67 65 74 56 61 72 69 6e 74 28 61 44 61 74 61   getVarint(aData
43f0: 2b 69 2c 20 26 69 43 68 69 6c 64 29 3b 0a 20 20  +i, &iChild);.  
4400: 20 20 70 72 69 6e 74 66 28 22 6c 65 66 74 2d 63    printf("left-c
4410: 68 69 6c 64 3a 20 25 6c 6c 64 5c 6e 22 2c 20 69  hild: %lld\n", i
4420: 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 20 20 77 68  Child);.  }.  wh
4430: 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a  ile( i<nData ){.
4440: 20 20 20 20 69 66 28 20 28 63 6e 74 2b 2b 29 3e      if( (cnt++)>
4450: 30 20 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20  0 ){.      i += 
4460: 67 65 74 56 61 72 69 6e 74 28 61 44 61 74 61 2b  getVarint(aData+
4470: 69 2c 20 26 69 50 72 65 66 69 78 29 3b 0a 20 20  i, &iPrefix);.  
4480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4490: 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20  Prefix = 0;.    
44a0: 7d 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61  }.    i += getVa
44b0: 72 69 6e 74 28 61 44 61 74 61 2b 69 2c 20 26 6e  rint(aData+i, &n
44c0: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 69  Term);.    if( i
44d0: 50 72 65 66 69 78 2b 6e 54 65 72 6d 2b 31 20 3e  Prefix+nTerm+1 >
44e0: 3d 20 73 69 7a 65 6f 66 28 7a 54 65 72 6d 29 20  = sizeof(zTerm) 
44f0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4500: 28 73 74 64 65 72 72 2c 20 22 74 65 72 6d 20 74  (stderr, "term t
4510: 6f 20 6c 6f 6e 67 5c 6e 22 29 3b 0a 20 20 20 20  o long\n");.    
4520: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
4530: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 65 72  .    memcpy(zTer
4540: 6d 2b 69 50 72 65 66 69 78 2c 20 61 44 61 74 61  m+iPrefix, aData
4550: 2b 69 2c 20 28 73 69 7a 65 5f 74 29 6e 54 65 72  +i, (size_t)nTer
4560: 6d 29 3b 0a 20 20 20 20 7a 54 65 72 6d 5b 69 50  m);.    zTerm[iP
4570: 72 65 66 69 78 2b 6e 54 65 72 6d 5d 20 3d 20 30  refix+nTerm] = 0
4580: 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 54 65 72 6d  ;.    i += nTerm
4590: 3b 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68  ;.    if( iHeigh
45a0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 20  t==0 ){.      i 
45b0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 44 61  += getVarint(aDa
45c0: 74 61 2b 69 2c 20 26 69 44 6f 63 73 7a 29 3b 0a  ta+i, &iDocsz);.
45d0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 74 65        printf("te
45e0: 72 6d 3a 20 25 2d 32 35 73 20 64 6f 63 6c 69 73  rm: %-25s doclis
45f0: 74 20 25 37 6c 6c 64 20 62 79 74 65 73 20 6f 66  t %7lld bytes of
4600: 66 73 65 74 20 25 6c 6c 64 5c 6e 22 2c 20 7a 54  fset %lld\n", zT
4610: 65 72 6d 2c 20 69 44 6f 63 73 7a 2c 20 69 29 3b  erm, iDocsz, i);
4620: 0a 20 20 20 20 20 20 69 20 2b 3d 20 69 44 6f 63  .      i += iDoc
4630: 73 7a 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sz;.    }else{. 
4640: 20 20 20 20 20 70 72 69 6e 74 66 28 22 74 65 72       printf("ter
4650: 6d 3a 20 25 2d 32 35 73 20 63 68 69 6c 64 20 25  m: %-25s child %
4660: 6c 6c 64 5c 6e 22 2c 20 7a 54 65 72 6d 2c 20 2b  lld\n", zTerm, +
4670: 2b 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a  +iChild);.    }.
4680: 20 20 7d 0a 7d 0a 20 20 0a 20 20 0a 2f 2a 0a 2a    }.}.  .  ./*.*
4690: 2a 20 50 72 69 6e 74 20 61 20 61 20 62 6c 6f 62  * Print a a blob
46a0: 20 61 73 20 68 65 78 20 61 6e 64 20 61 73 63 69   as hex and asci
46b0: 69 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  i..*/.static voi
46c0: 64 20 70 72 69 6e 74 42 6c 6f 62 28 0a 20 20 63  d printBlob(.  c
46d0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
46e0: 61 72 20 2a 61 44 61 74 61 2c 20 20 20 2f 2a 20  ar *aData,   /* 
46f0: 43 6f 6e 74 65 6e 74 20 74 6f 20 70 72 69 6e 74  Content to print
4700: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 20   */.  int nData 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4730: 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   bytes of conten
4740: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  t */.){.  int i,
4750: 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
4760: 20 2a 7a 4f 66 73 74 46 6d 74 3b 0a 20 20 63 6f   *zOfstFmt;.  co
4770: 6e 73 74 20 69 6e 74 20 70 65 72 4c 69 6e 65 20  nst int perLine 
4780: 3d 20 31 36 3b 0a 0a 20 20 69 66 28 20 28 6e 44  = 16;..  if( (nD
4790: 61 74 61 26 7e 30 78 66 66 66 29 3d 3d 30 20 29  ata&~0xfff)==0 )
47a0: 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d  {.    zOfstFmt =
47b0: 20 22 20 25 30 33 78 3a 20 22 3b 0a 20 20 7d 65   " %03x: ";.  }e
47c0: 6c 73 65 20 69 66 28 20 28 6e 44 61 74 61 26 7e  lse if( (nData&~
47d0: 30 78 66 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20  0xffff)==0 ){.  
47e0: 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25    zOfstFmt = " %
47f0: 30 34 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20  04x: ";.  }else 
4800: 69 66 28 20 28 6e 44 61 74 61 26 7e 30 78 66 66  if( (nData&~0xff
4810: 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  fff)==0 ){.    z
4820: 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 35 78  OfstFmt = " %05x
4830: 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  : ";.  }else if(
4840: 20 28 6e 44 61 74 61 26 7e 30 78 66 66 66 66 66   (nData&~0xfffff
4850: 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66  f)==0 ){.    zOf
4860: 73 74 46 6d 74 20 3d 20 22 20 25 30 36 78 3a 20  stFmt = " %06x: 
4870: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
4880: 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25 30 38  zOfstFmt = " %08
4890: 78 3a 20 22 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  x: ";.  }..  for
48a0: 28 69 3d 30 3b 20 69 3c 6e 44 61 74 61 3b 20 69  (i=0; i<nData; i
48b0: 20 2b 3d 20 70 65 72 4c 69 6e 65 29 7b 0a 20 20   += perLine){.  
48c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
48d0: 2c 20 7a 4f 66 73 74 46 6d 74 2c 20 69 29 3b 0a  , zOfstFmt, i);.
48e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
48f0: 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20  erLine; j++){.  
4900: 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 44 61 74      if( i+j>nDat
4910: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  a ){.        fpr
4920: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 20 20  intf(stdout, "  
4930: 20 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   ");.      }else
4940: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
4950: 66 28 73 74 64 6f 75 74 2c 22 25 30 32 78 20 22  f(stdout,"%02x "
4960: 2c 20 61 44 61 74 61 5b 69 2b 6a 5d 29 3b 0a 20  , aData[i+j]);. 
4970: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4980: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 65 72 4c   for(j=0; j<perL
4990: 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ine; j++){.     
49a0: 20 69 66 28 20 69 2b 6a 3e 6e 44 61 74 61 20 29   if( i+j>nData )
49b0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
49c0: 66 28 73 74 64 6f 75 74 2c 20 22 20 22 29 3b 0a  f(stdout, " ");.
49d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
49e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
49f0: 6f 75 74 2c 22 25 63 22 2c 20 69 73 70 72 69 6e  out,"%c", isprin
4a00: 74 28 61 44 61 74 61 5b 69 2b 6a 5d 29 20 3f 20  t(aData[i+j]) ? 
4a10: 61 44 61 74 61 5b 69 2b 6a 5d 20 3a 20 27 2e 27  aData[i+j] : '.'
4a20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4a30: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
4a40: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  out,"\n");.  }.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
4a60: 74 65 78 74 20 74 6f 20 61 20 36 34 2d 62 69 74  text to a 64-bit
4a70: 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74   integer.*/.stat
4a80: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
4a90: 20 61 74 6f 69 36 34 28 63 6f 6e 73 74 20 63 68   atoi64(const ch
4aa0: 61 72 20 2a 7a 29 7b 0a 20 20 73 71 6c 69 74 65  ar *z){.  sqlite
4ab0: 33 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20  3_int64 v = 0;. 
4ac0: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3e 3d 27 30   while( z[0]>='0
4ad0: 27 20 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20 29  ' && z[0]<='9' )
4ae0: 7b 0a 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20  {.     v = v*10 
4af0: 2b 20 7a 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[0] - '0';.  
4b00: 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     z++;.  }.  re
4b10: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn v;.}../*.**
4b20: 20 52 65 74 75 72 6e 20 61 20 70 72 65 70 61 72   Return a prepar
4b30: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 68 69  ed statement whi
4b40: 63 68 2c 20 77 68 65 6e 20 73 74 65 70 70 65 64  ch, when stepped
4b50: 2c 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6e  , will return in
4b60: 20 69 74 73 0a 2a 2a 20 66 69 72 73 74 20 63 6f   its.** first co
4b70: 6c 75 6d 6e 20 74 68 65 20 62 6c 6f 62 20 61 73  lumn the blob as
4b80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65  sociated with se
4b90: 67 6d 65 6e 74 20 7a 49 64 2e 20 20 49 66 20 7a  gment zId.  If z
4ba0: 49 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a 2a  Id begins with.*
4bb0: 2a 20 27 72 27 20 74 68 65 6e 20 69 74 20 69 73  * 'r' then it is
4bc0: 20 61 20 72 6f 77 69 64 20 6f 66 20 61 20 25 5f   a rowid of a %_
4bd0: 73 65 67 64 69 72 20 65 6e 74 72 79 2e 20 20 4f  segdir entry.  O
4be0: 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20 61  therwise it is a
4bf0: 0a 2a 2a 20 25 5f 73 65 67 6d 65 6e 74 20 65 6e  .** %_segment en
4c00: 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  try..*/.static s
4c10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 72 65  qlite3_stmt *pre
4c20: 70 61 72 65 54 6f 47 65 74 53 65 67 6d 65 6e 74  pareToGetSegment
4c30: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
4c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
4c60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20  nst char *zTab, 
4c70: 20 20 20 2f 2a 20 54 68 65 20 46 54 53 33 2f 34     /* The FTS3/4
4c80: 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
4c90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
4ca0: 20 20 20 20 20 20 2f 2a 20 49 44 20 6f 66 20 74        /* ID of t
4cb0: 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20 6f 70  he segment to op
4cc0: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  en */.){.  sqlit
4cd0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
4ce0: 20 20 69 66 28 20 7a 49 64 5b 30 5d 3d 3d 27 72    if( zId[0]=='r
4cf0: 27 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d  ' ){.    pStmt =
4d00: 20 70 72 65 70 61 72 65 28 64 62 2c 20 22 53 45   prepare(db, "SE
4d10: 4c 45 43 54 20 72 6f 6f 74 20 46 52 4f 4d 20 27  LECT root FROM '
4d20: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
4d30: 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 0a 20 20   rowid=%lld",.  
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 20 7a 54 61 62 2c 20 61 74 6f 69 36 34 28 7a    zTab, atoi64(z
4d60: 49 64 2b 31 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Id+1));.  }else{
4d70: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65  .    pStmt = pre
4d80: 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45 43 54  pare(db, "SELECT
4d90: 20 62 6c 6f 63 6b 20 46 52 4f 4d 20 27 25 71 5f   block FROM '%q_
4da0: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20  segments' WHERE 
4db0: 62 6c 6f 63 6b 69 64 3d 25 6c 6c 64 22 2c 0a 20  blockid=%lld",. 
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 7a 54 61 62 2c 20 61 74 6f 69 36 34 28     zTab, atoi64(
4de0: 7a 49 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zId));.  }.  ret
4df0: 75 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn pStmt;.}../*
4e00: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f  .** Print the co
4e10: 6e 74 65 6e 74 20 6f 66 20 61 20 73 65 67 6d 65  ntent of a segme
4e20: 6e 74 20 6f 72 20 6f 66 20 74 68 65 20 72 6f 6f  nt or of the roo
4e30: 74 20 6f 66 20 61 20 73 65 67 64 69 72 2e 20 20  t of a segdir.  
4e40: 54 68 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f  The segment.** o
4e50: 72 20 72 6f 6f 74 20 69 73 20 69 64 65 6e 74 69  r root is identi
4e60: 66 69 65 64 20 62 79 20 61 7a 45 78 74 72 61 5b  fied by azExtra[
4e70: 30 5d 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  0].  If the firs
4e80: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61  t character of a
4e90: 7a 45 78 74 72 61 5b 30 5d 0a 2a 2a 20 69 73 20  zExtra[0].** is 
4ea0: 27 72 27 20 74 68 65 6e 20 74 68 65 20 72 65 6d  'r' then the rem
4eb0: 61 69 6e 64 65 72 20 69 73 20 74 68 65 20 69 6e  ainder is the in
4ec0: 74 65 67 65 72 20 72 6f 77 69 64 20 6f 66 20 74  teger rowid of t
4ed0: 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  he %_segdir entr
4ee0: 79 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 72  y..** If the fir
4ef0: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
4f00: 61 7a 45 78 74 72 61 5b 30 5d 20 69 73 20 6e 6f  azExtra[0] is no
4f10: 74 20 27 72 27 20 74 68 65 6e 2c 20 74 68 65 6e  t 'r' then, then
4f20: 20 61 6c 6c 20 6f 66 0a 2a 2a 20 61 7a 45 78 74   all of.** azExt
4f30: 72 61 5b 30 5d 20 69 73 20 61 6e 20 69 6e 74 65  ra[0] is an inte
4f40: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
4f50: 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72 2e 0a 2a   block number..*
4f60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 2d 2d 72 61  *.** If the --ra
4f70: 77 20 6f 70 74 69 6f 6e 20 69 73 20 70 72 65 73  w option is pres
4f80: 65 6e 74 20 69 6e 20 61 7a 45 78 74 72 61 2c 20  ent in azExtra, 
4f90: 74 68 65 6e 20 61 20 68 65 78 20 64 75 6d 70 20  then a hex dump 
4fa0: 69 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20  is provided..** 
4fb0: 4f 74 68 65 72 77 69 73 65 20 61 20 64 65 63 6f  Otherwise a deco
4fc0: 64 69 6e 67 20 69 73 20 73 68 6f 77 6e 2e 0a 2a  ding is shown..*
4fd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
4fe0: 6f 77 53 65 67 6d 65 6e 74 28 73 71 6c 69 74 65  owSegment(sqlite
4ff0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
5000: 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 6f 6e 73  r *zTab){.  cons
5010: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5020: 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44  *aData;.  int nD
5030: 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ata;.  sqlite3_s
5040: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 70  tmt *pStmt;..  p
5050: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 54 6f  Stmt = prepareTo
5060: 47 65 74 53 65 67 6d 65 6e 74 28 64 62 2c 20 7a  GetSegment(db, z
5070: 54 61 62 2c 20 61 7a 45 78 74 72 61 5b 30 5d 29  Tab, azExtra[0])
5080: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
5090: 73 74 65 70 28 70 53 74 6d 74 29 21 3d 53 51 4c  step(pStmt)!=SQL
50a0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 73  ITE_ROW ){.    s
50b0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
50c0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75  pStmt);.    retu
50d0: 72 6e 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61 20  rn;.  }.  nData 
50e0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
50f0: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29  _bytes(pStmt, 0)
5100: 3b 0a 20 20 61 44 61 74 61 20 3d 20 73 71 6c 69  ;.  aData = sqli
5110: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
5120: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 70 72 69  pStmt, 0);.  pri
5130: 6e 74 66 28 22 53 65 67 6d 65 6e 74 20 25 73 20  ntf("Segment %s 
5140: 6f 66 20 73 69 7a 65 20 25 64 20 62 79 74 65 73  of size %d bytes
5150: 3a 5c 6e 22 2c 20 61 7a 45 78 74 72 61 5b 30 5d  :\n", azExtra[0]
5160: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 69 66 28 20  , nData);.  if( 
5170: 66 69 6e 64 4f 70 74 69 6f 6e 28 22 72 61 77 22  findOption("raw"
5180: 2c 20 30 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  , 0, 0)!=0 ){.  
5190: 20 20 70 72 69 6e 74 42 6c 6f 62 28 61 44 61 74    printBlob(aDat
51a0: 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c  a, nData);.  }el
51b0: 73 65 7b 0a 20 20 20 20 64 65 63 6f 64 65 53 65  se{.    decodeSe
51c0: 67 6d 65 6e 74 28 61 44 61 74 61 2c 20 6e 44 61  gment(aData, nDa
51d0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
51e0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
51f0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  t);.}../*.** Dec
5200: 6f 64 65 20 61 20 73 69 6e 67 6c 65 20 64 6f 63  ode a single doc
5210: 6c 69 73 74 20 61 6e 64 20 64 69 73 70 6c 61 79  list and display
5220: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e 20   the results on 
5230: 73 74 64 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  stdout..*/.stati
5240: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 44 6f 63  c void decodeDoc
5250: 6c 69 73 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  list(.  const un
5260: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
5270: 74 61 2c 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74  ta,   /* Content
5280: 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69   to print */.  i
5290: 6e 74 20 6e 44 61 74 61 20 20 20 20 20 20 20 20  nt nData        
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
52c0: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b  of content */.){
52d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
52e0: 20 69 50 72 65 76 44 6f 63 69 64 20 3d 20 30 3b   iPrevDocid = 0;
52f0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
5300: 20 69 44 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74   iDocid;.  sqlit
5310: 65 33 5f 69 6e 74 36 34 20 69 50 6f 73 3b 0a 20  e3_int64 iPos;. 
5320: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
5330: 50 72 65 76 50 6f 73 20 3d 20 30 3b 0a 20 20 73  PrevPos = 0;.  s
5340: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 6f  qlite3_int64 iCo
5350: 6c 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  l;.  int i = 0;.
5360: 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 44 61 74  .  while( i<nDat
5370: 61 20 29 7b 0a 20 20 20 20 69 20 2b 3d 20 67 65  a ){.    i += ge
5380: 74 56 61 72 69 6e 74 28 61 44 61 74 61 2b 69 2c  tVarint(aData+i,
5390: 20 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 70   &iDocid);.    p
53a0: 72 69 6e 74 66 28 22 64 6f 63 69 64 20 25 6c 6c  rintf("docid %ll
53b0: 64 20 63 6f 6c 30 22 2c 20 69 44 6f 63 69 64 2b  d col0", iDocid+
53c0: 69 50 72 65 76 44 6f 63 69 64 29 3b 0a 20 20 20  iPrevDocid);.   
53d0: 20 69 50 72 65 76 44 6f 63 69 64 20 2b 3d 20 69   iPrevDocid += i
53e0: 44 6f 63 69 64 3b 0a 20 20 20 20 69 50 72 65 76  Docid;.    iPrev
53f0: 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  Pos = 0;.    whi
5400: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
5410: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 44   += getVarint(aD
5420: 61 74 61 2b 69 2c 20 26 69 50 6f 73 29 3b 0a 20  ata+i, &iPos);. 
5430: 20 20 20 20 20 69 66 28 20 69 50 6f 73 3d 3d 31       if( iPos==1
5440: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d   ){.        i +=
5450: 20 67 65 74 56 61 72 69 6e 74 28 61 44 61 74 61   getVarint(aData
5460: 2b 69 2c 20 26 69 43 6f 6c 29 3b 0a 20 20 20 20  +i, &iCol);.    
5470: 20 20 20 20 70 72 69 6e 74 66 28 22 20 63 6f 6c      printf(" col
5480: 25 6c 6c 64 22 2c 20 69 43 6f 6c 29 3b 0a 20 20  %lld", iCol);.  
5490: 20 20 20 20 20 20 69 50 72 65 76 50 6f 73 20 3d        iPrevPos =
54a0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
54b0: 69 66 28 20 69 50 6f 73 3d 3d 30 20 29 7b 0a 20  if( iPos==0 ){. 
54c0: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c         printf("\
54d0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  n");.        bre
54e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
54f0: 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 50 6f  .        iPrevPo
5500: 73 20 2b 3d 20 69 50 6f 73 20 2d 20 32 3b 0a 20  s += iPos - 2;. 
5510: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20         printf(" 
5520: 25 6c 6c 64 22 2c 20 69 50 72 65 76 50 6f 73 29  %lld", iPrevPos)
5530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5540: 20 20 7d 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20    }.}.  ../*.** 
5550: 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  Print the conten
5560: 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20  t of a doclist. 
5570: 20 54 68 65 20 73 65 67 6d 65 6e 74 20 6f 72 20   The segment or 
5580: 73 65 67 64 69 72 2d 72 6f 6f 74 20 69 73 0a 2a  segdir-root is.*
5590: 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  * identified by 
55a0: 61 7a 45 78 74 72 61 5b 30 5d 2e 20 20 49 66 20  azExtra[0].  If 
55b0: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
55c0: 74 65 72 20 6f 66 20 61 7a 45 78 74 72 61 5b 30  ter of azExtra[0
55d0: 5d 0a 2a 2a 20 69 73 20 27 72 27 20 74 68 65 6e  ].** is 'r' then
55e0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69   the remainder i
55f0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f  s the integer ro
5600: 77 69 64 20 6f 66 20 74 68 65 20 25 5f 73 65 67  wid of the %_seg
5610: 64 69 72 20 65 6e 74 72 79 2e 0a 2a 2a 20 49 66  dir entry..** If
5620: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
5630: 63 74 65 72 20 6f 66 20 61 7a 45 78 74 72 61 5b  cter of azExtra[
5640: 30 5d 20 69 73 20 6e 6f 74 20 27 72 27 20 74 68  0] is not 'r' th
5650: 65 6e 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 66 0a  en, then all of.
5660: 2a 2a 20 61 7a 45 78 74 72 61 5b 30 5d 20 69 73  ** azExtra[0] is
5670: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
5680: 68 20 69 73 20 74 68 65 20 62 6c 6f 63 6b 20 6e  h is the block n
5690: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 66 66 73  umber.  The offs
56a0: 65 74 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  et.** into the s
56b0: 65 67 6d 65 6e 74 20 69 73 20 69 64 65 6e 74 69  egment is identi
56c0: 66 69 65 64 20 62 79 20 61 7a 45 78 74 72 61 5b  fied by azExtra[
56d0: 31 5d 2e 20 20 54 68 65 20 73 69 7a 65 20 6f 66  1].  The size of
56e0: 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   the doclist.** 
56f0: 69 73 20 61 7a 45 78 74 72 61 5b 32 5d 2e 0a 2a  is azExtra[2]..*
5700: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 2d 2d 72 61  *.** If the --ra
5710: 77 20 6f 70 74 69 6f 6e 20 69 73 20 70 72 65 73  w option is pres
5720: 65 6e 74 20 69 6e 20 61 7a 45 78 74 72 61 2c 20  ent in azExtra, 
5730: 74 68 65 6e 20 61 20 68 65 78 20 64 75 6d 70 20  then a hex dump 
5740: 69 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20  is provided..** 
5750: 4f 74 68 65 72 77 69 73 65 20 61 20 64 65 63 6f  Otherwise a deco
5760: 64 69 6e 67 20 69 73 20 73 68 6f 77 6e 2e 0a 2a  ding is shown..*
5770: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5780: 6f 77 44 6f 63 6c 69 73 74 28 73 71 6c 69 74 65  owDoclist(sqlite
5790: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
57a0: 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 6f 6e 73  r *zTab){.  cons
57b0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
57c0: 2a 61 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65  *aData;.  sqlite
57d0: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 3b 0a  3_int64 offset;.
57e0: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 73    int nData;.  s
57f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
5800: 6d 74 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  mt;..  offset = 
5810: 61 74 6f 69 36 34 28 61 7a 45 78 74 72 61 5b 31  atoi64(azExtra[1
5820: 5d 29 3b 0a 20 20 6e 44 61 74 61 20 3d 20 61 74  ]);.  nData = at
5830: 6f 69 28 61 7a 45 78 74 72 61 5b 32 5d 29 3b 0a  oi(azExtra[2]);.
5840: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72    pStmt = prepar
5850: 65 54 6f 47 65 74 53 65 67 6d 65 6e 74 28 64 62  eToGetSegment(db
5860: 2c 20 7a 54 61 62 2c 20 61 7a 45 78 74 72 61 5b  , zTab, azExtra[
5870: 30 5d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0]);.  if( sqlit
5880: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 21 3d  e3_step(pStmt)!=
5890: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
58a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
58b0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  ze(pStmt);.    r
58c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 44 61  eturn;.  }.  aDa
58d0: 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ta = sqlite3_col
58e0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
58f0: 30 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 44 6f  0);.  printf("Do
5900: 63 6c 69 73 74 20 61 74 20 25 73 20 6f 66 66 73  clist at %s offs
5910: 65 74 20 25 6c 6c 64 20 6f 66 20 73 69 7a 65 20  et %lld of size 
5920: 25 64 20 62 79 74 65 73 3a 5c 6e 22 2c 0a 20 20  %d bytes:\n",.  
5930: 20 20 20 20 20 20 20 61 7a 45 78 74 72 61 5b 30         azExtra[0
5940: 5d 2c 20 6f 66 66 73 65 74 2c 20 6e 44 61 74 61  ], offset, nData
5950: 29 3b 0a 20 20 69 66 28 20 66 69 6e 64 4f 70 74  );.  if( findOpt
5960: 69 6f 6e 28 22 72 61 77 22 2c 20 30 2c 20 30 29  ion("raw", 0, 0)
5970: 21 3d 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  !=0 ){.    print
5980: 42 6c 6f 62 28 61 44 61 74 61 2b 6f 66 66 73 65  Blob(aData+offse
5990: 74 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 65 6c  t, nData);.  }el
59a0: 73 65 7b 0a 20 20 20 20 64 65 63 6f 64 65 44 6f  se{.    decodeDo
59b0: 63 6c 69 73 74 28 61 44 61 74 61 2b 6f 66 66 73  clist(aData+offs
59c0: 65 74 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  et, nData);.  }.
59d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
59e0: 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a  ze(pStmt);.}../*
59f0: 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 74 6f 70  .** Show the top
5a00: 20 4e 20 6c 61 72 67 65 73 74 20 73 65 67 6d 65   N largest segme
5a10: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
5a20: 69 64 20 6c 69 73 74 42 69 67 53 65 67 6d 65 6e  id listBigSegmen
5a30: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ts(sqlite3 *db, 
5a40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
5a50: 29 7b 0a 20 20 69 6e 74 20 6e 54 6f 70 2c 20 69  ){.  int nTop, i
5a60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
5a70: 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74   *pStmt;.  sqlit
5a80: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73  e3_int64 sz;.  s
5a90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 64 3b  qlite3_int64 id;
5aa0: 0a 0a 20 20 6e 54 6f 70 20 3d 20 61 74 6f 69 28  ..  nTop = atoi(
5ab0: 66 69 6e 64 4f 70 74 69 6f 6e 28 22 74 6f 70 22  findOption("top"
5ac0: 2c 20 31 2c 20 22 32 35 22 29 29 3b 0a 20 20 70  , 1, "25"));.  p
5ad0: 72 69 6e 74 66 28 22 54 68 65 20 25 64 20 6c 61  rintf("The %d la
5ae0: 72 67 65 73 74 20 73 65 67 6d 65 6e 74 73 3a 5c  rgest segments:\
5af0: 6e 22 2c 20 6e 54 6f 70 29 3b 0a 20 20 70 53 74  n", nTop);.  pSt
5b00: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
5b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45  .            "SE
5b20: 4c 45 43 54 20 62 6c 6f 63 6b 69 64 2c 20 6c 65  LECT blockid, le
5b30: 6e 67 74 68 28 62 6c 6f 63 6b 29 20 41 53 20 6c  ngth(block) AS l
5b40: 65 6e 20 46 52 4f 4d 20 27 25 71 5f 73 65 67 6d  en FROM '%q_segm
5b50: 65 6e 74 73 27 22 0a 20 20 20 20 20 20 20 20 20  ents'".         
5b60: 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 32 20     " ORDER BY 2 
5b70: 44 45 53 43 2c 20 31 22 0a 20 20 20 20 20 20 20  DESC, 1".       
5b80: 20 20 20 20 20 22 20 4c 49 4d 49 54 20 25 64 22       " LIMIT %d"
5b90: 2c 20 7a 54 61 62 2c 20 6e 54 6f 70 29 3b 0a 20  , zTab, nTop);. 
5ba0: 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
5bb0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
5bc0: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
5bd0: 20 29 7b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   ){.    i++;.   
5be0: 20 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   id = sqlite3_co
5bf0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
5c00: 2c 20 30 29 3b 0a 20 20 20 20 73 7a 20 3d 20 73  , 0);.    sz = s
5c10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
5c20: 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  t64(pStmt, 1);. 
5c30: 20 20 20 70 72 69 6e 74 66 28 22 20 20 25 32 64     printf("  %2d
5c40: 2e 20 25 39 6c 6c 64 20 73 69 7a 65 20 25 6c 6c  . %9lld size %ll
5c50: 64 5c 6e 22 2c 20 69 2c 20 69 64 2c 20 73 7a 29  d\n", i, id, sz)
5c60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5c70: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
5c80: 0a 7d 0a 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  .}....static voi
5c90: 64 20 75 73 61 67 65 28 63 6f 6e 73 74 20 63 68  d usage(const ch
5ca0: 61 72 20 2a 61 72 67 76 30 29 7b 0a 20 20 66 70  ar *argv0){.  fp
5cb0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
5cc0: 73 61 67 65 3a 20 25 73 20 44 41 54 41 42 41 53  sage: %s DATABAS
5cd0: 45 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  E\n".           
5ce0: 20 20 20 20 20 20 20 22 20 20 20 6f 72 3a 20 25         "   or: %
5cf0: 73 20 44 41 54 41 42 41 53 45 20 46 54 53 33 54  s DATABASE FTS3T
5d00: 41 42 4c 45 20 41 52 47 53 2e 2e 2e 5c 6e 22 2c  ABLE ARGS...\n",
5d10: 20 61 72 67 76 30 2c 20 61 72 67 76 30 29 3b 0a   argv0, argv0);.
5d20: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
5d30: 2c 0a 20 20 20 20 22 41 52 47 53 3a 5c 6e 22 0a  ,.    "ARGS:\n".
5d40: 20 20 20 20 22 20 20 62 69 67 2d 73 65 67 6d 65      "  big-segme
5d50: 6e 74 73 20 5b 2d 2d 74 6f 70 20 4e 5d 20 20 20  nts [--top N]   
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 73 68 6f 77 20 74 68 65 20 6c 61 72 67 65 73   show the larges
5d80: 74 20 73 65 67 6d 65 6e 74 73 5c 6e 22 0a 20 20  t segments\n".  
5d90: 20 20 22 20 20 64 6f 63 6c 69 73 74 20 42 4c 4f    "  doclist BLO
5da0: 43 4b 49 44 20 4f 46 46 53 45 54 20 53 49 5a 45  CKID OFFSET SIZE
5db0: 20 5b 2d 2d 72 61 77 5d 20 20 20 20 20 20 20 44   [--raw]       D
5dc0: 65 63 6f 64 65 20 61 20 64 6f 63 6c 69 73 74 5c  ecode a doclist\
5dd0: 6e 22 0a 20 20 20 20 22 20 20 73 63 68 65 6d 61  n".    "  schema
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 46 54 53 20 74 61 62 6c 65 20 73 63      FTS table sc
5e10: 68 65 6d 61 5c 6e 22 0a 20 20 20 20 22 20 20 73  hema\n".    "  s
5e20: 65 67 64 69 72 20 20 20 20 20 20 20 20 20 20 20  egdir           
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 20 20 20 20 64 69 72 65 63 74 6f           directo
5e50: 72 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 5c 6e  ry of segments\n
5e60: 22 0a 20 20 20 20 22 20 20 73 65 67 6d 65 6e 74  ".    "  segment
5e70: 20 42 4c 4f 43 4b 49 44 20 5b 2d 2d 72 61 77 5d   BLOCKID [--raw]
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20     content of a 
5ea0: 73 65 67 6d 65 6e 74 5c 6e 22 0a 20 20 20 20 22  segment\n".    "
5eb0: 20 20 73 65 67 6d 65 6e 74 2d 73 74 61 74 73 20    segment-stats 
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 66 6f              info
5ee0: 20 6f 6e 20 73 65 67 6d 65 6e 74 20 73 69 7a 65   on segment size
5ef0: 73 5c 6e 22 0a 20 20 20 20 22 20 20 73 74 61 74  s\n".    "  stat
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 20 20 74 68 65 20 25 25 5f 73 74 61        the %%_sta
5f30: 74 20 74 61 62 6c 65 5c 6e 22 0a 20 20 20 20 22  t table\n".    "
5f40: 20 20 76 6f 63 61 62 75 6c 61 72 79 20 5b 2d 2d    vocabulary [--
5f50: 74 6f 70 20 4e 5d 20 20 20 20 20 20 20 20 20 20  top N]          
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 63 75              docu
5f70: 6d 65 6e 74 20 76 6f 63 61 62 75 6c 61 72 79 5c  ment vocabulary\
5f80: 6e 22 0a 20 20 29 3b 0a 20 20 65 78 69 74 28 31  n".  );.  exit(1
5f90: 29 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69  );.}..int main(i
5fa0: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
5fb0: 61 72 67 76 29 7b 0a 20 20 73 71 6c 69 74 65 33  argv){.  sqlite3
5fc0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
5fd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
5fe0: 61 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab;.  const char
5ff0: 20 2a 7a 43 6d 64 3b 0a 0a 20 20 69 66 28 20 61   *zCmd;..  if( a
6000: 72 67 63 3c 32 20 29 20 75 73 61 67 65 28 61 72  rgc<2 ) usage(ar
6010: 67 76 5b 30 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[0]);.  rc = s
6020: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 61 72 67 76  qlite3_open(argv
6030: 5b 31 5d 2c 20 26 64 62 29 3b 0a 20 20 69 66 28  [1], &db);.  if(
6040: 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69 6e   rc ){.    fprin
6050: 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
6060: 6f 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61  ot open %s\n", a
6070: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 65 78 69  rgv[1]);.    exi
6080: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  t(1);.  }.  if( 
6090: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 73  argc==2 ){.    s
60a0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
60b0: 6d 74 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20  mt;.    int cnt 
60c0: 3d 20 30 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  = 0;.    pStmt =
60d0: 20 70 72 65 70 61 72 65 28 64 62 2c 20 22 53 45   prepare(db, "SE
60e0: 4c 45 43 54 20 62 2e 73 71 6c 22 0a 20 20 20 20  LECT b.sql".    
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c 69      "  FROM sqli
6110: 74 65 5f 6d 61 73 74 65 72 20 61 2c 20 73 71 6c  te_master a, sql
6120: 69 74 65 5f 6d 61 73 74 65 72 20 62 22 0a 20 20  ite_master b".  
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 61 2e        " WHERE a.
6150: 6e 61 6d 65 20 47 4c 4f 42 20 27 2a 5f 73 65 67  name GLOB '*_seg
6160: 64 69 72 27 22 0a 20 20 20 20 20 20 20 20 20 20  dir'".          
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
6180: 20 20 41 4e 44 20 62 2e 6e 61 6d 65 3d 73 75 62    AND b.name=sub
6190: 73 74 72 28 61 2e 6e 61 6d 65 2c 31 2c 6c 65 6e  str(a.name,1,len
61a0: 67 74 68 28 61 2e 6e 61 6d 65 29 2d 37 29 22 0a  gth(a.name)-7)".
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
61d0: 42 59 20 31 22 29 3b 0a 20 20 20 20 77 68 69 6c  BY 1");.    whil
61e0: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
61f0: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
6200: 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  OW ){.      cnt+
6210: 2b 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  +;.      printf(
6220: 22 25 73 3b 5c 6e 22 2c 20 73 71 6c 69 74 65 33  "%s;\n", sqlite3
6230: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
6240: 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  mt, 0));.    }. 
6250: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
6260: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
6270: 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  if( cnt==0 ){.  
6280: 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2a 20 4e      printf("/* N
6290: 6f 20 46 54 53 33 2f 34 20 74 61 62 6c 65 73 20  o FTS3/4 tables 
62a0: 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62 61 73  found in databas
62b0: 65 20 25 73 20 2a 2f 5c 6e 22 2c 20 61 72 67 76  e %s */\n", argv
62c0: 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [1]);.    }.    
62d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
62e0: 69 66 28 20 61 72 67 63 3c 34 20 29 20 75 73 61  if( argc<4 ) usa
62f0: 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  ge(argv[0]);.  z
6300: 54 61 62 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Tab = argv[2];. 
6310: 20 7a 43 6d 64 20 3d 20 61 72 67 76 5b 33 5d 3b   zCmd = argv[3];
6320: 0a 20 20 6e 45 78 74 72 61 20 3d 20 61 72 67 63  .  nExtra = argc
6330: 2d 34 3b 0a 20 20 61 7a 45 78 74 72 61 20 3d 20  -4;.  azExtra = 
6340: 61 72 67 76 2b 34 3b 0a 20 20 69 66 28 20 73 74  argv+4;.  if( st
6350: 72 63 6d 70 28 7a 43 6d 64 2c 22 62 69 67 2d 73  rcmp(zCmd,"big-s
6360: 65 67 6d 65 6e 74 73 22 29 3d 3d 30 20 29 7b 0a  egments")==0 ){.
6370: 20 20 20 20 6c 69 73 74 42 69 67 53 65 67 6d 65      listBigSegme
6380: 6e 74 73 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20  nts(db, zTab);. 
6390: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
63a0: 70 28 7a 43 6d 64 2c 22 64 6f 63 6c 69 73 74 22  p(zCmd,"doclist"
63b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
63c0: 61 72 67 63 3c 37 20 29 20 75 73 61 67 65 28 61  argc<7 ) usage(a
63d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 68 6f  rgv[0]);.    sho
63e0: 77 44 6f 63 6c 69 73 74 28 64 62 2c 20 7a 54 61  wDoclist(db, zTa
63f0: 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  b);.  }else if( 
6400: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 73 63 68  strcmp(zCmd,"sch
6410: 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ema")==0 ){.    
6420: 73 68 6f 77 53 63 68 65 6d 61 28 64 62 2c 20 7a  showSchema(db, z
6430: 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Tab);.  }else if
6440: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 73  ( strcmp(zCmd,"s
6450: 65 67 64 69 72 22 29 3d 3d 30 20 29 7b 0a 20 20  egdir")==0 ){.  
6460: 20 20 73 68 6f 77 53 65 67 64 69 72 4d 61 70 28    showSegdirMap(
6470: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c  db, zTab);.  }el
6480: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
6490: 6d 64 2c 22 73 65 67 6d 65 6e 74 22 29 3d 3d 30  md,"segment")==0
64a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 63   ){.    if( argc
64b0: 3c 35 20 29 20 75 73 61 67 65 28 61 72 67 76 5b  <5 ) usage(argv[
64c0: 30 5d 29 3b 0a 20 20 20 20 73 68 6f 77 53 65 67  0]);.    showSeg
64d0: 6d 65 6e 74 28 64 62 2c 20 7a 54 61 62 29 3b 0a  ment(db, zTab);.
64e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
64f0: 6d 70 28 7a 43 6d 64 2c 22 73 65 67 6d 65 6e 74  mp(zCmd,"segment
6500: 2d 73 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a 20  -stats")==0 ){. 
6510: 20 20 20 73 68 6f 77 53 65 67 6d 65 6e 74 53 74     showSegmentSt
6520: 61 74 73 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20  ats(db, zTab);. 
6530: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6540: 70 28 7a 43 6d 64 2c 22 73 74 61 74 22 29 3d 3d  p(zCmd,"stat")==
6550: 30 20 29 7b 0a 20 20 20 20 73 68 6f 77 53 74 61  0 ){.    showSta
6560: 74 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d  t(db, zTab);.  }
6570: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
6580: 7a 43 6d 64 2c 22 76 6f 63 61 62 75 6c 61 72 79  zCmd,"vocabulary
6590: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 68 6f  ")==0 ){.    sho
65a0: 77 56 6f 63 61 62 75 6c 61 72 79 28 64 62 2c 20  wVocabulary(db, 
65b0: 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zTab);.  }else{.
65c0: 20 20 20 20 75 73 61 67 65 28 61 72 67 76 5b 30      usage(argv[0
65d0: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
65e0: 20 30 3b 20 0a 7d 0a                              0; .}.