/ Hex Artifact Content
Login

Artifact 3986531f2fc0ceca0c89c31ec7d0589b6adb19d6:


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 69 6e 74 20 6e 49 64 78 20 3d 20 73      int nIdx = s
2fa0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2fb0: 74 28 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20 20  t(pStmt, 5);.   
2fc0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2fd0: 20 73 7a 3b 0a 20 20 20 20 20 20 70 72 69 6e 74   sz;.      print
2fe0: 66 28 22 46 6f 72 20 6c 65 76 65 6c 20 25 64 3a  f("For level %d:
2ff0: 5c 6e 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 70  \n", i);.      p
3000: 72 69 6e 74 66 28 22 20 20 4e 75 6d 62 65 72 20  rintf("  Number 
3010: 6f 66 20 69 6e 64 65 78 65 73 2e 2e 2e 2e 2e 2e  of indexes......
3020: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
3030: 20 25 39 64 5c 6e 22 2c 20 6e 49 64 78 29 3b 0a   %9d\n", nIdx);.
3040: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20        printf("  
3050: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 73  Number of leaf s
3060: 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e  egments.........
3070: 2e 2e 2e 2e 2e 2e 2e 20 25 39 64 5c 6e 22 2c 20  ....... %9d\n", 
3080: 6e 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66  nLeaf);.      if
3090: 28 20 6e 49 64 78 3e 31 20 29 7b 0a 20 20 20 20  ( nIdx>1 ){.    
30a0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 41 76      printf("  Av
30b0: 65 72 61 67 65 20 6c 65 61 66 20 73 65 67 6d 65  erage leaf segme
30c0: 6e 74 73 20 70 65 72 20 69 6e 64 65 78 2e 2e 2e  nts per index...
30d0: 2e 2e 2e 2e 2e 20 25 31 31 2e 31 66 5c 6e 22 2c  ..... %11.1f\n",
30e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30f0: 28 64 6f 75 62 6c 65 29 6e 4c 65 61 66 2f 28 64  (double)nLeaf/(d
3100: 6f 75 62 6c 65 29 6e 49 64 78 29 3b 0a 20 20 20  ouble)nIdx);.   
3110: 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
3120: 66 28 22 20 20 54 6f 74 61 6c 20 73 69 7a 65 20  f("  Total size 
3130: 6f 66 20 61 6c 6c 20 6c 65 61 66 20 73 65 67 6d  of all leaf segm
3140: 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 6c  ents........ %9l
3150: 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
3160: 20 20 20 20 28 73 7a 20 3d 20 73 71 6c 69 74 65      (sz = sqlite
3170: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
3180: 53 74 6d 74 2c 20 31 29 29 29 3b 0a 20 20 20 20  Stmt, 1)));.    
3190: 20 20 70 72 69 6e 74 66 28 22 20 20 41 76 65 72    printf("  Aver
31a0: 61 67 65 20 73 69 7a 65 20 6f 66 20 6c 65 61 66  age size of leaf
31b0: 20 73 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e   segments.......
31c0: 2e 2e 2e 20 25 31 31 2e 31 66 5c 6e 22 2c 0a 20  ... %11.1f\n",. 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
31f0: 65 28 70 53 74 6d 74 2c 20 32 29 29 3b 0a 20 20  e(pStmt, 2));.  
3200: 20 20 20 20 69 66 28 20 6e 49 64 78 3e 31 20 29      if( nIdx>1 )
3210: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
3220: 28 22 20 20 41 76 65 72 61 67 65 20 6c 65 61 66  ("  Average leaf
3230: 20 73 65 67 6d 65 6e 74 20 73 69 7a 65 20 70 65   segment size pe
3240: 72 20 69 6e 64 65 78 2e 2e 2e 2e 20 25 31 31 2e  r index.... %11.
3250: 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  1f\n",.         
3260: 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 73 7a        (double)sz
3270: 2f 28 64 6f 75 62 6c 65 29 6e 49 64 78 29 3b 0a  /(double)nIdx);.
3280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
3290: 69 6e 74 66 28 22 20 20 4d 61 78 69 6d 75 6d 20  intf("  Maximum 
32a0: 6c 65 61 66 20 73 65 67 6d 65 6e 74 20 73 69 7a  leaf segment siz
32b0: 65 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20  e.............. 
32c0: 25 39 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %9lld\n",.      
32d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
32e0: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
32f0: 74 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 6e 20  t, 3));.      n 
3300: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
3310: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 34 29 3b 0a  _int(pStmt, 4);.
3320: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20        printf("  
3330: 4c 65 61 66 20 73 65 67 6d 65 6e 74 73 20 6c 61  Leaf segments la
3340: 72 67 65 72 20 74 68 61 6e 20 25 35 64 20 62 79  rger than %5d by
3350: 74 65 73 2e 2e 20 25 39 64 20 20 20 25 35 2e 32  tes.. %9d   %5.2
3360: 66 25 25 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  f%%\n",.        
3370: 20 20 20 20 20 70 67 73 7a 2d 34 35 2c 20 6e 2c       pgsz-45, n,
3380: 20 6e 2a 31 30 30 2e 30 2f 6e 4c 65 61 66 29 3b   n*100.0/nLeaf);
3390: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33a0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
33b0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
33c0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
33d0: 22 74 72 65 65 22 20 6c 69 6e 65 20 6f 66 20 74  "tree" line of t
33e0: 68 65 20 73 65 67 64 69 72 20 6d 61 70 20 6f 75  he segdir map ou
33f0: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
3400: 76 6f 69 64 20 70 72 69 6e 74 54 72 65 65 4c 69  void printTreeLi
3410: 6e 65 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ne(sqlite3_int64
3420: 20 69 4c 6f 77 65 72 2c 20 73 71 6c 69 74 65 33   iLower, sqlite3
3430: 5f 69 6e 74 36 34 20 69 55 70 70 65 72 29 7b 0a  _int64 iUpper){.
3440: 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20    printf("      
3450: 20 20 20 20 20 20 20 20 20 20 20 74 72 65 65 20             tree 
3460: 20 20 25 39 6c 6c 64 22 2c 20 69 4c 6f 77 65 72    %9lld", iLower
3470: 29 3b 0a 20 20 69 66 28 20 69 55 70 70 65 72 3e  );.  if( iUpper>
3480: 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 70 72  iLower ){.    pr
3490: 69 6e 74 66 28 22 20 74 68 72 75 20 25 39 6c 6c  intf(" thru %9ll
34a0: 64 20 20 28 25 6c 6c 64 20 62 6c 6f 63 6b 73 29  d  (%lld blocks)
34b0: 22 2c 20 69 55 70 70 65 72 2c 20 69 55 70 70 65  ", iUpper, iUppe
34c0: 72 2d 69 4c 6f 77 65 72 2b 31 29 3b 0a 20 20 7d  r-iLower+1);.  }
34d0: 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b  .  printf("\n");
34e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
34f0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 62 6c  to see if the bl
3500: 6f 63 6b 20 6f 66 20 61 20 25 5f 73 65 67 6d 65  ock of a %_segme
3510: 6e 74 73 20 65 6e 74 72 79 20 69 73 20 4e 55 4c  nts entry is NUL
3520: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L..*/.static int
3530: 20 69 73 4e 75 6c 6c 53 65 67 6d 65 6e 74 28 73   isNullSegment(s
3540: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
3550: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 73 71  t char *zTab, sq
3560: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
3570: 63 6b 49 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  ckId){.  sqlite3
3580: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
3590: 69 6e 74 20 72 63 20 3d 20 31 3b 0a 0a 20 20 70  int rc = 1;..  p
35a0: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64  Stmt = prepare(d
35b0: 62 2c 20 22 53 45 4c 45 43 54 20 62 6c 6f 63 6b  b, "SELECT block
35c0: 20 49 53 20 4e 55 4c 4c 20 46 52 4f 4d 20 27 25   IS NULL FROM '%
35d0: 71 5f 73 65 67 6d 65 6e 74 73 27 22 0a 20 20 20  q_segments'".   
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 22 20 57 48 45 52 45 20 62 6c 6f 63 6b     " WHERE block
3600: 69 64 3d 25 6c 6c 64 22 2c 20 7a 54 61 62 2c 20  id=%lld", zTab, 
3610: 69 42 6c 6f 63 6b 49 64 29 3b 0a 20 20 69 66 28  iBlockId);.  if(
3620: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
3630: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
3640: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
3650: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
3660: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
3670: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3680: 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  e(pStmt);.  retu
3690: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36a0: 53 68 6f 77 20 61 20 6d 61 70 20 6f 66 20 73 65  Show a map of se
36b0: 67 6d 65 6e 74 73 20 64 65 72 69 76 65 64 20 66  gments derived f
36c0: 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69 72  rom the %_segdir
36d0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
36e0: 63 20 76 6f 69 64 20 73 68 6f 77 53 65 67 64 69  c void showSegdi
36f0: 72 4d 61 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rMap(sqlite3 *db
3700: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
3710: 61 62 29 7b 0a 20 20 69 6e 74 20 6d 78 49 6e 64  ab){.  int mxInd
3720: 65 78 2c 20 69 49 6e 64 65 78 3b 0a 20 20 73 71  ex, iIndex;.  sq
3730: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
3740: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
3750: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 32 20 3d 20  _stmt *pStmt2 = 
3760: 30 3b 0a 20 20 69 6e 74 20 70 72 65 76 4c 65 76  0;.  int prevLev
3770: 65 6c 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 70  el;..  pStmt = p
3780: 72 65 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45  repare(db, "SELE
3790: 43 54 20 6d 61 78 28 6c 65 76 65 6c 2f 31 30 32  CT max(level/102
37a0: 34 29 20 46 52 4f 4d 20 27 25 71 5f 73 65 67 64  4) FROM '%q_segd
37b0: 69 72 27 22 2c 20 7a 54 61 62 29 3b 0a 20 20 69  ir'", zTab);.  i
37c0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
37d0: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
37e0: 4f 57 20 29 7b 0a 20 20 20 20 6d 78 49 6e 64 65  OW ){.    mxInde
37f0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
3800: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
3810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
3820: 78 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  xIndex = 0;.  }.
3830: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
3840: 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 20 20 70 72  ze(pStmt);..  pr
3850: 69 6e 74 66 28 22 4e 75 6d 62 65 72 20 6f 66 20  intf("Number of 
3860: 69 6e 76 65 72 74 65 64 20 69 6e 64 69 63 65 73  inverted indices
3870: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20  ............... 
3880: 25 33 64 5c 6e 22 2c 20 6d 78 49 6e 64 65 78 2b  %3d\n", mxIndex+
3890: 31 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 72  1);.  pStmt = pr
38a0: 65 70 61 72 65 28 64 62 2c 0a 20 20 20 20 22 53  epare(db,.    "S
38b0: 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78  ELECT level, idx
38c0: 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c  , start_block, l
38d0: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c  eaves_end_block,
38e0: 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 77 69   end_block, rowi
38f0: 64 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 27  d".    "  FROM '
3900: 25 71 5f 73 65 67 64 69 72 27 22 0a 20 20 20 20  %q_segdir'".    
3910: 22 20 57 48 45 52 45 20 6c 65 76 65 6c 2f 31 30  " WHERE level/10
3920: 32 34 3d 3d 3f 22 0a 20 20 20 20 22 20 4f 52 44  24==?".    " ORD
3930: 45 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43  ER BY level DESC
3940: 2c 20 69 64 78 22 2c 0a 20 20 20 20 7a 54 61 62  , idx",.    zTab
3950: 29 3b 0a 20 20 70 53 74 6d 74 32 20 3d 20 70 72  );.  pStmt2 = pr
3960: 65 70 61 72 65 28 64 62 2c 0a 20 20 20 20 22 53  epare(db,.    "S
3970: 45 4c 45 43 54 20 62 6c 6f 63 6b 69 64 20 46 52  ELECT blockid FR
3980: 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  OM '%q_segments'
3990: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 62 6c  ".    " WHERE bl
39a0: 6f 63 6b 69 64 20 42 45 54 57 45 45 4e 20 3f 20  ockid BETWEEN ? 
39b0: 41 4e 44 20 3f 20 4f 52 44 45 52 20 42 59 20 62  AND ? ORDER BY b
39c0: 6c 6f 63 6b 69 64 22 2c 0a 20 20 20 20 7a 54 61  lockid",.    zTa
39d0: 62 29 3b 0a 20 20 66 6f 72 28 69 49 6e 64 65 78  b);.  for(iIndex
39e0: 3d 30 3b 20 69 49 6e 64 65 78 3c 3d 6d 78 49 6e  =0; iIndex<=mxIn
39f0: 64 65 78 3b 20 69 49 6e 64 65 78 2b 2b 29 7b 0a  dex; iIndex++){.
3a00: 20 20 20 20 69 66 28 20 6d 78 49 6e 64 65 78 3e      if( mxIndex>
3a10: 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  0 ){.      print
3a20: 66 28 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f("*************
3a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3a40: 49 6e 64 65 78 20 25 64 20 22 0a 20 20 20 20 20  Index %d ".     
3a50: 20 20 20 20 20 20 20 20 22 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 2a 2a 2a 2a 5c 6e 22 2c 20 69 49 6e 64 65 78  *****\n", iIndex
3a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
3a90: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
3aa0: 74 6d 74 2c 20 31 2c 20 69 49 6e 64 65 78 29 3b  tmt, 1, iIndex);
3ab0: 0a 20 20 20 20 70 72 65 76 4c 65 76 65 6c 20 3d  .    prevLevel =
3ac0: 20 2d 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20   -1;.    while( 
3ad0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
3ae0: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
3af0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 65  ){.      int iLe
3b00: 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  vel = sqlite3_co
3b10: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
3b20: 30 29 25 31 30 32 34 3b 0a 20 20 20 20 20 20 69  0)%1024;.      i
3b30: 6e 74 20 69 49 64 78 20 3d 20 73 71 6c 69 74 65  nt iIdx = sqlite
3b40: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
3b50: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  mt, 1);.      sq
3b60: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61  lite3_int64 iSta
3b70: 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rt = sqlite3_col
3b80: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
3b90: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
3ba0: 65 33 5f 69 6e 74 36 34 20 69 4c 45 6e 64 20 3d  e3_int64 iLEnd =
3bb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3bc0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 29 3b  int64(pStmt, 3);
3bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
3be0: 6e 74 36 34 20 69 45 6e 64 20 3d 20 73 71 6c 69  nt64 iEnd = sqli
3bf0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
3c00: 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20  (pStmt, 4);.    
3c10: 20 20 63 68 61 72 20 72 74 61 67 5b 32 30 5d 3b    char rtag[20];
3c20: 0a 20 20 20 20 20 20 69 66 28 20 69 4c 65 76 65  .      if( iLeve
3c30: 6c 21 3d 70 72 65 76 4c 65 76 65 6c 20 29 7b 0a  l!=prevLevel ){.
3c40: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
3c50: 6c 65 76 65 6c 20 25 32 64 20 69 64 78 20 25 32  level %2d idx %2
3c60: 64 22 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78  d", iLevel, iIdx
3c70: 29 3b 0a 20 20 20 20 20 20 20 20 70 72 65 76 4c  );.        prevL
3c80: 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20  evel = iLevel;. 
3c90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3ca0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20      printf("    
3cb0: 20 20 20 20 20 69 64 78 20 25 32 64 22 2c 20 69       idx %2d", i
3cc0: 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Idx);.      }.  
3cd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3ce0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 72 74 61 67  intf(sizeof(rtag
3cf0: 29 2c 20 72 74 61 67 2c 20 22 72 25 6c 6c 64 22  ), rtag, "r%lld"
3d00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3d10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3d20: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
3d30: 74 6d 74 2c 35 29 29 3b 0a 20 20 20 20 20 20 70  tmt,5));.      p
3d40: 72 69 6e 74 66 28 22 20 20 72 6f 6f 74 20 20 20  rintf("  root   
3d50: 25 39 73 5c 6e 22 2c 20 72 74 61 67 29 3b 0a 20  %9s\n", rtag);. 
3d60: 20 20 20 20 20 69 66 28 20 69 4c 45 6e 64 3e 69       if( iLEnd>i
3d70: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
3d80: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
3d90: 4c 6f 77 65 72 2c 20 69 50 72 65 76 2c 20 69 58  Lower, iPrev, 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 3b 0a 20 20 73 71 6c 69 74 65  iChild;.  sqlite
42d0: 33 5f 69 6e 74 36 34 20 69 50 72 65 66 69 78 3b  3_int64 iPrefix;
42e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
42f0: 20 6e 54 65 72 6d 3b 0a 20 20 73 71 6c 69 74 65   nTerm;.  sqlite
4300: 33 5f 69 6e 74 36 34 20 6e 3b 0a 20 20 73 71 6c  3_int64 n;.  sql
4310: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 73  ite3_int64 iDocs
4320: 7a 3b 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  z;.  int iHeight
4330: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
4340: 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  4 i = 0;.  int c
4350: 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  nt = 0;.  char z
4360: 54 65 72 6d 5b 31 30 30 30 5d 3b 0a 0a 20 20 69  Term[1000];..  i
4370: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 44   += getVarint(aD
4380: 61 74 61 2c 20 26 6e 29 3b 0a 20 20 69 48 65 69  ata, &n);.  iHei
4390: 67 68 74 20 3d 20 28 69 6e 74 29 6e 3b 0a 20 20  ght = (int)n;.  
43a0: 70 72 69 6e 74 66 28 22 68 65 69 67 68 74 3a 20  printf("height: 
43b0: 25 64 5c 6e 22 2c 20 69 48 65 69 67 68 74 29 3b  %d\n", iHeight);
43c0: 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3e 30  .  if( iHeight>0
43d0: 20 29 7b 0a 20 20 20 20 69 20 2b 3d 20 67 65 74   ){.    i += get
43e0: 56 61 72 69 6e 74 28 61 44 61 74 61 2b 69 2c 20  Varint(aData+i, 
43f0: 26 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 70 72  &iChild);.    pr
4400: 69 6e 74 66 28 22 6c 65 66 74 2d 63 68 69 6c 64  intf("left-child
4410: 3a 20 25 6c 6c 64 5c 6e 22 2c 20 69 43 68 69 6c  : %lld\n", iChil
4420: 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  d);.  }.  while(
4430: 20 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20   i<nData ){.    
4440: 69 66 28 20 28 63 6e 74 2b 2b 29 3e 30 20 29 7b  if( (cnt++)>0 ){
4450: 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56  .      i += getV
4460: 61 72 69 6e 74 28 61 44 61 74 61 2b 69 2c 20 26  arint(aData+i, &
4470: 69 50 72 65 66 69 78 29 3b 0a 20 20 20 20 7d 65  iPrefix);.    }e
4480: 6c 73 65 7b 0a 20 20 20 20 20 20 69 50 72 65 66  lse{.      iPref
4490: 69 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ix = 0;.    }.  
44a0: 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
44b0: 28 61 44 61 74 61 2b 69 2c 20 26 6e 54 65 72 6d  (aData+i, &nTerm
44c0: 29 3b 0a 20 20 20 20 69 66 28 20 69 50 72 65 66  );.    if( iPref
44d0: 69 78 2b 6e 54 65 72 6d 2b 31 20 3e 3d 20 73 69  ix+nTerm+1 >= si
44e0: 7a 65 6f 66 28 7a 54 65 72 6d 29 20 29 7b 0a 20  zeof(zTerm) ){. 
44f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
4500: 65 72 72 2c 20 22 74 65 72 6d 20 74 6f 20 6c 6f  err, "term to lo
4510: 6e 67 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ng\n");.      ex
4520: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
4530: 20 6d 65 6d 63 70 79 28 7a 54 65 72 6d 2b 69 50   memcpy(zTerm+iP
4540: 72 65 66 69 78 2c 20 61 44 61 74 61 2b 69 2c 20  refix, aData+i, 
4550: 28 73 69 7a 65 5f 74 29 6e 54 65 72 6d 29 3b 0a  (size_t)nTerm);.
4560: 20 20 20 20 7a 54 65 72 6d 5b 69 50 72 65 66 69      zTerm[iPrefi
4570: 78 2b 6e 54 65 72 6d 5d 20 3d 20 30 3b 0a 20 20  x+nTerm] = 0;.  
4580: 20 20 69 20 2b 3d 20 6e 54 65 72 6d 3b 0a 20 20    i += nTerm;.  
4590: 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30    if( iHeight==0
45a0: 20 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 67   ){.      i += g
45b0: 65 74 56 61 72 69 6e 74 28 61 44 61 74 61 2b 69  etVarint(aData+i
45c0: 2c 20 26 69 44 6f 63 73 7a 29 3b 0a 20 20 20 20  , &iDocsz);.    
45d0: 20 20 70 72 69 6e 74 66 28 22 74 65 72 6d 3a 20    printf("term: 
45e0: 25 2d 32 35 73 20 64 6f 63 6c 69 73 74 20 25 37  %-25s doclist %7
45f0: 6c 6c 64 20 62 79 74 65 73 20 6f 66 66 73 65 74  lld bytes offset
4600: 20 25 6c 6c 64 5c 6e 22 2c 20 7a 54 65 72 6d 2c   %lld\n", zTerm,
4610: 20 69 44 6f 63 73 7a 2c 20 69 29 3b 0a 20 20 20   iDocsz, i);.   
4620: 20 20 20 69 20 2b 3d 20 69 44 6f 63 73 7a 3b 0a     i += iDocsz;.
4630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4640: 20 70 72 69 6e 74 66 28 22 74 65 72 6d 3a 20 25   printf("term: %
4650: 2d 32 35 73 20 63 68 69 6c 64 20 25 6c 6c 64 5c  -25s child %lld\
4660: 6e 22 2c 20 7a 54 65 72 6d 2c 20 2b 2b 69 43 68  n", zTerm, ++iCh
4670: 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ild);.    }.  }.
4680: 7d 0a 20 20 0a 20 20 0a 2f 2a 0a 2a 2a 20 50 72  }.  .  ./*.** Pr
4690: 69 6e 74 20 61 20 61 20 62 6c 6f 62 20 61 73 20  int a a blob as 
46a0: 68 65 78 20 61 6e 64 20 61 73 63 69 69 2e 0a 2a  hex and ascii..*
46b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
46c0: 69 6e 74 42 6c 6f 62 28 0a 20 20 63 6f 6e 73 74  intBlob(.  const
46d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
46e0: 61 44 61 74 61 2c 20 20 20 2f 2a 20 43 6f 6e 74  aData,   /* Cont
46f0: 65 6e 74 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a  ent to print */.
4700: 20 20 69 6e 74 20 6e 44 61 74 61 20 20 20 20 20    int nData     
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4730: 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  es of content */
4740: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
4750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
4760: 66 73 74 46 6d 74 3b 0a 20 20 63 6f 6e 73 74 20  fstFmt;.  const 
4770: 69 6e 74 20 70 65 72 4c 69 6e 65 20 3d 20 31 36  int perLine = 16
4780: 3b 0a 0a 20 20 69 66 28 20 28 6e 44 61 74 61 26  ;..  if( (nData&
4790: 7e 30 78 66 66 66 29 3d 3d 30 20 29 7b 0a 20 20  ~0xfff)==0 ){.  
47a0: 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20 22 20 25    zOfstFmt = " %
47b0: 30 33 78 3a 20 22 3b 0a 20 20 7d 65 6c 73 65 20  03x: ";.  }else 
47c0: 69 66 28 20 28 6e 44 61 74 61 26 7e 30 78 66 66  if( (nData&~0xff
47d0: 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f  ff)==0 ){.    zO
47e0: 66 73 74 46 6d 74 20 3d 20 22 20 25 30 34 78 3a  fstFmt = " %04x:
47f0: 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   ";.  }else if( 
4800: 28 6e 44 61 74 61 26 7e 30 78 66 66 66 66 66 29  (nData&~0xfffff)
4810: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74  ==0 ){.    zOfst
4820: 46 6d 74 20 3d 20 22 20 25 30 35 78 3a 20 22 3b  Fmt = " %05x: ";
4830: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6e 44  .  }else if( (nD
4840: 61 74 61 26 7e 30 78 66 66 66 66 66 66 29 3d 3d  ata&~0xffffff)==
4850: 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d  0 ){.    zOfstFm
4860: 74 20 3d 20 22 20 25 30 36 78 3a 20 22 3b 0a 20  t = " %06x: ";. 
4870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 66 73   }else{.    zOfs
4880: 74 46 6d 74 20 3d 20 22 20 25 30 38 78 3a 20 22  tFmt = " %08x: "
4890: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
48a0: 3b 20 69 3c 6e 44 61 74 61 3b 20 69 20 2b 3d 20  ; i<nData; i += 
48b0: 70 65 72 4c 69 6e 65 29 7b 0a 20 20 20 20 66 70  perLine){.    fp
48c0: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 7a 4f  rintf(stdout, zO
48d0: 66 73 74 46 6d 74 2c 20 69 29 3b 0a 20 20 20 20  fstFmt, i);.    
48e0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 65 72 4c 69  for(j=0; j<perLi
48f0: 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ne; j++){.      
4900: 69 66 28 20 69 2b 6a 3e 6e 44 61 74 61 20 29 7b  if( i+j>nData ){
4910: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
4920: 28 73 74 64 6f 75 74 2c 20 22 20 20 20 22 29 3b  (stdout, "   ");
4930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4940: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
4950: 64 6f 75 74 2c 22 25 30 32 78 20 22 2c 20 61 44  dout,"%02x ", aD
4960: 61 74 61 5b 69 2b 6a 5d 29 3b 0a 20 20 20 20 20  ata[i+j]);.     
4970: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
4980: 28 6a 3d 30 3b 20 6a 3c 70 65 72 4c 69 6e 65 3b  (j=0; j<perLine;
4990: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
49a0: 20 69 2b 6a 3e 6e 44 61 74 61 20 29 7b 0a 20 20   i+j>nData ){.  
49b0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
49c0: 64 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20  dout, " ");.    
49d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
49e0: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
49f0: 22 25 63 22 2c 20 69 73 70 72 69 6e 74 28 61 44  "%c", isprint(aD
4a00: 61 74 61 5b 69 2b 6a 5d 29 20 3f 20 61 44 61 74  ata[i+j]) ? aDat
4a10: 61 5b 69 2b 6a 5d 20 3a 20 27 2e 27 29 3b 0a 20  a[i+j] : '.');. 
4a20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4a30: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
4a40: 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  "\n");.  }.}../*
4a50: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 65 78 74  .** Convert text
4a60: 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e 74   to a 64-bit int
4a70: 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 73  eger.*/.static s
4a80: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 74 6f  qlite3_int64 ato
4a90: 69 36 34 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  i64(const char *
4aa0: 7a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  z){.  sqlite3_in
4ab0: 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  t64 v = 0;.  whi
4ac0: 6c 65 28 20 7a 5b 30 5d 3e 3d 27 30 27 20 26 26  le( z[0]>='0' &&
4ad0: 20 7a 5b 30 5d 3c 3d 27 39 27 20 29 7b 0a 20 20   z[0]<='9' ){.  
4ae0: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a 5b     v = v*10 + z[
4af0: 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 7a  0] - '0';.     z
4b00: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
4b10: 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   v;.}../*.** Ret
4b20: 75 72 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  urn a prepared s
4b30: 74 61 74 65 6d 65 6e 74 20 77 68 69 63 68 2c 20  tatement which, 
4b40: 77 68 65 6e 20 73 74 65 70 70 65 64 2c 20 77 69  when stepped, wi
4b50: 6c 6c 20 72 65 74 75 72 6e 20 69 6e 20 69 74 73  ll return in its
4b60: 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
4b70: 20 74 68 65 20 62 6c 6f 62 20 61 73 73 6f 63 69   the blob associ
4b80: 61 74 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e  ated with segmen
4b90: 74 20 7a 49 64 2e 20 20 49 66 20 7a 49 64 20 62  t zId.  If zId b
4ba0: 65 67 69 6e 73 20 77 69 74 68 0a 2a 2a 20 27 72  egins with.** 'r
4bb0: 27 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  ' then it is a r
4bc0: 6f 77 69 64 20 6f 66 20 61 20 25 5f 73 65 67 64  owid of a %_segd
4bd0: 69 72 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72  ir entry.  Other
4be0: 77 69 73 65 20 69 74 20 69 73 20 61 0a 2a 2a 20  wise it is a.** 
4bf0: 25 5f 73 65 67 6d 65 6e 74 20 65 6e 74 72 79 2e  %_segment entry.
4c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
4c10: 65 33 5f 73 74 6d 74 20 2a 70 72 65 70 61 72 65  e3_stmt *prepare
4c20: 54 6f 47 65 74 53 65 67 6d 65 6e 74 28 0a 20 20  ToGetSegment(.  
4c30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
4c40: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
4c50: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
4c60: 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20 20 2f  char *zTab,    /
4c70: 2a 20 54 68 65 20 46 54 53 33 2f 34 20 74 61 62  * The FTS3/4 tab
4c80: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e  le name */.  con
4c90: 73 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20  st char *zId    
4ca0: 20 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 73    /* ID of the s
4cb0: 65 67 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 20 2a  egment to open *
4cc0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
4cd0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66  tmt *pStmt;.  if
4ce0: 28 20 7a 49 64 5b 30 5d 3d 3d 27 72 27 20 29 7b  ( zId[0]=='r' ){
4cf0: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65  .    pStmt = pre
4d00: 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45 43 54  pare(db, "SELECT
4d10: 20 72 6f 6f 74 20 46 52 4f 4d 20 27 25 71 5f 73   root FROM '%q_s
4d20: 65 67 64 69 72 27 20 57 48 45 52 45 20 72 6f 77  egdir' WHERE row
4d30: 69 64 3d 25 6c 6c 64 22 2c 0a 20 20 20 20 20 20  id=%lld",.      
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
4d50: 61 62 2c 20 61 74 6f 69 36 34 28 7a 49 64 2b 31  ab, atoi64(zId+1
4d60: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
4d70: 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65   pStmt = prepare
4d80: 28 64 62 2c 20 22 53 45 4c 45 43 54 20 62 6c 6f  (db, "SELECT blo
4d90: 63 6b 20 46 52 4f 4d 20 27 25 71 5f 73 65 67 6d  ck FROM '%q_segm
4da0: 65 6e 74 73 27 20 57 48 45 52 45 20 62 6c 6f 63  ents' WHERE bloc
4db0: 6b 69 64 3d 25 6c 6c 64 22 2c 0a 20 20 20 20 20  kid=%lld",.     
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
4dd0: 54 61 62 2c 20 61 74 6f 69 36 34 28 7a 49 64 29  Tab, atoi64(zId)
4de0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4df0: 70 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pStmt;.}../*.** 
4e00: 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  Print the conten
4e10: 74 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20 6f  t of a segment o
4e20: 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
4e30: 20 61 20 73 65 67 64 69 72 2e 20 20 54 68 65 20   a segdir.  The 
4e40: 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f 72 20 72 6f  segment.** or ro
4e50: 6f 74 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  ot is identified
4e60: 20 62 79 20 61 7a 45 78 74 72 61 5b 30 5d 2e 20   by azExtra[0]. 
4e70: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 63 68   If the first ch
4e80: 61 72 61 63 74 65 72 20 6f 66 20 61 7a 45 78 74  aracter of azExt
4e90: 72 61 5b 30 5d 0a 2a 2a 20 69 73 20 27 72 27 20  ra[0].** is 'r' 
4ea0: 74 68 65 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  then the remaind
4eb0: 65 72 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  er is the intege
4ec0: 72 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 25  r rowid of the %
4ed0: 5f 73 65 67 64 69 72 20 65 6e 74 72 79 2e 0a 2a  _segdir entry..*
4ee0: 2a 20 49 66 20 74 68 65 20 66 69 72 73 74 20 63  * If the first c
4ef0: 68 61 72 61 63 74 65 72 20 6f 66 20 61 7a 45 78  haracter of azEx
4f00: 74 72 61 5b 30 5d 20 69 73 20 6e 6f 74 20 27 72  tra[0] is not 'r
4f10: 27 20 74 68 65 6e 2c 20 74 68 65 6e 20 61 6c 6c  ' then, then all
4f20: 20 6f 66 0a 2a 2a 20 61 7a 45 78 74 72 61 5b 30   of.** azExtra[0
4f30: 5d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  ] is an integer 
4f40: 77 68 69 63 68 20 69 73 20 74 68 65 20 62 6c 6f  which is the blo
4f50: 63 6b 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ck number..**.**
4f60: 20 49 66 20 74 68 65 20 2d 2d 72 61 77 20 6f 70   If the --raw op
4f70: 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 20  tion is present 
4f80: 69 6e 20 61 7a 45 78 74 72 61 2c 20 74 68 65 6e  in azExtra, then
4f90: 20 61 20 68 65 78 20 64 75 6d 70 20 69 73 20 70   a hex dump is p
4fa0: 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 4f 74 68 65  rovided..** Othe
4fb0: 72 77 69 73 65 20 61 20 64 65 63 6f 64 69 6e 67  rwise a decoding
4fc0: 20 69 73 20 73 68 6f 77 6e 2e 0a 2a 2f 0a 73 74   is shown..*/.st
4fd0: 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77 53 65  atic void showSe
4fe0: 67 6d 65 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  gment(sqlite3 *d
4ff0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5000: 54 61 62 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  Tab){.  const un
5010: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
5020: 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b  ta;.  int nData;
5030: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5040: 2a 70 53 74 6d 74 3b 0a 0a 20 20 70 53 74 6d 74  *pStmt;..  pStmt
5050: 20 3d 20 70 72 65 70 61 72 65 54 6f 47 65 74 53   = prepareToGetS
5060: 65 67 6d 65 6e 74 28 64 62 2c 20 7a 54 61 62 2c  egment(db, zTab,
5070: 20 61 7a 45 78 74 72 61 5b 30 5d 29 3b 0a 20 20   azExtra[0]);.  
5080: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
5090: 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f  (pStmt)!=SQLITE_
50a0: 52 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ROW ){.    sqlit
50b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
50c0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
50d0: 20 20 7d 0a 20 20 6e 44 61 74 61 20 3d 20 73 71    }.  nData = sq
50e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
50f0: 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  es(pStmt, 0);.  
5100: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  aData = sqlite3_
5110: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
5120: 74 2c 20 30 29 3b 0a 20 20 70 72 69 6e 74 66 28  t, 0);.  printf(
5130: 22 53 65 67 6d 65 6e 74 20 25 73 20 6f 66 20 73  "Segment %s of s
5140: 69 7a 65 20 25 64 20 62 79 74 65 73 3a 5c 6e 22  ize %d bytes:\n"
5150: 2c 20 61 7a 45 78 74 72 61 5b 30 5d 2c 20 6e 44  , azExtra[0], nD
5160: 61 74 61 29 3b 0a 20 20 69 66 28 20 66 69 6e 64  ata);.  if( find
5170: 4f 70 74 69 6f 6e 28 22 72 61 77 22 2c 20 30 2c  Option("raw", 0,
5180: 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 72   0)!=0 ){.    pr
5190: 69 6e 74 42 6c 6f 62 28 61 44 61 74 61 2c 20 6e  intBlob(aData, n
51a0: 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Data);.  }else{.
51b0: 20 20 20 20 64 65 63 6f 64 65 53 65 67 6d 65 6e      decodeSegmen
51c0: 74 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  t(aData, nData);
51d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
51e0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
51f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
5200: 61 20 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74  a single doclist
5210: 20 61 6e 64 20 64 69 73 70 6c 61 79 20 74 68 65   and display the
5220: 20 72 65 73 75 6c 74 73 20 6f 6e 20 73 74 64 6f   results on stdo
5230: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ut..*/.static vo
5240: 69 64 20 64 65 63 6f 64 65 44 6f 63 6c 69 73 74  id decodeDoclist
5250: 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
5260: 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 2c 20  ed char *aData, 
5270: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 74 6f 20    /* Content to 
5280: 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  print */.  int n
5290: 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20 20  Data            
52a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
52b0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
52c0: 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontent */.){.  s
52d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
52e0: 65 76 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 73  evDocid = 0;.  s
52f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
5300: 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  cid;.  sqlite3_i
5310: 6e 74 36 34 20 69 50 6f 73 3b 0a 20 20 73 71 6c  nt64 iPos;.  sql
5320: 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76  ite3_int64 iPrev
5330: 50 6f 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Pos = 0;.  sqlit
5340: 65 33 5f 69 6e 74 36 34 20 69 43 6f 6c 3b 0a 20  e3_int64 iCol;. 
5350: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 0a 20 20 77   int i = 0;..  w
5360: 68 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29 7b  hile( i<nData ){
5370: 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72  .    i += getVar
5380: 69 6e 74 28 61 44 61 74 61 2b 69 2c 20 26 69 44  int(aData+i, &iD
5390: 6f 63 69 64 29 3b 0a 20 20 20 20 70 72 69 6e 74  ocid);.    print
53a0: 66 28 22 64 6f 63 69 64 20 25 6c 6c 64 20 63 6f  f("docid %lld co
53b0: 6c 30 22 2c 20 69 44 6f 63 69 64 2b 69 50 72 65  l0", iDocid+iPre
53c0: 76 44 6f 63 69 64 29 3b 0a 20 20 20 20 69 50 72  vDocid);.    iPr
53d0: 65 76 44 6f 63 69 64 20 2b 3d 20 69 44 6f 63 69  evDocid += iDoci
53e0: 64 3b 0a 20 20 20 20 69 50 72 65 76 50 6f 73 20  d;.    iPrevPos 
53f0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
5400: 31 20 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20  1 ){.      i += 
5410: 67 65 74 56 61 72 69 6e 74 28 61 44 61 74 61 2b  getVarint(aData+
5420: 69 2c 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20  i, &iPos);.     
5430: 20 69 66 28 20 69 50 6f 73 3d 3d 31 20 29 7b 0a   if( iPos==1 ){.
5440: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74          i += get
5450: 56 61 72 69 6e 74 28 61 44 61 74 61 2b 69 2c 20  Varint(aData+i, 
5460: 26 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  &iCol);.        
5470: 70 72 69 6e 74 66 28 22 20 63 6f 6c 25 6c 6c 64  printf(" col%lld
5480: 22 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ", iCol);.      
5490: 20 20 69 50 72 65 76 50 6f 73 20 3d 20 30 3b 0a    iPrevPos = 0;.
54a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
54b0: 69 50 6f 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iPos==0 ){.     
54c0: 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
54d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
54e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
54f0: 20 20 20 20 20 69 50 72 65 76 50 6f 73 20 2b 3d       iPrevPos +=
5500: 20 69 50 6f 73 20 2d 20 32 3b 0a 20 20 20 20 20   iPos - 2;.     
5510: 20 20 20 70 72 69 6e 74 66 28 22 20 25 6c 6c 64     printf(" %lld
5520: 22 2c 20 69 50 72 65 76 50 6f 73 29 3b 0a 20 20  ", iPrevPos);.  
5530: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5540: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  }.  ../*.** Prin
5550: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
5560: 20 61 20 64 6f 63 6c 69 73 74 2e 20 20 54 68 65   a doclist.  The
5570: 20 73 65 67 6d 65 6e 74 20 6f 72 20 73 65 67 64   segment or segd
5580: 69 72 2d 72 6f 6f 74 20 69 73 0a 2a 2a 20 69 64  ir-root is.** id
5590: 65 6e 74 69 66 69 65 64 20 62 79 20 61 7a 45 78  entified by azEx
55a0: 74 72 61 5b 30 5d 2e 20 20 49 66 20 74 68 65 20  tra[0].  If the 
55b0: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
55c0: 6f 66 20 61 7a 45 78 74 72 61 5b 30 5d 0a 2a 2a  of azExtra[0].**
55d0: 20 69 73 20 27 72 27 20 74 68 65 6e 20 74 68 65   is 'r' then the
55e0: 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20 74 68   remainder is th
55f0: 65 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 20  e integer rowid 
5600: 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  of the %_segdir 
5610: 65 6e 74 72 79 2e 0a 2a 2a 20 49 66 20 74 68 65  entry..** If the
5620: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
5630: 20 6f 66 20 61 7a 45 78 74 72 61 5b 30 5d 20 69   of azExtra[0] i
5640: 73 20 6e 6f 74 20 27 72 27 20 74 68 65 6e 2c 20  s not 'r' then, 
5650: 74 68 65 6e 20 61 6c 6c 20 6f 66 0a 2a 2a 20 61  then all of.** a
5660: 7a 45 78 74 72 61 5b 30 5d 20 69 73 20 61 6e 20  zExtra[0] is an 
5670: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
5680: 20 74 68 65 20 62 6c 6f 63 6b 20 6e 75 6d 62 65   the block numbe
5690: 72 2e 20 20 54 68 65 20 6f 66 66 73 65 74 0a 2a  r.  The offset.*
56a0: 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65  * into the segme
56b0: 6e 74 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  nt is identified
56c0: 20 62 79 20 61 7a 45 78 74 72 61 5b 31 5d 2e 20   by azExtra[1]. 
56d0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
56e0: 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 69 73 20 61   doclist.** is a
56f0: 7a 45 78 74 72 61 5b 32 5d 2e 0a 2a 2a 0a 2a 2a  zExtra[2]..**.**
5700: 20 49 66 20 74 68 65 20 2d 2d 72 61 77 20 6f 70   If the --raw op
5710: 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 20  tion is present 
5720: 69 6e 20 61 7a 45 78 74 72 61 2c 20 74 68 65 6e  in azExtra, then
5730: 20 61 20 68 65 78 20 64 75 6d 70 20 69 73 20 70   a hex dump is p
5740: 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 4f 74 68 65  rovided..** Othe
5750: 72 77 69 73 65 20 61 20 64 65 63 6f 64 69 6e 67  rwise a decoding
5760: 20 69 73 20 73 68 6f 77 6e 2e 0a 2a 2f 0a 73 74   is shown..*/.st
5770: 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77 44 6f  atic void showDo
5780: 63 6c 69 73 74 28 73 71 6c 69 74 65 33 20 2a 64  clist(sqlite3 *d
5790: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
57a0: 54 61 62 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  Tab){.  const un
57b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
57c0: 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ta;.  sqlite3_in
57d0: 74 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 69 6e  t64 offset;.  in
57e0: 74 20 6e 44 61 74 61 3b 0a 20 20 73 71 6c 69 74  t nData;.  sqlit
57f0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
5800: 0a 20 20 6f 66 66 73 65 74 20 3d 20 61 74 6f 69  .  offset = atoi
5810: 36 34 28 61 7a 45 78 74 72 61 5b 31 5d 29 3b 0a  64(azExtra[1]);.
5820: 20 20 6e 44 61 74 61 20 3d 20 61 74 6f 69 28 61    nData = atoi(a
5830: 7a 45 78 74 72 61 5b 32 5d 29 3b 0a 20 20 70 53  zExtra[2]);.  pS
5840: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 54 6f 47  tmt = prepareToG
5850: 65 74 53 65 67 6d 65 6e 74 28 64 62 2c 20 7a 54  etSegment(db, zT
5860: 61 62 2c 20 61 7a 45 78 74 72 61 5b 30 5d 29 3b  ab, azExtra[0]);
5870: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
5880: 74 65 70 28 70 53 74 6d 74 29 21 3d 53 51 4c 49  tep(pStmt)!=SQLI
5890: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 73 71  TE_ROW ){.    sq
58a0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
58b0: 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72  Stmt);.    retur
58c0: 6e 3b 0a 20 20 7d 0a 20 20 61 44 61 74 61 20 3d  n;.  }.  aData =
58d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
58e0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 3b 0a  blob(pStmt, 0);.
58f0: 20 20 70 72 69 6e 74 66 28 22 44 6f 63 6c 69 73    printf("Doclis
5900: 74 20 61 74 20 25 73 20 6f 66 66 73 65 74 20 25  t at %s offset %
5910: 6c 6c 64 20 6f 66 20 73 69 7a 65 20 25 64 20 62  lld of size %d b
5920: 79 74 65 73 3a 5c 6e 22 2c 0a 20 20 20 20 20 20  ytes:\n",.      
5930: 20 20 20 61 7a 45 78 74 72 61 5b 30 5d 2c 20 6f     azExtra[0], o
5940: 66 66 73 65 74 2c 20 6e 44 61 74 61 29 3b 0a 20  ffset, nData);. 
5950: 20 69 66 28 20 66 69 6e 64 4f 70 74 69 6f 6e 28   if( findOption(
5960: 22 72 61 77 22 2c 20 30 2c 20 30 29 21 3d 30 20  "raw", 0, 0)!=0 
5970: 29 7b 0a 20 20 20 20 70 72 69 6e 74 42 6c 6f 62  ){.    printBlob
5980: 28 61 44 61 74 61 2b 6f 66 66 73 65 74 2c 20 6e  (aData+offset, n
5990: 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Data);.  }else{.
59a0: 20 20 20 20 64 65 63 6f 64 65 44 6f 63 6c 69 73      decodeDoclis
59b0: 74 28 61 44 61 74 61 2b 6f 66 66 73 65 74 2c 20  t(aData+offset, 
59c0: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71  nData);.  }.  sq
59d0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
59e0: 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
59f0: 53 68 6f 77 20 74 68 65 20 74 6f 70 20 4e 20 6c  Show the top N l
5a00: 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 73 0a  argest segments.
5a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
5a20: 69 73 74 42 69 67 53 65 67 6d 65 6e 74 73 28 73  istBigSegments(s
5a30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5a40: 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
5a50: 20 69 6e 74 20 6e 54 6f 70 2c 20 69 3b 0a 20 20   int nTop, i;.  
5a60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
5a70: 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  tmt;.  sqlite3_i
5a80: 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74  nt64 sz;.  sqlit
5a90: 65 33 5f 69 6e 74 36 34 20 69 64 3b 0a 0a 20 20  e3_int64 id;..  
5aa0: 6e 54 6f 70 20 3d 20 61 74 6f 69 28 66 69 6e 64  nTop = atoi(find
5ab0: 4f 70 74 69 6f 6e 28 22 74 6f 70 22 2c 20 31 2c  Option("top", 1,
5ac0: 20 22 32 35 22 29 29 3b 0a 20 20 70 72 69 6e 74   "25"));.  print
5ad0: 66 28 22 54 68 65 20 25 64 20 6c 61 72 67 65 73  f("The %d larges
5ae0: 74 20 73 65 67 6d 65 6e 74 73 3a 5c 6e 22 2c 20  t segments:\n", 
5af0: 6e 54 6f 70 29 3b 0a 20 20 70 53 74 6d 74 20 3d  nTop);.  pStmt =
5b00: 20 70 72 65 70 61 72 65 28 64 62 2c 0a 20 20 20   prepare(db,.   
5b10: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
5b20: 20 62 6c 6f 63 6b 69 64 2c 20 6c 65 6e 67 74 68   blockid, length
5b30: 28 62 6c 6f 63 6b 29 20 41 53 20 6c 65 6e 20 46  (block) AS len F
5b40: 52 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e 74 73  ROM '%q_segments
5b50: 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  '".            "
5b60: 20 4f 52 44 45 52 20 42 59 20 32 20 44 45 53 43   ORDER BY 2 DESC
5b70: 2c 20 31 22 0a 20 20 20 20 20 20 20 20 20 20 20  , 1".           
5b80: 20 22 20 4c 49 4d 49 54 20 25 64 22 2c 20 7a 54   " LIMIT %d", zT
5b90: 61 62 2c 20 6e 54 6f 70 29 3b 0a 20 20 69 20 3d  ab, nTop);.  i =
5ba0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
5bb0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
5bc0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
5bd0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 64 20      i++;.    id 
5be0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5bf0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29  _int64(pStmt, 0)
5c00: 3b 0a 20 20 20 20 73 7a 20 3d 20 73 71 6c 69 74  ;.    sz = sqlit
5c10: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
5c20: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70  pStmt, 1);.    p
5c30: 72 69 6e 74 66 28 22 20 20 25 32 64 2e 20 25 39  rintf("  %2d. %9
5c40: 6c 6c 64 20 73 69 7a 65 20 25 6c 6c 64 5c 6e 22  lld size %lld\n"
5c50: 2c 20 69 2c 20 69 64 2c 20 73 7a 29 3b 0a 20 20  , i, id, sz);.  
5c60: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
5c70: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  lize(pStmt);.}..
5c80: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  ..static void us
5c90: 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  age(const char *
5ca0: 61 72 67 76 30 29 7b 0a 20 20 66 70 72 69 6e 74  argv0){.  fprint
5cb0: 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
5cc0: 3a 20 25 73 20 44 41 54 41 42 41 53 45 5c 6e 22  : %s DATABASE\n"
5cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5ce0: 20 20 20 22 20 20 20 6f 72 3a 20 25 73 20 44 41     "   or: %s DA
5cf0: 54 41 42 41 53 45 20 46 54 53 33 54 41 42 4c 45  TABASE FTS3TABLE
5d00: 20 41 52 47 53 2e 2e 2e 5c 6e 22 2c 20 61 72 67   ARGS...\n", arg
5d10: 76 30 2c 20 61 72 67 76 30 29 3b 0a 20 20 66 70  v0, argv0);.  fp
5d20: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
5d30: 20 20 22 41 52 47 53 3a 5c 6e 22 0a 20 20 20 20    "ARGS:\n".    
5d40: 22 20 20 62 69 67 2d 73 65 67 6d 65 6e 74 73 20  "  big-segments 
5d50: 5b 2d 2d 74 6f 70 20 4e 5d 20 20 20 20 20 20 20  [--top N]       
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f               sho
5d70: 77 20 74 68 65 20 6c 61 72 67 65 73 74 20 73 65  w the largest se
5d80: 67 6d 65 6e 74 73 5c 6e 22 0a 20 20 20 20 22 20  gments\n".    " 
5d90: 20 64 6f 63 6c 69 73 74 20 42 4c 4f 43 4b 49 44   doclist BLOCKID
5da0: 20 4f 46 46 53 45 54 20 53 49 5a 45 20 5b 2d 2d   OFFSET SIZE [--
5db0: 72 61 77 5d 20 20 20 20 20 20 20 44 65 63 6f 64  raw]       Decod
5dc0: 65 20 61 20 64 6f 63 6c 69 73 74 5c 6e 22 0a 20  e a doclist\n". 
5dd0: 20 20 20 22 20 20 73 63 68 65 6d 61 20 20 20 20     "  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: 46 54 53 20 74 61 62 6c 65 20 73 63 68 65 6d 61  FTS table schema
5e10: 5c 6e 22 0a 20 20 20 20 22 20 20 73 65 67 64 69  \n".    "  segdi
5e20: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 6f       directory o
5e50: 66 20 73 65 67 6d 65 6e 74 73 5c 6e 22 0a 20 20  f segments\n".  
5e60: 20 20 22 20 20 73 65 67 6d 65 6e 74 20 42 4c 4f    "  segment BLO
5e70: 43 4b 49 44 20 5b 2d 2d 72 61 77 5d 20 20 20 20  CKID [--raw]    
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
5e90: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 65 67 6d  ontent of a segm
5ea0: 65 6e 74 5c 6e 22 0a 20 20 20 20 22 20 20 73 65  ent\n".    "  se
5eb0: 67 6d 65 6e 74 2d 73 74 61 74 73 20 20 20 20 20  gment-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 69 6e 66 6f 20 6f 6e 20          info on 
5ee0: 73 65 67 6d 65 6e 74 20 73 69 7a 65 73 5c 6e 22  segment sizes\n"
5ef0: 0a 20 20 20 20 22 20 20 73 74 61 74 20 20 20 20  .    "  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 74 68 65 20 25 25 5f 73 74 61 74 20 74 61    the %%_stat ta
5f30: 62 6c 65 5c 6e 22 0a 20 20 20 20 22 20 20 76 6f  ble\n".    "  vo
5f40: 63 61 62 75 6c 61 72 79 20 5b 2d 2d 74 6f 70 20  cabulary [--top 
5f50: 4e 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N]              
5f60: 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
5f70: 20 76 6f 63 61 62 75 6c 61 72 79 5c 6e 22 0a 20   vocabulary\n". 
5f80: 20 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d   );.  exit(1);.}
5f90: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
5fa0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
5fb0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
5fc0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
5fd0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a  nst char *zTab;.
5fe0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5ff0: 6d 64 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c  md;..  if( argc<
6000: 32 20 29 20 75 73 61 67 65 28 61 72 67 76 5b 30  2 ) usage(argv[0
6010: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
6020: 65 33 5f 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c  e3_open(argv[1],
6030: 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20   &db);.  if( rc 
6040: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
6050: 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 6f  tderr, "Cannot o
6060: 70 65 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b  pen %s\n", argv[
6070: 31 5d 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  1]);.    exit(1)
6080: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  ;.  }.  if( argc
6090: 3d 3d 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==2 ){.    sqlit
60a0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
60b0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
60c0: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65  .    pStmt = pre
60d0: 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45 43 54  pare(db, "SELECT
60e0: 20 62 2e 73 71 6c 22 0a 20 20 20 20 20 20 20 20   b.sql".        
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 22 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  "  FROM sqlite_m
6110: 61 73 74 65 72 20 61 2c 20 73 71 6c 69 74 65 5f  aster a, sqlite_
6120: 6d 61 73 74 65 72 20 62 22 0a 20 20 20 20 20 20  master b".      
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 22 20 57 48 45 52 45 20 61 2e 6e 61 6d 65    " WHERE a.name
6150: 20 47 4c 4f 42 20 27 2a 5f 73 65 67 64 69 72 27   GLOB '*_segdir'
6160: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
6170: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
6180: 44 20 62 2e 6e 61 6d 65 3d 73 75 62 73 74 72 28  D b.name=substr(
6190: 61 2e 6e 61 6d 65 2c 31 2c 6c 65 6e 67 74 68 28  a.name,1,length(
61a0: 61 2e 6e 61 6d 65 29 2d 37 29 22 0a 20 20 20 20  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 22 20 4f 52 44 45 52 20 42 59 20 31      " ORDER BY 1
61d0: 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73  ");.    while( s
61e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
61f0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
6200: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
6210: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 3b       printf("%s;
6220: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
6230: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
6240: 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0));.    }.    s
6250: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
6260: 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
6270: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  cnt==0 ){.      
6280: 70 72 69 6e 74 66 28 22 2f 2a 20 4e 6f 20 46 54  printf("/* No FT
6290: 53 33 2f 34 20 74 61 62 6c 65 73 20 66 6f 75 6e  S3/4 tables foun
62a0: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 25 73  d in database %s
62b0: 20 2a 2f 5c 6e 22 2c 20 61 72 67 76 5b 31 5d 29   */\n", argv[1])
62c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
62d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
62e0: 61 72 67 63 3c 34 20 29 20 75 73 61 67 65 28 61  argc<4 ) usage(a
62f0: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 61 62 20  rgv[0]);.  zTab 
6300: 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 7a 43 6d  = argv[2];.  zCm
6310: 64 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 20 20 6e  d = argv[3];.  n
6320: 45 78 74 72 61 20 3d 20 61 72 67 63 2d 34 3b 0a  Extra = argc-4;.
6330: 20 20 61 7a 45 78 74 72 61 20 3d 20 61 72 67 76    azExtra = argv
6340: 2b 34 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  +4;.  if( strcmp
6350: 28 7a 43 6d 64 2c 22 62 69 67 2d 73 65 67 6d 65  (zCmd,"big-segme
6360: 6e 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nts")==0 ){.    
6370: 6c 69 73 74 42 69 67 53 65 67 6d 65 6e 74 73 28  listBigSegments(
6380: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c  db, zTab);.  }el
6390: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
63a0: 6d 64 2c 22 64 6f 63 6c 69 73 74 22 29 3d 3d 30  md,"doclist")==0
63b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 63   ){.    if( argc
63c0: 3c 37 20 29 20 75 73 61 67 65 28 61 72 67 76 5b  <7 ) usage(argv[
63d0: 30 5d 29 3b 0a 20 20 20 20 73 68 6f 77 44 6f 63  0]);.    showDoc
63e0: 6c 69 73 74 28 64 62 2c 20 7a 54 61 62 29 3b 0a  list(db, zTab);.
63f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
6400: 6d 70 28 7a 43 6d 64 2c 22 73 63 68 65 6d 61 22  mp(zCmd,"schema"
6410: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 68 6f 77  )==0 ){.    show
6420: 53 63 68 65 6d 61 28 64 62 2c 20 7a 54 61 62 29  Schema(db, zTab)
6430: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
6440: 72 63 6d 70 28 7a 43 6d 64 2c 22 73 65 67 64 69  rcmp(zCmd,"segdi
6450: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 68  r")==0 ){.    sh
6460: 6f 77 53 65 67 64 69 72 4d 61 70 28 64 62 2c 20  owSegdirMap(db, 
6470: 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zTab);.  }else i
6480: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22  f( strcmp(zCmd,"
6490: 73 65 67 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a  segment")==0 ){.
64a0: 20 20 20 20 69 66 28 20 61 72 67 63 3c 35 20 29      if( argc<5 )
64b0: 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b   usage(argv[0]);
64c0: 0a 20 20 20 20 73 68 6f 77 53 65 67 6d 65 6e 74  .    showSegment
64d0: 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65  (db, zTab);.  }e
64e0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
64f0: 43 6d 64 2c 22 73 65 67 6d 65 6e 74 2d 73 74 61  Cmd,"segment-sta
6500: 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ts")==0 ){.    s
6510: 68 6f 77 53 65 67 6d 65 6e 74 53 74 61 74 73 28  howSegmentStats(
6520: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c  db, zTab);.  }el
6530: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  se if( strcmp(zC
6540: 6d 64 2c 22 73 74 61 74 22 29 3d 3d 30 20 29 7b  md,"stat")==0 ){
6550: 0a 20 20 20 20 73 68 6f 77 53 74 61 74 28 64 62  .    showStat(db
6560: 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  , zTab);.  }else
6570: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6580: 2c 22 76 6f 63 61 62 75 6c 61 72 79 22 29 3d 3d  ,"vocabulary")==
6590: 30 20 29 7b 0a 20 20 20 20 73 68 6f 77 56 6f 63  0 ){.    showVoc
65a0: 61 62 75 6c 61 72 79 28 64 62 2c 20 7a 54 61 62  abulary(db, zTab
65b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
65c0: 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a  usage(argv[0]);.
65d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20    }.  return 0; 
65e0: 0a 7d 0a                                         .}.