/ Hex Artifact Content
Login

Artifact 6cfc5b67a5f0e09c0d698f9fd012c784bfaa9197:


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 2a 31 30 30  gsz-45, n, n*100
2c50: 2e 30 2f 6e 4c 65 61 66 29 3b 0a 0a 20 20 70 53  .0/nLeaf);..  pS
2c60: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62  tmt = prepare(db
2c70: 2c 20 22 53 45 4c 45 43 54 20 6d 61 78 28 6c 65  , "SELECT max(le
2c80: 76 65 6c 25 25 31 30 32 34 29 20 46 52 4f 4d 20  vel%%1024) FROM 
2c90: 27 25 71 5f 73 65 67 64 69 72 27 22 2c 20 7a 54  '%q_segdir'", zT
2ca0: 61 62 29 3b 0a 20 20 6d 78 4c 65 76 65 6c 20 3d  ab);.  mxLevel =
2cb0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
2cc0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2cd0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2ce0: 20 20 20 20 6d 78 4c 65 76 65 6c 20 3d 20 73 71      mxLevel = sq
2cf0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2d00: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
2d10: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2d20: 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 20 20 66 6f  ze(pStmt);..  fo
2d30: 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 4c 65 76 65  r(i=0; i<=mxLeve
2d40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 74  l; i++){.    pSt
2d50: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
2d60: 0a 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  .           "SEL
2d70: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 73 75  ECT count(*), su
2d80: 6d 28 6c 65 6e 29 2c 20 61 76 67 28 6c 65 6e 29  m(len), avg(len)
2d90: 2c 20 6d 61 78 28 6c 65 6e 29 2c 20 73 75 6d 28  , max(len), sum(
2da0: 6c 65 6e 3e 25 64 29 2c 22 0a 20 20 20 20 20 20  len>%d),".      
2db0: 20 20 20 20 20 22 20 20 20 20 20 20 20 63 6f 75       "       cou
2dc0: 6e 74 28 64 69 73 74 69 6e 63 74 20 69 64 78 29  nt(distinct idx)
2dd0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 20  ".           "  
2de0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6c 65 6e  FROM (SELECT len
2df0: 67 74 68 28 61 2e 62 6c 6f 63 6b 29 20 41 53 20  gth(a.block) AS 
2e00: 6c 65 6e 2c 20 69 64 78 22 0a 20 20 20 20 20 20  len, idx".      
2e10: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20       "          
2e20: 46 52 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e 74  FROM '%q_segment
2e30: 73 27 20 61 20 4a 4f 49 4e 20 27 25 71 5f 73 65  s' a JOIN '%q_se
2e40: 67 64 69 72 27 20 62 22 0a 20 20 20 20 20 20 20  gdir' b".       
2e50: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 57 48      "         WH
2e60: 45 52 45 20 28 61 2e 62 6c 6f 63 6b 69 64 20 42  ERE (a.blockid B
2e70: 45 54 57 45 45 4e 20 62 2e 73 74 61 72 74 5f 62  ETWEEN b.start_b
2e80: 6c 6f 63 6b 22 0a 20 20 20 20 20 20 20 20 20 20  lock".          
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41               " A
2eb0: 4e 44 20 62 2e 6c 65 61 76 65 73 5f 65 6e 64 5f  ND b.leaves_end_
2ec0: 62 6c 6f 63 6b 29 22 0a 20 20 20 20 20 20 20 20  block)".        
2ed0: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 41     "           A
2ee0: 4e 44 20 28 62 2e 6c 65 76 65 6c 25 25 31 30 32  ND (b.level%%102
2ef0: 34 29 3d 3d 25 64 29 22 2c 0a 20 20 20 20 20 20  4)==%d)",.      
2f00: 20 20 20 20 20 70 67 73 7a 2d 34 35 2c 20 7a 54       pgsz-45, zT
2f10: 61 62 2c 20 7a 54 61 62 2c 20 69 29 3b 0a 20 20  ab, zTab, i);.  
2f20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2f30: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
2f40: 45 5f 52 4f 57 0a 20 20 20 20 20 26 26 20 28 6e  E_ROW.     && (n
2f50: 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63  Leaf = sqlite3_c
2f60: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2f70: 20 30 29 29 3e 30 0a 20 20 20 20 29 7b 0a 20 20   0))>0.    ){.  
2f80: 20 20 20 20 69 6e 74 20 6e 49 64 78 20 3d 20 73      int nIdx = s
2f90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2fa0: 74 28 70 53 74 6d 74 2c 20 35 29 3b 0a 20 20 20  t(pStmt, 5);.   
2fb0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2fc0: 20 73 7a 3b 0a 20 20 20 20 20 20 70 72 69 6e 74   sz;.      print
2fd0: 66 28 22 46 6f 72 20 6c 65 76 65 6c 20 25 64 3a  f("For level %d:
2fe0: 5c 6e 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 70  \n", i);.      p
2ff0: 72 69 6e 74 66 28 22 20 20 4e 75 6d 62 65 72 20  rintf("  Number 
3000: 6f 66 20 69 6e 64 65 78 65 73 2e 2e 2e 2e 2e 2e  of indexes......
3010: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
3020: 20 25 39 64 5c 6e 22 2c 20 6e 49 64 78 29 3b 0a   %9d\n", nIdx);.
3030: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20        printf("  
3040: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 73  Number of leaf s
3050: 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 2e  egments.........
3060: 2e 2e 2e 2e 2e 2e 2e 20 25 39 64 5c 6e 22 2c 20  ....... %9d\n", 
3070: 6e 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66  nLeaf);.      if
3080: 28 20 6e 49 64 78 3e 31 20 29 7b 0a 20 20 20 20  ( nIdx>1 ){.    
3090: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 41 76      printf("  Av
30a0: 65 72 61 67 65 20 6c 65 61 66 20 73 65 67 6d 65  erage leaf segme
30b0: 6e 74 73 20 70 65 72 20 69 6e 64 65 78 2e 2e 2e  nts per index...
30c0: 2e 2e 2e 2e 2e 20 25 31 31 2e 31 66 5c 6e 22 2c  ..... %11.1f\n",
30d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30e0: 28 64 6f 75 62 6c 65 29 6e 4c 65 61 66 2f 28 64  (double)nLeaf/(d
30f0: 6f 75 62 6c 65 29 6e 49 64 78 29 3b 0a 20 20 20  ouble)nIdx);.   
3100: 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
3110: 66 28 22 20 20 54 6f 74 61 6c 20 73 69 7a 65 20  f("  Total size 
3120: 6f 66 20 61 6c 6c 20 6c 65 61 66 20 73 65 67 6d  of all leaf segm
3130: 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e 2e 20 25 39 6c  ents........ %9l
3140: 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
3150: 20 20 20 20 28 73 7a 20 3d 20 73 71 6c 69 74 65      (sz = sqlite
3160: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
3170: 53 74 6d 74 2c 20 31 29 29 29 3b 0a 20 20 20 20  Stmt, 1)));.    
3180: 20 20 70 72 69 6e 74 66 28 22 20 20 41 76 65 72    printf("  Aver
3190: 61 67 65 20 73 69 7a 65 20 6f 66 20 6c 65 61 66  age size of leaf
31a0: 20 73 65 67 6d 65 6e 74 73 2e 2e 2e 2e 2e 2e 2e   segments.......
31b0: 2e 2e 2e 20 25 31 31 2e 31 66 5c 6e 22 2c 0a 20  ... %11.1f\n",. 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
31e0: 65 28 70 53 74 6d 74 2c 20 32 29 29 3b 0a 20 20  e(pStmt, 2));.  
31f0: 20 20 20 20 69 66 28 20 6e 49 64 78 3e 31 20 29      if( nIdx>1 )
3200: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
3210: 28 22 20 20 41 76 65 72 61 67 65 20 6c 65 61 66  ("  Average leaf
3220: 20 73 65 67 6d 65 6e 74 20 73 69 7a 65 20 70 65   segment size pe
3230: 72 20 69 6e 64 65 78 2e 2e 2e 2e 20 25 31 31 2e  r index.... %11.
3240: 31 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  1f\n",.         
3250: 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 73 7a        (double)sz
3260: 2f 28 64 6f 75 62 6c 65 29 6e 49 64 78 29 3b 0a  /(double)nIdx);.
3270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
3280: 69 6e 74 66 28 22 20 20 4d 61 78 69 6d 75 6d 20  intf("  Maximum 
3290: 6c 65 61 66 20 73 65 67 6d 65 6e 74 20 73 69 7a  leaf segment siz
32a0: 65 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20  e.............. 
32b0: 25 39 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %9lld\n",.      
32c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
32d0: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
32e0: 74 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 6e 20  t, 3));.      n 
32f0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
3300: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 34 29 3b 0a  _int(pStmt, 4);.
3310: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20        printf("  
3320: 4c 65 61 66 20 73 65 67 6d 65 6e 74 73 20 6c 61  Leaf segments la
3330: 72 67 65 72 20 74 68 61 6e 20 25 35 64 20 62 79  rger than %5d by
3340: 74 65 73 2e 2e 20 25 39 64 20 20 20 25 35 2e 32  tes.. %9d   %5.2
3350: 66 25 25 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  f%%\n",.        
3360: 20 20 20 20 20 70 67 73 7a 2d 34 35 2c 20 6e 2c       pgsz-45, n,
3370: 20 6e 2a 31 30 30 2e 30 2f 6e 4c 65 61 66 29 3b   n*100.0/nLeaf);
3380: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3390: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
33a0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
33b0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
33c0: 22 74 72 65 65 22 20 6c 69 6e 65 20 6f 66 20 74  "tree" line of t
33d0: 68 65 20 73 65 67 64 69 72 20 6d 61 70 20 6f 75  he segdir map ou
33e0: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
33f0: 76 6f 69 64 20 70 72 69 6e 74 54 72 65 65 4c 69  void printTreeLi
3400: 6e 65 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ne(sqlite3_int64
3410: 20 69 4c 6f 77 65 72 2c 20 73 71 6c 69 74 65 33   iLower, sqlite3
3420: 5f 69 6e 74 36 34 20 69 55 70 70 65 72 29 7b 0a  _int64 iUpper){.
3430: 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20    printf("      
3440: 20 20 20 20 20 20 20 20 20 20 20 74 72 65 65 20             tree 
3450: 20 20 25 39 6c 6c 64 22 2c 20 69 4c 6f 77 65 72    %9lld", iLower
3460: 29 3b 0a 20 20 69 66 28 20 69 55 70 70 65 72 3e  );.  if( iUpper>
3470: 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 70 72  iLower ){.    pr
3480: 69 6e 74 66 28 22 20 74 68 72 75 20 25 39 6c 6c  intf(" thru %9ll
3490: 64 20 20 28 25 6c 6c 64 20 62 6c 6f 63 6b 73 29  d  (%lld blocks)
34a0: 22 2c 20 69 55 70 70 65 72 2c 20 69 55 70 70 65  ", iUpper, iUppe
34b0: 72 2d 69 4c 6f 77 65 72 2b 31 29 3b 0a 20 20 7d  r-iLower+1);.  }
34c0: 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b  .  printf("\n");
34d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
34e0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 62 6c  to see if the bl
34f0: 6f 63 6b 20 6f 66 20 61 20 25 5f 73 65 67 6d 65  ock of a %_segme
3500: 6e 74 73 20 65 6e 74 72 79 20 69 73 20 4e 55 4c  nts entry is NUL
3510: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L..*/.static int
3520: 20 69 73 4e 75 6c 6c 53 65 67 6d 65 6e 74 28 73   isNullSegment(s
3530: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
3540: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 73 71  t char *zTab, sq
3550: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
3560: 63 6b 49 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  ckId){.  sqlite3
3570: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
3580: 69 6e 74 20 72 63 20 3d 20 31 3b 0a 0a 20 20 70  int rc = 1;..  p
3590: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64  Stmt = prepare(d
35a0: 62 2c 20 22 53 45 4c 45 43 54 20 62 6c 6f 63 6b  b, "SELECT block
35b0: 20 49 53 20 4e 55 4c 4c 20 46 52 4f 4d 20 27 25   IS NULL FROM '%
35c0: 71 5f 73 65 67 6d 65 6e 74 73 27 22 0a 20 20 20  q_segments'".   
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 22 20 57 48 45 52 45 20 62 6c 6f 63 6b     " WHERE block
35f0: 69 64 3d 25 6c 6c 64 22 2c 20 7a 54 61 62 2c 20  id=%lld", zTab, 
3600: 69 42 6c 6f 63 6b 49 64 29 3b 0a 20 20 69 66 28  iBlockId);.  if(
3610: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
3620: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
3630: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
3640: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
3650: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
3660: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3670: 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  e(pStmt);.  retu
3680: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3690: 53 68 6f 77 20 61 20 6d 61 70 20 6f 66 20 73 65  Show a map of se
36a0: 67 6d 65 6e 74 73 20 64 65 72 69 76 65 64 20 66  gments derived f
36b0: 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69 72  rom the %_segdir
36c0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
36d0: 63 20 76 6f 69 64 20 73 68 6f 77 53 65 67 64 69  c void showSegdi
36e0: 72 4d 61 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rMap(sqlite3 *db
36f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
3700: 61 62 29 7b 0a 20 20 69 6e 74 20 6d 78 49 6e 64  ab){.  int mxInd
3710: 65 78 2c 20 69 49 6e 64 65 78 3b 0a 20 20 73 71  ex, iIndex;.  sq
3720: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
3730: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
3740: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 32 20 3d 20  _stmt *pStmt2 = 
3750: 30 3b 0a 20 20 69 6e 74 20 70 72 65 76 4c 65 76  0;.  int prevLev
3760: 65 6c 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 70  el;..  pStmt = p
3770: 72 65 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45  repare(db, "SELE
3780: 43 54 20 6d 61 78 28 6c 65 76 65 6c 2f 31 30 32  CT max(level/102
3790: 34 29 20 46 52 4f 4d 20 27 25 71 5f 73 65 67 64  4) FROM '%q_segd
37a0: 69 72 27 22 2c 20 7a 54 61 62 29 3b 0a 20 20 69  ir'", zTab);.  i
37b0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
37c0: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
37d0: 4f 57 20 29 7b 0a 20 20 20 20 6d 78 49 6e 64 65  OW ){.    mxInde
37e0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
37f0: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
3800: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
3810: 78 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  xIndex = 0;.  }.
3820: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
3830: 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 20 20 70 72  ze(pStmt);..  pr
3840: 69 6e 74 66 28 22 4e 75 6d 62 65 72 20 6f 66 20  intf("Number of 
3850: 69 6e 76 65 72 74 65 64 20 69 6e 64 69 63 65 73  inverted indices
3860: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 20  ............... 
3870: 25 33 64 5c 6e 22 2c 20 6d 78 49 6e 64 65 78 2b  %3d\n", mxIndex+
3880: 31 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 72  1);.  pStmt = pr
3890: 65 70 61 72 65 28 64 62 2c 0a 20 20 20 20 22 53  epare(db,.    "S
38a0: 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78  ELECT level, idx
38b0: 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c  , start_block, l
38c0: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c  eaves_end_block,
38d0: 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 77 69   end_block, rowi
38e0: 64 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 27  d".    "  FROM '
38f0: 25 71 5f 73 65 67 64 69 72 27 22 0a 20 20 20 20  %q_segdir'".    
3900: 22 20 57 48 45 52 45 20 6c 65 76 65 6c 2f 31 30  " WHERE level/10
3910: 32 34 3d 3d 3f 22 0a 20 20 20 20 22 20 4f 52 44  24==?".    " ORD
3920: 45 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43  ER BY level DESC
3930: 2c 20 69 64 78 22 2c 0a 20 20 20 20 7a 54 61 62  , idx",.    zTab
3940: 29 3b 0a 20 20 70 53 74 6d 74 32 20 3d 20 70 72  );.  pStmt2 = pr
3950: 65 70 61 72 65 28 64 62 2c 0a 20 20 20 20 22 53  epare(db,.    "S
3960: 45 4c 45 43 54 20 62 6c 6f 63 6b 69 64 20 46 52  ELECT blockid FR
3970: 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  OM '%q_segments'
3980: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 62 6c  ".    " WHERE bl
3990: 6f 63 6b 69 64 20 42 45 54 57 45 45 4e 20 3f 20  ockid BETWEEN ? 
39a0: 41 4e 44 20 3f 20 4f 52 44 45 52 20 42 59 20 62  AND ? ORDER BY b
39b0: 6c 6f 63 6b 69 64 22 2c 0a 20 20 20 20 7a 54 61  lockid",.    zTa
39c0: 62 29 3b 0a 20 20 66 6f 72 28 69 49 6e 64 65 78  b);.  for(iIndex
39d0: 3d 30 3b 20 69 49 6e 64 65 78 3c 3d 6d 78 49 6e  =0; iIndex<=mxIn
39e0: 64 65 78 3b 20 69 49 6e 64 65 78 2b 2b 29 7b 0a  dex; iIndex++){.
39f0: 20 20 20 20 69 66 28 20 6d 78 49 6e 64 65 78 3e      if( mxIndex>
3a00: 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  0 ){.      print
3a10: 66 28 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f("*************
3a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3a30: 49 6e 64 65 78 20 25 64 20 22 0a 20 20 20 20 20  Index %d ".     
3a40: 20 20 20 20 20 20 20 20 22 2a 2a 2a 2a 2a 2a 2a          "*******
3a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a60: 2a 2a 2a 2a 2a 5c 6e 22 2c 20 69 49 6e 64 65 78  *****\n", iIndex
3a70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
3a80: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
3a90: 74 6d 74 2c 20 31 2c 20 69 49 6e 64 65 78 29 3b  tmt, 1, iIndex);
3aa0: 0a 20 20 20 20 70 72 65 76 4c 65 76 65 6c 20 3d  .    prevLevel =
3ab0: 20 2d 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20   -1;.    while( 
3ac0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
3ad0: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
3ae0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 65  ){.      int iLe
3af0: 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  vel = sqlite3_co
3b00: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
3b10: 30 29 25 31 30 32 34 3b 0a 20 20 20 20 20 20 69  0)%1024;.      i
3b20: 6e 74 20 69 49 64 78 20 3d 20 73 71 6c 69 74 65  nt iIdx = sqlite
3b30: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
3b40: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  mt, 1);.      sq
3b50: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61  lite3_int64 iSta
3b60: 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rt = sqlite3_col
3b70: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
3b80: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
3b90: 65 33 5f 69 6e 74 36 34 20 69 4c 45 6e 64 20 3d  e3_int64 iLEnd =
3ba0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3bb0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 29 3b  int64(pStmt, 3);
3bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
3bd0: 6e 74 36 34 20 69 45 6e 64 20 3d 20 73 71 6c 69  nt64 iEnd = sqli
3be0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
3bf0: 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20  (pStmt, 4);.    
3c00: 20 20 63 68 61 72 20 72 74 61 67 5b 32 30 5d 3b    char rtag[20];
3c10: 0a 20 20 20 20 20 20 69 66 28 20 69 4c 65 76 65  .      if( iLeve
3c20: 6c 21 3d 70 72 65 76 4c 65 76 65 6c 20 29 7b 0a  l!=prevLevel ){.
3c30: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
3c40: 6c 65 76 65 6c 20 25 32 64 20 69 64 78 20 25 32  level %2d idx %2
3c50: 64 22 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78  d", iLevel, iIdx
3c60: 29 3b 0a 20 20 20 20 20 20 20 20 70 72 65 76 4c  );.        prevL
3c70: 65 76 65 6c 20 3d 20 69 4c 65 76 65 6c 3b 0a 20  evel = iLevel;. 
3c80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3c90: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20      printf("    
3ca0: 20 20 20 20 20 69 64 78 20 25 32 64 22 2c 20 69       idx %2d", i
3cb0: 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Idx);.      }.  
3cc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3cd0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 72 74 61 67  intf(sizeof(rtag
3ce0: 29 2c 20 72 74 61 67 2c 20 22 72 25 6c 6c 64 22  ), rtag, "r%lld"
3cf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3d00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3d10: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
3d20: 74 6d 74 2c 35 29 29 3b 0a 20 20 20 20 20 20 70  tmt,5));.      p
3d30: 72 69 6e 74 66 28 22 20 20 72 6f 6f 74 20 20 20  rintf("  root   
3d40: 25 39 73 5c 6e 22 2c 20 72 74 61 67 29 3b 0a 20  %9s\n", rtag);. 
3d50: 20 20 20 20 20 69 66 28 20 69 4c 45 6e 64 3e 69       if( iLEnd>i
3d60: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
3d70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
3d80: 4c 6f 77 65 72 2c 20 69 50 72 65 76 2c 20 69 58  Lower, iPrev, iX
3d90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  ;.        if( iL
3da0: 45 6e 64 2b 31 3c 3d 69 45 6e 64 20 29 7b 0a 20  End+1<=iEnd ){. 
3db0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3dc0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
3dd0: 74 32 2c 20 31 2c 20 69 4c 45 6e 64 2b 31 29 3b  t2, 1, iLEnd+1);
3de0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3df0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
3e00: 74 6d 74 32 2c 20 32 2c 20 69 45 6e 64 29 3b 0a  tmt2, 2, iEnd);.
3e10: 20 20 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72            iLower
3e20: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 0a 20   = -1;        . 
3e30: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
3e40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
3e50: 6d 74 32 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  mt2)==SQLITE_ROW
3e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3e70: 69 58 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  iX = sqlite3_col
3e80: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 32  umn_int64(pStmt2
3e90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
3ea0: 20 20 69 66 28 20 69 4c 6f 77 65 72 3c 30 20 29    if( iLower<0 )
3eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3ec0: 69 4c 6f 77 65 72 20 3d 20 69 50 72 65 76 20 3d  iLower = iPrev =
3ed0: 20 69 58 3b 0a 20 20 20 20 20 20 20 20 20 20 20   iX;.           
3ee0: 20 7d 65 6c 73 65 20 69 66 28 20 69 58 3d 3d 69   }else if( iX==i
3ef0: 50 72 65 76 2b 31 20 29 7b 0a 20 20 20 20 20 20  Prev+1 ){.      
3f00: 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20          iPrev = 
3f10: 69 58 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  iX;.            
3f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3f30: 20 20 20 20 20 70 72 69 6e 74 54 72 65 65 4c 69       printTreeLi
3f40: 6e 65 28 69 4c 6f 77 65 72 2c 20 69 50 72 65 76  ne(iLower, iPrev
3f50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3f60: 20 69 4c 6f 77 65 72 20 3d 20 69 50 72 65 76 20   iLower = iPrev 
3f70: 3d 20 69 58 3b 0a 20 20 20 20 20 20 20 20 20 20  = iX;.          
3f80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
3f90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3fa0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 32 29 3b  3_reset(pStmt2);
3fb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
3fc0: 4c 6f 77 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20  Lower>=0 ){.    
3fd0: 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 6f 77          if( iLow
3fe0: 65 72 3d 3d 69 50 72 65 76 20 26 26 20 69 4c 6f  er==iPrev && iLo
3ff0: 77 65 72 3d 3d 69 45 6e 64 0a 20 20 20 20 20 20  wer==iEnd.      
4000: 20 20 20 20 20 20 20 26 26 20 69 73 4e 75 6c 6c         && isNull
4010: 53 65 67 6d 65 6e 74 28 64 62 2c 7a 54 61 62 2c  Segment(db,zTab,
4020: 69 4c 6f 77 65 72 29 0a 20 20 20 20 20 20 20 20  iLower).        
4030: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
4040: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20       printf("   
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
4060: 6c 6c 20 20 20 25 39 6c 6c 64 5c 6e 22 2c 20 69  ll   %9lld\n", i
4070: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
4080: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4090: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 54 72           printTr
40a0: 65 65 4c 69 6e 65 28 69 4c 6f 77 65 72 2c 20 69  eeLine(iLower, i
40b0: 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20  Prev);.         
40c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
40d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
40e0: 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20     printf("     
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 61 76              leav
4100: 65 73 20 25 39 6c 6c 64 20 74 68 72 75 20 25 39  es %9lld thru %9
4110: 6c 6c 64 20 20 28 25 6c 6c 64 20 62 6c 6f 63 6b  lld  (%lld block
4120: 73 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s)\n",.         
4130: 20 20 20 20 20 20 69 53 74 61 72 74 2c 20 69 4c        iStart, iL
4140: 45 6e 64 2c 20 69 4c 45 6e 64 20 2d 20 69 53 74  End, iLEnd - iSt
4150: 61 72 74 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  art + 1);.      
4160: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4170: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
4180: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
4190: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
41a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
41b0: 69 7a 65 28 70 53 74 6d 74 32 29 3b 0a 7d 0a 0a  ize(pStmt2);.}..
41c0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73  /*.** Decode a s
41d0: 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 6c  ingle segment bl
41e0: 6f 63 6b 20 61 6e 64 20 64 69 73 70 6c 61 79 20  ock and display 
41f0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 6e 20 73  the results on s
4200: 74 64 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tdout..*/.static
4210: 20 76 6f 69 64 20 64 65 63 6f 64 65 53 65 67 6d   void decodeSegm
4220: 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ent(.  const uns
4230: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
4240: 61 2c 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20  a,   /* Content 
4250: 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e  to print */.  in
4260: 74 20 6e 44 61 74 61 20 20 20 20 20 20 20 20 20  t nData         
4270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4280: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
4290: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a  f content */.){.
42a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
42b0: 69 43 68 69 6c 64 3b 0a 20 20 73 71 6c 69 74 65  iChild;.  sqlite
42c0: 33 5f 69 6e 74 36 34 20 69 50 72 65 66 69 78 3b  3_int64 iPrefix;
42d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
42e0: 20 6e 54 65 72 6d 3b 0a 20 20 73 71 6c 69 74 65   nTerm;.  sqlite
42f0: 33 5f 69 6e 74 36 34 20 6e 3b 0a 20 20 73 71 6c  3_int64 n;.  sql
4300: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 73  ite3_int64 iDocs
4310: 7a 3b 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  z;.  int iHeight
4320: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ;.  int i = 0;. 
4330: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
4340: 63 68 61 72 20 7a 54 65 72 6d 5b 31 30 30 30 5d  char zTerm[1000]
4350: 3b 0a 0a 20 20 69 20 2b 3d 20 67 65 74 56 61 72  ;..  i += getVar
4360: 69 6e 74 28 61 44 61 74 61 2c 20 26 6e 29 3b 0a  int(aData, &n);.
4370: 20 20 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74    iHeight = (int
4380: 29 6e 3b 0a 20 20 70 72 69 6e 74 66 28 22 68 65  )n;.  printf("he
4390: 69 67 68 74 3a 20 25 64 5c 6e 22 2c 20 69 48 65  ight: %d\n", iHe
43a0: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 69 48 65  ight);.  if( iHe
43b0: 69 67 68 74 3e 30 20 29 7b 0a 20 20 20 20 69 20  ight>0 ){.    i 
43c0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 44 61  += getVarint(aDa
43d0: 74 61 2b 69 2c 20 26 69 43 68 69 6c 64 29 3b 0a  ta+i, &iChild);.
43e0: 20 20 20 20 70 72 69 6e 74 66 28 22 6c 65 66 74      printf("left
43f0: 2d 63 68 69 6c 64 3a 20 25 6c 6c 64 5c 6e 22 2c  -child: %lld\n",
4400: 20 69 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 20 20   iChild);.  }.  
4410: 77 68 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29  while( i<nData )
4420: 7b 0a 20 20 20 20 69 66 28 20 28 63 6e 74 2b 2b  {.    if( (cnt++
4430: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 20 2b  )>0 ){.      i +
4440: 3d 20 67 65 74 56 61 72 69 6e 74 28 61 44 61 74  = getVarint(aDat
4450: 61 2b 69 2c 20 26 69 50 72 65 66 69 78 29 3b 0a  a+i, &iPrefix);.
4460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4470: 20 69 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20   iPrefix = 0;.  
4480: 20 20 7d 0a 20 20 20 20 69 20 2b 3d 20 67 65 74    }.    i += get
4490: 56 61 72 69 6e 74 28 61 44 61 74 61 2b 69 2c 20  Varint(aData+i, 
44a0: 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  &nTerm);.    if(
44b0: 20 69 50 72 65 66 69 78 2b 6e 54 65 72 6d 2b 31   iPrefix+nTerm+1
44c0: 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 54 65 72 6d   >= sizeof(zTerm
44d0: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
44e0: 74 66 28 73 74 64 65 72 72 2c 20 22 74 65 72 6d  tf(stderr, "term
44f0: 20 74 6f 20 6c 6f 6e 67 5c 6e 22 29 3b 0a 20 20   to long\n");.  
4500: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
4510: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54   }.    memcpy(zT
4520: 65 72 6d 2b 69 50 72 65 66 69 78 2c 20 61 44 61  erm+iPrefix, aDa
4530: 74 61 2b 69 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  ta+i, nTerm);.  
4540: 20 20 7a 54 65 72 6d 5b 69 50 72 65 66 69 78 2b    zTerm[iPrefix+
4550: 6e 54 65 72 6d 5d 20 3d 20 30 3b 0a 20 20 20 20  nTerm] = 0;.    
4560: 69 20 2b 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  i += nTerm;.    
4570: 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30 20 29  if( iHeight==0 )
4580: 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74  {.      i += get
4590: 56 61 72 69 6e 74 28 61 44 61 74 61 2b 69 2c 20  Varint(aData+i, 
45a0: 26 69 44 6f 63 73 7a 29 3b 0a 20 20 20 20 20 20  &iDocsz);.      
45b0: 70 72 69 6e 74 66 28 22 74 65 72 6d 3a 20 25 2d  printf("term: %-
45c0: 32 35 73 20 64 6f 63 6c 69 73 74 20 25 37 6c 6c  25s doclist %7ll
45d0: 64 20 62 79 74 65 73 20 6f 66 66 73 65 74 20 25  d bytes offset %
45e0: 64 5c 6e 22 2c 20 7a 54 65 72 6d 2c 20 69 44 6f  d\n", zTerm, iDo
45f0: 63 73 7a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  csz, i);.      i
4600: 20 2b 3d 20 69 44 6f 63 73 7a 3b 0a 20 20 20 20   += iDocsz;.    
4610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 69  }else{.      pri
4620: 6e 74 66 28 22 74 65 72 6d 3a 20 25 2d 32 35 73  ntf("term: %-25s
4630: 20 63 68 69 6c 64 20 25 6c 6c 64 5c 6e 22 2c 20   child %lld\n", 
4640: 7a 54 65 72 6d 2c 20 2b 2b 69 43 68 69 6c 64 29  zTerm, ++iChild)
4650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 20 20  ;.    }.  }.}.  
4660: 0a 20 20 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .  ./*.** Print 
4670: 61 20 61 20 62 6c 6f 62 20 61 73 20 68 65 78 20  a a blob as hex 
4680: 61 6e 64 20 61 73 63 69 69 2e 0a 2a 2f 0a 73 74  and ascii..*/.st
4690: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 42  atic void printB
46a0: 6c 6f 62 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  lob(.  const uns
46b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
46c0: 61 2c 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20  a,   /* Content 
46d0: 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 69 6e  to print */.  in
46e0: 74 20 6e 44 61 74 61 20 20 20 20 20 20 20 20 20  t nData         
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4700: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
4710: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a  f content */.){.
4720: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f    int i, j;.  co
4730: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 66 73 74 46  nst char *zOfstF
4740: 6d 74 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  mt;.  const int 
4750: 70 65 72 4c 69 6e 65 20 3d 20 31 36 3b 0a 0a 20  perLine = 16;.. 
4760: 20 69 66 28 20 28 6e 44 61 74 61 26 7e 30 78 66   if( (nData&~0xf
4770: 66 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f  ff)==0 ){.    zO
4780: 66 73 74 46 6d 74 20 3d 20 22 20 25 30 33 78 3a  fstFmt = " %03x:
4790: 20 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   ";.  }else if( 
47a0: 28 6e 44 61 74 61 26 7e 30 78 66 66 66 66 29 3d  (nData&~0xffff)=
47b0: 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46  =0 ){.    zOfstF
47c0: 6d 74 20 3d 20 22 20 25 30 34 78 3a 20 22 3b 0a  mt = " %04x: ";.
47d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6e 44 61    }else if( (nDa
47e0: 74 61 26 7e 30 78 66 66 66 66 66 29 3d 3d 30 20  ta&~0xfffff)==0 
47f0: 29 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20  ){.    zOfstFmt 
4800: 3d 20 22 20 25 30 35 78 3a 20 22 3b 0a 20 20 7d  = " %05x: ";.  }
4810: 65 6c 73 65 20 69 66 28 20 28 6e 44 61 74 61 26  else if( (nData&
4820: 7e 30 78 66 66 66 66 66 66 29 3d 3d 30 20 29 7b  ~0xffffff)==0 ){
4830: 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74 20 3d 20  .    zOfstFmt = 
4840: 22 20 25 30 36 78 3a 20 22 3b 0a 20 20 7d 65 6c  " %06x: ";.  }el
4850: 73 65 7b 0a 20 20 20 20 7a 4f 66 73 74 46 6d 74  se{.    zOfstFmt
4860: 20 3d 20 22 20 25 30 38 78 3a 20 22 3b 0a 20 20   = " %08x: ";.  
4870: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
4880: 6e 44 61 74 61 3b 20 69 20 2b 3d 20 70 65 72 4c  nData; i += perL
4890: 69 6e 65 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ine){.    fprint
48a0: 66 28 73 74 64 6f 75 74 2c 20 7a 4f 66 73 74 46  f(stdout, zOfstF
48b0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 66 6f 72 28  mt, i);.    for(
48c0: 6a 3d 30 3b 20 6a 3c 70 65 72 4c 69 6e 65 3b 20  j=0; j<perLine; 
48d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
48e0: 69 2b 6a 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20  i+j>nData ){.   
48f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
4900: 6f 75 74 2c 20 22 20 20 20 22 29 3b 0a 20 20 20  out, "   ");.   
4910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4920: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
4930: 2c 22 25 30 32 78 20 22 2c 20 61 44 61 74 61 5b  ,"%02x ", aData[
4940: 69 2b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i+j]);.      }. 
4950: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
4960: 3b 20 6a 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b  ; j<perLine; j++
4970: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 2b 6a  ){.      if( i+j
4980: 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  >nData ){.      
4990: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
49a0: 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 7d 65  , " ");.      }e
49b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
49c0: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 63 22  intf(stdout,"%c"
49d0: 2c 20 69 73 70 72 69 6e 74 28 61 44 61 74 61 5b  , isprint(aData[
49e0: 69 2b 6a 5d 29 20 3f 20 61 44 61 74 61 5b 69 2b  i+j]) ? aData[i+
49f0: 6a 5d 20 3a 20 27 2e 27 29 3b 0a 20 20 20 20 20  j] : '.');.     
4a00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72   }.    }.    fpr
4a10: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 5c 6e 22  intf(stdout,"\n"
4a20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4a30: 43 6f 6e 76 65 72 74 20 74 65 78 74 20 74 6f 20  Convert text to 
4a40: 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
4a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
4a60: 65 33 5f 69 6e 74 36 34 20 61 74 6f 69 36 34 28  e3_int64 atoi64(
4a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
4a80: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4a90: 76 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  v = 0;.  while( 
4aa0: 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
4ab0: 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 76  ]<='9' ){.     v
4ac0: 20 3d 20 76 2a 31 30 20 2b 20 7a 5b 30 5d 20 2d   = v*10 + z[0] -
4ad0: 20 27 30 27 3b 0a 20 20 20 20 20 7a 2b 2b 3b 0a   '0';.     z++;.
4ae0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
4af0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4b00: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
4b10: 6d 65 6e 74 20 77 68 69 63 68 2c 20 77 68 65 6e  ment which, when
4b20: 20 73 74 65 70 70 65 64 2c 20 77 69 6c 6c 20 72   stepped, will r
4b30: 65 74 75 72 6e 20 69 6e 20 69 74 73 0a 2a 2a 20  eturn in its.** 
4b40: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 74 68 65  first column the
4b50: 20 62 6c 6f 62 20 61 73 73 6f 63 69 61 74 65 64   blob associated
4b60: 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20 7a 49   with segment zI
4b70: 64 2e 20 20 49 66 20 7a 49 64 20 62 65 67 69 6e  d.  If zId begin
4b80: 73 20 77 69 74 68 0a 2a 2a 20 27 72 27 20 74 68  s with.** 'r' th
4b90: 65 6e 20 69 74 20 69 73 20 61 20 72 6f 77 69 64  en it is a rowid
4ba0: 20 6f 66 20 61 20 25 5f 73 65 67 64 69 72 20 65   of a %_segdir e
4bb0: 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65  ntry.  Otherwise
4bc0: 20 69 74 20 69 73 20 61 0a 2a 2a 20 25 5f 73 65   it is a.** %_se
4bd0: 67 6d 65 6e 74 20 65 6e 74 72 79 2e 0a 2a 2f 0a  gment entry..*/.
4be0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
4bf0: 74 6d 74 20 2a 70 72 65 70 61 72 65 54 6f 47 65  tmt *prepareToGe
4c00: 74 53 65 67 6d 65 6e 74 28 0a 20 20 73 71 6c 69  tSegment(.  sqli
4c10: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
4c20: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
4c30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4c40: 20 2a 7a 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *zTab,    /* Th
4c50: 65 20 46 54 53 33 2f 34 20 74 61 62 6c 65 20 6e  e FTS3/4 table n
4c60: 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
4c70: 68 61 72 20 2a 7a 49 64 20 20 20 20 20 20 2f 2a  har *zId      /*
4c80: 20 49 44 20 6f 66 20 74 68 65 20 73 65 67 6d 65   ID of the segme
4c90: 6e 74 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 29 7b  nt to open */.){
4ca0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4cb0: 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20 7a 49  *pStmt;.  if( zI
4cc0: 64 5b 30 5d 3d 3d 27 72 27 20 29 7b 0a 20 20 20  d[0]=='r' ){.   
4cd0: 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65   pStmt = prepare
4ce0: 28 64 62 2c 20 22 53 45 4c 45 43 54 20 72 6f 6f  (db, "SELECT roo
4cf0: 74 20 46 52 4f 4d 20 27 25 71 5f 73 65 67 64 69  t FROM '%q_segdi
4d00: 72 27 20 57 48 45 52 45 20 72 6f 77 69 64 3d 25  r' WHERE rowid=%
4d10: 6c 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lld",.          
4d20: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c 20            zTab, 
4d30: 61 74 6f 69 36 34 28 7a 49 64 2b 31 29 29 3b 0a  atoi64(zId+1));.
4d40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
4d50: 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64 62 2c  mt = prepare(db,
4d60: 20 22 53 45 4c 45 43 54 20 62 6c 6f 63 6b 20 46   "SELECT block F
4d70: 52 4f 4d 20 27 25 71 5f 73 65 67 6d 65 6e 74 73  ROM '%q_segments
4d80: 27 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 3d  ' WHERE blockid=
4d90: 25 6c 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20  %lld",.         
4da0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c             zTab,
4db0: 20 61 74 6f 69 36 34 28 7a 49 64 29 29 3b 0a 20   atoi64(zId));. 
4dc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 74 6d   }.  return pStm
4dd0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  t;.}../*.** Prin
4de0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
4df0: 20 61 20 73 65 67 6d 65 6e 74 20 6f 72 20 6f 66   a segment or of
4e00: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 73   the root of a s
4e10: 65 67 64 69 72 2e 20 20 54 68 65 20 73 65 67 6d  egdir.  The segm
4e20: 65 6e 74 0a 2a 2a 20 6f 72 20 72 6f 6f 74 20 69  ent.** or root i
4e30: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
4e40: 61 7a 45 78 74 72 61 5b 30 5d 2e 20 20 49 66 20  azExtra[0].  If 
4e50: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
4e60: 74 65 72 20 6f 66 20 61 7a 45 78 74 72 61 5b 30  ter of azExtra[0
4e70: 5d 0a 2a 2a 20 69 73 20 27 72 27 20 74 68 65 6e  ].** is 'r' then
4e80: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69   the remainder i
4e90: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f  s the integer ro
4ea0: 77 69 64 20 6f 66 20 74 68 65 20 25 5f 73 65 67  wid of the %_seg
4eb0: 64 69 72 20 65 6e 74 72 79 2e 0a 2a 2a 20 49 66  dir entry..** If
4ec0: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
4ed0: 63 74 65 72 20 6f 66 20 61 7a 45 78 74 72 61 5b  cter of azExtra[
4ee0: 30 5d 20 69 73 20 6e 6f 74 20 27 72 27 20 74 68  0] is not 'r' th
4ef0: 65 6e 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 66 0a  en, then all of.
4f00: 2a 2a 20 61 7a 45 78 74 72 61 5b 30 5d 20 69 73  ** azExtra[0] is
4f10: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
4f20: 68 20 69 73 20 74 68 65 20 62 6c 6f 63 6b 20 6e  h is the block n
4f30: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  umber..**.** If 
4f40: 74 68 65 20 2d 2d 72 61 77 20 6f 70 74 69 6f 6e  the --raw option
4f50: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 61   is present in a
4f60: 7a 45 78 74 72 61 2c 20 74 68 65 6e 20 61 20 68  zExtra, then a h
4f70: 65 78 20 64 75 6d 70 20 69 73 20 70 72 6f 76 69  ex dump is provi
4f80: 64 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ded..** Otherwis
4f90: 65 20 61 20 64 65 63 6f 64 69 6e 67 20 69 73 20  e a decoding is 
4fa0: 73 68 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  shown..*/.static
4fb0: 20 76 6f 69 64 20 73 68 6f 77 53 65 67 6d 65 6e   void showSegmen
4fc0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
4fd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
4fe0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
4ff0: 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
5000: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 73    int nData;.  s
5010: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
5020: 6d 74 3b 0a 0a 20 20 70 53 74 6d 74 20 3d 20 70  mt;..  pStmt = p
5030: 72 65 70 61 72 65 54 6f 47 65 74 53 65 67 6d 65  repareToGetSegme
5040: 6e 74 28 64 62 2c 20 7a 54 61 62 2c 20 61 7a 45  nt(db, zTab, azE
5050: 78 74 72 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20  xtra[0]);.  if( 
5060: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
5070: 6d 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)!=SQLITE_ROW 
5080: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
5090: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
50a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
50b0: 20 20 6e 44 61 74 61 20 3d 20 73 71 6c 69 74 65    nData = sqlite
50c0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
50d0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 44 61 74  Stmt, 0);.  aDat
50e0: 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  a = sqlite3_colu
50f0: 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30  mn_blob(pStmt, 0
5100: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 53 65 67  );.  printf("Seg
5110: 6d 65 6e 74 20 25 73 20 6f 66 20 73 69 7a 65 20  ment %s of size 
5120: 25 64 20 62 79 74 65 73 3a 5c 6e 22 2c 20 61 7a  %d bytes:\n", az
5130: 45 78 74 72 61 5b 30 5d 2c 20 6e 44 61 74 61 29  Extra[0], nData)
5140: 3b 0a 20 20 69 66 28 20 66 69 6e 64 4f 70 74 69  ;.  if( findOpti
5150: 6f 6e 28 22 72 61 77 22 2c 20 30 2c 20 30 29 21  on("raw", 0, 0)!
5160: 3d 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 42  =0 ){.    printB
5170: 6c 6f 62 28 61 44 61 74 61 2c 20 6e 44 61 74 61  lob(aData, nData
5180: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5190: 64 65 63 6f 64 65 53 65 67 6d 65 6e 74 28 61 44  decodeSegment(aD
51a0: 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  ata, nData);.  }
51b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
51c0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  ize(pStmt);.}../
51d0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 69  *.** Decode a si
51e0: 6e 67 6c 65 20 64 6f 63 6c 69 73 74 20 61 6e 64  ngle doclist and
51f0: 20 64 69 73 70 6c 61 79 20 74 68 65 20 72 65 73   display the res
5200: 75 6c 74 73 20 6f 6e 20 73 74 64 6f 75 74 2e 0a  ults on stdout..
5210: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
5220: 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 0a 20 20  ecodeDoclist(.  
5230: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5240: 68 61 72 20 2a 61 44 61 74 61 2c 20 20 20 2f 2a  har *aData,   /*
5250: 20 43 6f 6e 74 65 6e 74 20 74 6f 20 70 72 69 6e   Content to prin
5260: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  t */.  int nData
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5290: 66 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  f bytes of conte
52a0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
52b0: 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 44 6f  e3_int64 iPrevDo
52c0: 63 69 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  cid = 0;.  sqlit
52d0: 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b  e3_int64 iDocid;
52e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
52f0: 20 69 50 6f 73 3b 0a 20 20 73 71 6c 69 74 65 33   iPos;.  sqlite3
5300: 5f 69 6e 74 36 34 20 69 50 72 65 76 50 6f 73 20  _int64 iPrevPos 
5310: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
5320: 6e 74 36 34 20 69 43 6f 6c 3b 0a 20 20 69 6e 74  nt64 iCol;.  int
5330: 20 69 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65   i = 0;..  while
5340: 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20  ( i<nData ){.   
5350: 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   i += getVarint(
5360: 61 44 61 74 61 2b 69 2c 20 26 69 44 6f 63 69 64  aData+i, &iDocid
5370: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64  );.    printf("d
5380: 6f 63 69 64 20 25 6c 6c 64 20 63 6f 6c 30 22 2c  ocid %lld col0",
5390: 20 69 44 6f 63 69 64 2b 69 50 72 65 76 44 6f 63   iDocid+iPrevDoc
53a0: 69 64 29 3b 0a 20 20 20 20 69 50 72 65 76 44 6f  id);.    iPrevDo
53b0: 63 69 64 20 2b 3d 20 69 44 6f 63 69 64 3b 0a 20  cid += iDocid;. 
53c0: 20 20 20 69 50 72 65 76 50 6f 73 20 3d 20 30 3b     iPrevPos = 0;
53d0: 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
53e0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56  .      i += getV
53f0: 61 72 69 6e 74 28 61 44 61 74 61 2b 69 2c 20 26  arint(aData+i, &
5400: 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 66 28  iPos);.      if(
5410: 20 69 50 6f 73 3d 3d 31 20 29 7b 0a 20 20 20 20   iPos==1 ){.    
5420: 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69      i += getVari
5430: 6e 74 28 61 44 61 74 61 2b 69 2c 20 26 69 43 6f  nt(aData+i, &iCo
5440: 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69 6e  l);.        prin
5450: 74 66 28 22 20 63 6f 6c 25 6c 6c 64 22 2c 20 69  tf(" col%lld", i
5460: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 50  Col);.        iP
5470: 72 65 76 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20  revPos = 0;.    
5480: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 6f 73    }else if( iPos
5490: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
54a0: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
54b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
54c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
54d0: 20 69 50 72 65 76 50 6f 73 20 2b 3d 20 69 50 6f   iPrevPos += iPo
54e0: 73 20 2d 20 32 3b 0a 20 20 20 20 20 20 20 20 70  s - 2;.        p
54f0: 72 69 6e 74 66 28 22 20 25 6c 6c 64 22 2c 20 69  rintf(" %lld", i
5500: 50 72 65 76 50 6f 73 29 3b 0a 20 20 20 20 20 20  PrevPos);.      
5510: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 20 20  }.    }.  }.}.  
5520: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
5530: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
5540: 6f 63 6c 69 73 74 2e 20 20 54 68 65 20 73 65 67  oclist.  The seg
5550: 6d 65 6e 74 20 6f 72 20 73 65 67 64 69 72 2d 72  ment or segdir-r
5560: 6f 6f 74 20 69 73 0a 2a 2a 20 69 64 65 6e 74 69  oot is.** identi
5570: 66 69 65 64 20 62 79 20 61 7a 45 78 74 72 61 5b  fied by azExtra[
5580: 30 5d 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  0].  If the firs
5590: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61  t character of a
55a0: 7a 45 78 74 72 61 5b 30 5d 0a 2a 2a 20 69 73 20  zExtra[0].** is 
55b0: 27 72 27 20 74 68 65 6e 20 74 68 65 20 72 65 6d  'r' then the rem
55c0: 61 69 6e 64 65 72 20 69 73 20 74 68 65 20 69 6e  ainder is the in
55d0: 74 65 67 65 72 20 72 6f 77 69 64 20 6f 66 20 74  teger rowid of t
55e0: 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  he %_segdir entr
55f0: 79 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 72  y..** If the fir
5600: 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  st character of 
5610: 61 7a 45 78 74 72 61 5b 30 5d 20 69 73 20 6e 6f  azExtra[0] is no
5620: 74 20 27 72 27 20 74 68 65 6e 2c 20 74 68 65 6e  t 'r' then, then
5630: 20 61 6c 6c 20 6f 66 0a 2a 2a 20 61 7a 45 78 74   all of.** azExt
5640: 72 61 5b 30 5d 20 69 73 20 61 6e 20 69 6e 74 65  ra[0] is an inte
5650: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
5660: 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72 2e 20 20   block number.  
5670: 54 68 65 20 6f 66 66 73 65 74 0a 2a 2a 20 69 6e  The offset.** in
5680: 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  to the segment i
5690: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
56a0: 61 7a 45 78 74 72 61 5b 31 5d 2e 20 20 54 68 65  azExtra[1].  The
56b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 6f 63   size of the doc
56c0: 6c 69 73 74 0a 2a 2a 20 69 73 20 61 7a 45 78 74  list.** is azExt
56d0: 72 61 5b 32 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ra[2]..**.** If 
56e0: 74 68 65 20 2d 2d 72 61 77 20 6f 70 74 69 6f 6e  the --raw option
56f0: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 61   is present in a
5700: 7a 45 78 74 72 61 2c 20 74 68 65 6e 20 61 20 68  zExtra, then a h
5710: 65 78 20 64 75 6d 70 20 69 73 20 70 72 6f 76 69  ex dump is provi
5720: 64 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ded..** Otherwis
5730: 65 20 61 20 64 65 63 6f 64 69 6e 67 20 69 73 20  e a decoding is 
5740: 73 68 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  shown..*/.static
5750: 20 76 6f 69 64 20 73 68 6f 77 44 6f 63 6c 69 73   void showDoclis
5760: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
5770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
5780: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
5790: 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
57a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
57b0: 6f 66 66 73 65 74 2c 20 6e 44 61 74 61 3b 0a 20  offset, nData;. 
57c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
57d0: 53 74 6d 74 3b 0a 0a 20 20 6f 66 66 73 65 74 20  Stmt;..  offset 
57e0: 3d 20 61 74 6f 69 36 34 28 61 7a 45 78 74 72 61  = atoi64(azExtra
57f0: 5b 31 5d 29 3b 0a 20 20 6e 44 61 74 61 20 3d 20  [1]);.  nData = 
5800: 61 74 6f 69 36 34 28 61 7a 45 78 74 72 61 5b 32  atoi64(azExtra[2
5810: 5d 29 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 72  ]);.  pStmt = pr
5820: 65 70 61 72 65 54 6f 47 65 74 53 65 67 6d 65 6e  epareToGetSegmen
5830: 74 28 64 62 2c 20 7a 54 61 62 2c 20 61 7a 45 78  t(db, zTab, azEx
5840: 74 72 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 73  tra[0]);.  if( s
5850: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
5860: 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)!=SQLITE_ROW )
5870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
5880: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
5890: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
58a0: 20 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33   aData = sqlite3
58b0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
58c0: 6d 74 2c 20 30 29 3b 0a 20 20 70 72 69 6e 74 66  mt, 0);.  printf
58d0: 28 22 44 6f 63 6c 69 73 74 20 61 74 20 25 73 20  ("Doclist at %s 
58e0: 6f 66 66 73 65 74 20 25 6c 6c 64 20 6f 66 20 73  offset %lld of s
58f0: 69 7a 65 20 25 6c 6c 64 20 62 79 74 65 73 3a 5c  ize %lld bytes:\
5900: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 61 7a 45  n",.         azE
5910: 78 74 72 61 5b 30 5d 2c 20 6f 66 66 73 65 74 2c  xtra[0], offset,
5920: 20 6e 44 61 74 61 29 3b 0a 20 20 69 66 28 20 66   nData);.  if( f
5930: 69 6e 64 4f 70 74 69 6f 6e 28 22 72 61 77 22 2c  indOption("raw",
5940: 20 30 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20   0, 0)!=0 ){.   
5950: 20 70 72 69 6e 74 42 6c 6f 62 28 61 44 61 74 61   printBlob(aData
5960: 2b 6f 66 66 73 65 74 2c 20 6e 44 61 74 61 29 3b  +offset, nData);
5970: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
5980: 63 6f 64 65 44 6f 63 6c 69 73 74 28 61 44 61 74  codeDoclist(aDat
5990: 61 2b 6f 66 66 73 65 74 2c 20 6e 44 61 74 61 29  a+offset, nData)
59a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
59b0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
59c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74  .}../*.** Show t
59d0: 68 65 20 74 6f 70 20 4e 20 6c 61 72 67 65 73 74  he top N largest
59e0: 20 73 65 67 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   segments.*/.sta
59f0: 74 69 63 20 76 6f 69 64 20 6c 69 73 74 42 69 67  tic void listBig
5a00: 53 65 67 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  Segments(sqlite3
5a10: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
5a20: 20 2a 7a 54 61 62 29 7b 0a 20 20 69 6e 74 20 6e   *zTab){.  int n
5a30: 54 6f 70 2c 20 69 3b 0a 20 20 73 71 6c 69 74 65  Top, i;.  sqlite
5a40: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
5a50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
5a60: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  z;.  sqlite3_int
5a70: 36 34 20 69 64 3b 0a 0a 20 20 6e 54 6f 70 20 3d  64 id;..  nTop =
5a80: 20 61 74 6f 69 28 66 69 6e 64 4f 70 74 69 6f 6e   atoi(findOption
5a90: 28 22 74 6f 70 22 2c 20 31 2c 20 22 32 35 22 29  ("top", 1, "25")
5aa0: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 54 68 65  );.  printf("The
5ab0: 20 25 64 20 6c 61 72 67 65 73 74 20 73 65 67 6d   %d largest segm
5ac0: 65 6e 74 73 3a 5c 6e 22 2c 20 6e 54 6f 70 29 3b  ents:\n", nTop);
5ad0: 0a 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61  .  pStmt = prepa
5ae0: 72 65 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  re(db,.         
5af0: 20 20 20 22 53 45 4c 45 43 54 20 62 6c 6f 63 6b     "SELECT block
5b00: 69 64 2c 20 6c 65 6e 67 74 68 28 62 6c 6f 63 6b  id, length(block
5b10: 29 20 41 53 20 6c 65 6e 20 46 52 4f 4d 20 27 25  ) AS len FROM '%
5b20: 71 5f 73 65 67 6d 65 6e 74 73 27 22 0a 20 20 20  q_segments'".   
5b30: 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52           " ORDER
5b40: 20 42 59 20 32 20 44 45 53 43 2c 20 31 22 0a 20   BY 2 DESC, 1". 
5b50: 20 20 20 20 20 20 20 20 20 20 20 22 20 4c 49 4d             " LIM
5b60: 49 54 20 25 64 22 2c 20 7a 54 61 62 2c 20 6e 54  IT %d", zTab, nT
5b70: 6f 70 29 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  op);.  i = 0;.  
5b80: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
5b90: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
5ba0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 2b  TE_ROW ){.    i+
5bb0: 2b 3b 0a 20 20 20 20 69 64 20 3d 20 73 71 6c 69  +;.    id = sqli
5bc0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
5bd0: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
5be0: 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  sz = sqlite3_col
5bf0: 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
5c00: 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   1);.    printf(
5c10: 22 20 20 25 32 64 2e 20 25 39 6c 6c 64 20 73 69  "  %2d. %9lld si
5c20: 7a 65 20 25 6c 6c 64 5c 6e 22 2c 20 69 2c 20 69  ze %lld\n", i, i
5c30: 64 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 73 71  d, sz);.  }.  sq
5c40: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
5c50: 53 74 6d 74 29 3b 0a 7d 0a 0a 0a 0a 73 74 61 74  Stmt);.}....stat
5c60: 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 63 6f  ic void usage(co
5c70: 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76 30 29  nst char *argv0)
5c80: 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  {.  fprintf(stde
5c90: 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 44  rr, "Usage: %s D
5ca0: 41 54 41 42 41 53 45 5c 6e 22 0a 20 20 20 20 20  ATABASE\n".     
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
5cc0: 20 6f 72 3a 20 25 73 20 44 41 54 41 42 41 53 45   or: %s DATABASE
5cd0: 20 46 54 53 33 54 41 42 4c 45 20 41 52 47 53 2e   FTS3TABLE ARGS.
5ce0: 2e 2e 5c 6e 22 2c 20 61 72 67 76 30 2c 20 61 72  ..\n", argv0, ar
5cf0: 67 76 30 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  gv0);.  fprintf(
5d00: 73 74 64 65 72 72 2c 0a 20 20 20 20 22 41 52 47  stderr,.    "ARG
5d10: 53 3a 5c 6e 22 0a 20 20 20 20 22 20 20 62 69 67  S:\n".    "  big
5d20: 2d 73 65 67 6d 65 6e 74 73 20 5b 2d 2d 74 6f 70  -segments [--top
5d30: 20 4e 5d 20 20 20 20 20 20 20 20 20 20 20 20 20   N]             
5d40: 20 20 20 20 20 20 20 73 68 6f 77 20 74 68 65 20         show the 
5d50: 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 73  largest segments
5d60: 5c 6e 22 0a 20 20 20 20 22 20 20 64 6f 63 6c 69  \n".    "  docli
5d70: 73 74 20 42 4c 4f 43 4b 49 44 20 4f 46 46 53 45  st BLOCKID OFFSE
5d80: 54 20 53 49 5a 45 20 5b 2d 2d 72 61 77 5d 20 20  T SIZE [--raw]  
5d90: 20 20 20 20 20 44 65 63 6f 64 65 20 61 20 64 6f       Decode a do
5da0: 63 6c 69 73 74 5c 6e 22 0a 20 20 20 20 22 20 20  clist\n".    "  
5db0: 73 63 68 65 6d 61 20 20 20 20 20 20 20 20 20 20  schema          
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 20 20 46 54 53 20 74 61            FTS ta
5de0: 62 6c 65 20 73 63 68 65 6d 61 5c 6e 22 0a 20 20  ble schema\n".  
5df0: 20 20 22 20 20 73 65 67 64 69 72 20 20 20 20 20    "  segdir     
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5e20: 69 72 65 63 74 6f 72 79 20 6f 66 20 73 65 67 6d  irectory of segm
5e30: 65 6e 74 73 5c 6e 22 0a 20 20 20 20 22 20 20 73  ents\n".    "  s
5e40: 65 67 6d 65 6e 74 20 42 4c 4f 43 4b 49 44 20 5b  egment BLOCKID [
5e50: 2d 2d 72 61 77 5d 20 20 20 20 20 20 20 20 20 20  --raw]          
5e60: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74           content
5e70: 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 5c 6e 22   of a segment\n"
5e80: 0a 20 20 20 20 22 20 20 73 65 67 6d 65 6e 74 2d  .    "  segment-
5e90: 73 74 61 74 73 20 20 20 20 20 20 20 20 20 20 20  stats           
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 20 20 69 6e 66 6f 20 6f 6e 20 73 65 67 6d 65 6e    info on segmen
5ec0: 74 20 73 69 7a 65 73 5c 6e 22 0a 20 20 20 20 22  t sizes\n".    "
5ed0: 20 20 73 74 61 74 20 20 20 20 20 20 20 20 20 20    stat          
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
5f00: 25 25 5f 73 74 61 74 20 74 61 62 6c 65 5c 6e 22  %%_stat table\n"
5f10: 0a 20 20 20 20 22 20 20 76 6f 63 61 62 75 6c 61  .    "  vocabula
5f20: 72 79 20 5b 2d 2d 74 6f 70 20 4e 5d 20 20 20 20  ry [--top N]    
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 20 20 64 6f 63 75 6d 65 6e 74 20 76 6f 63 61 62    document vocab
5f50: 75 6c 61 72 79 5c 6e 22 0a 20 20 29 3b 0a 20 20  ulary\n".  );.  
5f60: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 69 6e 74 20  exit(1);.}..int 
5f70: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
5f80: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 73  har **argv){.  s
5f90: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
5fa0: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
5fb0: 61 72 20 2a 7a 54 61 62 3b 0a 20 20 63 6f 6e 73  ar *zTab;.  cons
5fc0: 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 0a 20  t char *zCmd;.. 
5fd0: 20 69 66 28 20 61 72 67 63 3c 32 20 29 20 75 73   if( argc<2 ) us
5fe0: 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  age(argv[0]);.  
5ff0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
6000: 6e 28 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 3b  n(argv[1], &db);
6010: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6020: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
6030: 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 25 73   "Cannot open %s
6040: 5c 6e 22 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20  \n", argv[1]);. 
6050: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
6060: 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b    if( argc==2 ){
6070: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
6080: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e  t *pStmt;.    in
6090: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  t cnt = 0;.    p
60a0: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 28 64  Stmt = prepare(d
60b0: 62 2c 20 22 53 45 4c 45 43 54 20 62 2e 73 71 6c  b, "SELECT b.sql
60c0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
60d0: 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
60e0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
60f0: 61 2c 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  a, sqlite_master
6100: 20 62 22 0a 20 20 20 20 20 20 20 20 20 20 20 20   b".            
6110: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
6120: 45 52 45 20 61 2e 6e 61 6d 65 20 47 4c 4f 42 20  ERE a.name GLOB 
6130: 27 2a 5f 73 65 67 64 69 72 27 22 0a 20 20 20 20  '*_segdir'".    
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 20 22 20 20 20 41 4e 44 20 62 2e 6e 61      "   AND b.na
6160: 6d 65 3d 73 75 62 73 74 72 28 61 2e 6e 61 6d 65  me=substr(a.name
6170: 2c 31 2c 6c 65 6e 67 74 68 28 61 2e 6e 61 6d 65  ,1,length(a.name
6180: 29 2d 37 29 22 0a 20 20 20 20 20 20 20 20 20 20  )-7)".          
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
61a0: 4f 52 44 45 52 20 42 59 20 31 22 29 3b 0a 20 20  ORDER BY 1");.  
61b0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
61c0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
61d0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
61e0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 70    cnt++;.      p
61f0: 72 69 6e 74 66 28 22 25 73 3b 5c 6e 22 2c 20 73  rintf("%s;\n", s
6200: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
6210: 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
6220: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6230: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
6240: 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  ;.    if( cnt==0
6250: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
6260: 28 22 2f 2a 20 4e 6f 20 46 54 53 33 2f 34 20 74  ("/* No FTS3/4 t
6270: 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 64  ables found in d
6280: 61 74 61 62 61 73 65 20 25 73 20 2a 2f 5c 6e 22  atabase %s */\n"
6290: 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  , argv[1]);.    
62a0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
62b0: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3c 34    }.  if( argc<4
62c0: 20 29 20 75 73 61 67 65 28 61 72 67 76 5b 30 5d   ) usage(argv[0]
62d0: 29 3b 0a 20 20 7a 54 61 62 20 3d 20 61 72 67 76  );.  zTab = argv
62e0: 5b 32 5d 3b 0a 20 20 7a 43 6d 64 20 3d 20 61 72  [2];.  zCmd = ar
62f0: 67 76 5b 33 5d 3b 0a 20 20 6e 45 78 74 72 61 20  gv[3];.  nExtra 
6300: 3d 20 61 72 67 63 2d 34 3b 0a 20 20 61 7a 45 78  = argc-4;.  azEx
6310: 74 72 61 20 3d 20 61 72 67 76 2b 34 3b 0a 20 20  tra = argv+4;.  
6320: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6330: 22 62 69 67 2d 73 65 67 6d 65 6e 74 73 22 29 3d  "big-segments")=
6340: 3d 30 20 29 7b 0a 20 20 20 20 6c 69 73 74 42 69  =0 ){.    listBi
6350: 67 53 65 67 6d 65 6e 74 73 28 64 62 2c 20 7a 54  gSegments(db, zT
6360: 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ab);.  }else if(
6370: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 64 6f   strcmp(zCmd,"do
6380: 63 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  clist")==0 ){.  
6390: 20 20 69 66 28 20 61 72 67 63 3c 37 20 29 20 75    if( argc<7 ) u
63a0: 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  sage(argv[0]);. 
63b0: 20 20 20 73 68 6f 77 44 6f 63 6c 69 73 74 28 64     showDoclist(d
63c0: 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73  b, zTab);.  }els
63d0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
63e0: 64 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30 20 29  d,"schema")==0 )
63f0: 7b 0a 20 20 20 20 73 68 6f 77 53 63 68 65 6d 61  {.    showSchema
6400: 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d 65  (db, zTab);.  }e
6410: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6420: 43 6d 64 2c 22 73 65 67 64 69 72 22 29 3d 3d 30  Cmd,"segdir")==0
6430: 20 29 7b 0a 20 20 20 20 73 68 6f 77 53 65 67 64   ){.    showSegd
6440: 69 72 4d 61 70 28 64 62 2c 20 7a 54 61 62 29 3b  irMap(db, zTab);
6450: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6460: 63 6d 70 28 7a 43 6d 64 2c 22 73 65 67 6d 65 6e  cmp(zCmd,"segmen
6470: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  t")==0 ){.    if
6480: 28 20 61 72 67 63 3c 35 20 29 20 75 73 61 67 65  ( argc<5 ) usage
6490: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73  (argv[0]);.    s
64a0: 68 6f 77 53 65 67 6d 65 6e 74 28 64 62 2c 20 7a  howSegment(db, z
64b0: 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Tab);.  }else if
64c0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 73  ( strcmp(zCmd,"s
64d0: 65 67 6d 65 6e 74 2d 73 74 61 74 73 22 29 3d 3d  egment-stats")==
64e0: 30 20 29 7b 0a 20 20 20 20 73 68 6f 77 53 65 67  0 ){.    showSeg
64f0: 6d 65 6e 74 53 74 61 74 73 28 64 62 2c 20 7a 54  mentStats(db, zT
6500: 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ab);.  }else if(
6510: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 73 74   strcmp(zCmd,"st
6520: 61 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  at")==0 ){.    s
6530: 68 6f 77 53 74 61 74 28 64 62 2c 20 7a 54 61 62  howStat(db, zTab
6540: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
6550: 74 72 63 6d 70 28 7a 43 6d 64 2c 22 76 6f 63 61  trcmp(zCmd,"voca
6560: 62 75 6c 61 72 79 22 29 3d 3d 30 20 29 7b 0a 20  bulary")==0 ){. 
6570: 20 20 20 73 68 6f 77 56 6f 63 61 62 75 6c 61 72     showVocabular
6580: 79 28 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 7d  y(db, zTab);.  }
6590: 65 6c 73 65 7b 0a 20 20 20 20 75 73 61 67 65 28  else{.    usage(
65a0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  argv[0]);.  }.  
65b0: 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a           return 0; .}.