/ Hex Artifact Content
Login

Artifact 1f95d54b32f96493ca3f1a9421eaf3e72a5c091e:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 31 30 2d 32 34  /*.** 2016-10-24
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
0180: 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61 6d 20  utility program 
0190: 74 68 61 74 20 75 73 65 73 20 74 68 65 20 65 73  that uses the es
01a0: 74 5f 63 6f 75 6e 74 20 61 6e 64 20 62 74 72 65  t_count and btre
01b0: 65 5f 73 61 6d 70 6c 65 0a 2a 2a 20 70 72 61 67  e_sample.** prag
01c0: 6d 61 73 20 74 6f 20 74 72 79 20 74 6f 20 61 70  mas to try to ap
01d0: 70 72 6f 78 69 6d 61 74 65 20 74 68 65 20 63 6f  proximate the co
01e0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71 6c  ntent of the sql
01f0: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 0a  ite_stat1 table.
0200: 2a 2a 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ** without doing
0210: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
0220: 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 63 6f 6d  an..**.** To com
0230: 70 69 6c 65 2c 20 73 69 6d 70 6c 79 20 6c 69 6e  pile, simply lin
0240: 6b 20 61 67 61 69 6e 73 74 20 53 51 4c 69 74 65  k against SQLite
0250: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
0260: 73 68 6f 77 48 65 6c 70 28 29 20 72 6f 75 74 69  showHelp() routi
0270: 6e 65 20 62 65 6c 6f 77 20 66 6f 72 20 61 20 62  ne below for a b
0280: 72 69 65 66 20 64 65 73 63 72 69 70 74 69 6f 6e  rief description
0290: 20 6f 66 20 68 6f 77 20 74 6f 0a 2a 2a 20 72 75   of how to.** ru
02a0: 6e 20 74 68 65 20 75 74 69 6c 69 74 79 2e 0a 2a  n the utility..*
02b0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  /.#include <stdi
02c0: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  o.h>.#include <s
02d0: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
02e0: 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e  e <stdarg.h>.#in
02f0: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0300: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0310: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
0320: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
0330: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a 2f 2a   "sqlite3.h"../*
0340: 0a 2a 2a 20 41 6c 6c 20 67 6c 6f 62 61 6c 20 76  .** All global v
0350: 61 72 69 61 62 6c 65 73 20 61 72 65 20 67 61 74  ariables are gat
0360: 68 65 72 65 64 20 69 6e 74 6f 20 74 68 65 20 22  hered into the "
0370: 67 22 20 73 69 6e 67 6c 65 74 6f 6e 2e 0a 2a 2f  g" singleton..*/
0380: 0a 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 56 61  .struct GlobalVa
0390: 72 73 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rs {.  const cha
03a0: 72 20 2a 7a 41 72 67 76 30 3b 20 20 20 20 20 20  r *zArgv0;      
03b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 70 72 6f 67   /* Name of prog
03c0: 72 61 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ram */.  unsigne
03d0: 64 20 66 44 65 62 75 67 3b 20 20 20 20 20 20 20  d fDebug;       
03e0: 20 20 20 2f 2a 20 44 65 62 75 67 20 66 6c 61 67     /* Debug flag
03f0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
0400: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0410: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
0420: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 7d   connection */.}
0430: 20 67 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77   g;../*.** Allow
0440: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 67 2e  ed values for g.
0450: 66 44 65 62 75 67 0a 2a 2f 0a 23 64 65 66 69 6e  fDebug.*/.#defin
0460: 65 20 44 45 42 55 47 5f 4e 4f 4e 45 20 20 20 20  e DEBUG_NONE    
0470: 20 20 20 20 20 20 30 0a 0a 20 20 0a 2f 2a 0a 2a        0..  ./*.*
0480: 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  * Print an error
0490: 20 72 65 73 75 6c 74 69 6e 67 20 66 72 6f 6d 20   resulting from 
04a0: 66 61 75 6c 74 69 6e 67 20 63 6f 6d 6d 61 6e 64  faulting command
04b0: 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20  -line arguments 
04c0: 61 6e 64 0a 2a 2a 20 61 62 6f 72 74 20 74 68 65  and.** abort the
04d0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 73 74 61   program..*/.sta
04e0: 74 69 63 20 76 6f 69 64 20 63 6d 64 6c 69 6e 65  tic void cmdline
04f0: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
0500: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
0510: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
0520: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
0530: 20 22 25 73 3a 20 22 2c 20 67 2e 7a 41 72 67 76   "%s: ", g.zArgv
0540: 30 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  0);.  va_start(a
0550: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76  p, zFormat);.  v
0560: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0570: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0580: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70  va_end(ap);.  fp
0590: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c  rintf(stderr, "\
05a0: 6e 5c 22 25 73 20 2d 2d 68 65 6c 70 5c 22 20 66  n\"%s --help\" f
05b0: 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 2c  or more help\n",
05c0: 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 65 78   g.zArgv0);.  ex
05d0: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
05e0: 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  Print an error m
05f0: 65 73 73 61 67 65 20 66 6f 72 20 61 6e 20 65 72  essage for an er
0600: 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  ror that occurs 
0610: 61 74 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e  at runtime, then
0620: 0a 2a 2a 20 61 62 6f 72 74 20 74 68 65 20 70 72  .** abort the pr
0630: 6f 67 72 61 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  ogram..*/.static
0640: 20 76 6f 69 64 20 72 75 6e 74 69 6d 65 45 72 72   void runtimeErr
0650: 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  or(const char *z
0660: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
0670: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 66 70  va_list ap;.  fp
0680: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
0690: 73 3a 20 22 2c 20 67 2e 7a 41 72 67 76 30 29 3b  s: ", g.zArgv0);
06a0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
06b0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72  zFormat);.  vfpr
06c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 7a 46 6f  intf(stderr, zFo
06d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
06e0: 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e  end(ap);.  fprin
06f0: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
0700: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
0710: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
0720: 6e 65 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  new SQL statemen
0730: 74 2e 20 20 50 72 69 6e 74 20 61 6e 20 65 72 72  t.  Print an err
0740: 6f 72 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20  or and abort if 
0750: 61 6e 79 74 68 69 6e 67 0a 2a 2a 20 67 6f 65 73  anything.** goes
0760: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
0770: 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  c sqlite3_stmt *
0780: 64 62 5f 76 70 72 65 70 61 72 65 28 63 6f 6e 73  db_vprepare(cons
0790: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
07a0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
07b0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
07c0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
07d0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
07e0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  zSql = sqlite3_v
07f0: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
0800: 20 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c   ap);.  if( zSql
0810: 3d 3d 30 20 29 20 72 75 6e 74 69 6d 65 45 72 72  ==0 ) runtimeErr
0820: 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or("out of memor
0830: 79 22 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  y");.  rc = sqli
0840: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67  te3_prepare_v2(g
0850: 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  .db, zSql, -1, &
0860: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
0870: 20 72 63 20 29 7b 0a 20 20 20 20 72 75 6e 74 69   rc ){.    runti
0880: 6d 65 45 72 72 6f 72 28 22 53 51 4c 20 73 74 61  meError("SQL sta
0890: 74 65 6d 65 6e 74 20 65 72 72 6f 72 3a 20 25 73  tement error: %s
08a0: 5c 6e 5c 22 25 73 5c 22 22 2c 20 73 71 6c 69 74  \n\"%s\"", sqlit
08b0: 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 2c  e3_errmsg(g.db),
08c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
08d0: 20 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73    zSql);.  }.  s
08e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
08f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 53 74 6d  );.  return pStm
0900: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 73 71 6c 69  t;.}.static sqli
0910: 74 65 33 5f 73 74 6d 74 20 2a 64 62 5f 70 72 65  te3_stmt *db_pre
0920: 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20  pare(const char 
0930: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
0940: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
0950: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0960: 74 6d 74 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  tmt;.  va_start(
0970: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
0980: 70 53 74 6d 74 20 3d 20 64 62 5f 76 70 72 65 70  pStmt = db_vprep
0990: 61 72 65 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  are(zFormat, ap)
09a0: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
09b0: 20 20 72 65 74 75 72 6e 20 70 53 74 6d 74 3b 0a    return pStmt;.
09c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
09d0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
09e0: 72 6f 77 73 20 69 6e 20 74 68 65 20 67 69 76 65  rows in the give
09f0: 6e 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  n table or index
0a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
0a10: 74 65 33 5f 69 6e 74 36 34 20 65 73 74 45 6e 74  te3_int64 estEnt
0a20: 72 79 43 6f 75 6e 74 28 63 6f 6e 73 74 20 63 68  ryCount(const ch
0a30: 61 72 20 2a 7a 54 61 62 49 64 78 29 7b 0a 20 20  ar *zTabIdx){.  
0a40: 64 6f 75 62 6c 65 20 73 75 6d 20 3d 20 30 2e 30  double sum = 0.0
0a50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
0a60: 20 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65   n = 0;.  sqlite
0a70: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 23  3_stmt *pStmt;.#
0a80: 20 64 65 66 69 6e 65 20 4e 5f 43 4e 54 5f 53 41   define N_CNT_SA
0a90: 4d 50 4c 45 20 31 30 0a 20 20 66 6f 72 28 69 3d  MPLE 10.  for(i=
0aa0: 30 3b 20 69 3c 3d 4e 5f 43 4e 54 5f 53 41 4d 50  0; i<=N_CNT_SAMP
0ab0: 4c 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  LE; i++){.    pS
0ac0: 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61 72 65  tmt = db_prepare
0ad0: 28 22 50 52 41 47 4d 41 20 65 73 74 5f 63 6f 75  ("PRAGMA est_cou
0ae0: 6e 74 28 5c 22 25 77 5c 22 2c 25 67 29 22 2c 20  nt(\"%w\",%g)", 
0af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0b00: 20 20 20 20 20 20 20 20 7a 54 61 62 49 64 78 2c          zTabIdx,
0b10: 20 28 28 64 6f 75 62 6c 65 29 69 29 2f 28 64 6f   ((double)i)/(do
0b20: 75 62 6c 65 29 28 4e 5f 43 4e 54 5f 53 41 4d 50  uble)(N_CNT_SAMP
0b30: 4c 45 29 29 3b 0a 20 20 20 20 69 66 28 20 73 71  LE));.    if( sq
0b40: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
0b50: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
0b60: 0a 20 20 20 20 20 20 73 75 6d 20 2b 3d 20 73 71  .      sum += sq
0b70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
0b80: 62 6c 65 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ble(pStmt, 0);. 
0b90: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a       n++;.    }.
0ba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
0bb0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
0bc0: 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 20 3f  .  return n==0 ?
0bd0: 20 30 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e   0 : (sqlite3_in
0be0: 74 36 34 29 28 73 75 6d 2f 6e 29 3b 0a 7d 0a 0a  t64)(sum/n);.}..
0bf0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
0c00: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i-th column of
0c10: 20 70 53 74 6d 74 20 61 67 61 69 6e 73 74 20 70   pStmt against p
0c20: 56 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 74  Value.  Return t
0c30: 72 75 65 20 69 66 20 74 68 65 79 0a 2a 2a 20 61  rue if they.** a
0c40: 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2f  re different..*/
0c50: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
0c60: 6d 6e 4e 6f 74 45 71 75 61 6c 28 73 71 6c 69 74  mnNotEqual(sqlit
0c70: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20  e3_stmt *pStmt, 
0c80: 69 6e 74 20 69 2c 20 73 71 6c 69 74 65 33 5f 76  int i, sqlite3_v
0c90: 61 6c 75 65 20 2a 70 56 61 6c 75 65 29 7b 0a 20  alue *pValue){. 
0ca0: 20 69 6e 74 20 6e 31 2c 20 6e 32 2c 20 6e 3b 0a   int n1, n2, n;.
0cb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
0cc0: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
0cd0: 69 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  i)!=sqlite3_valu
0ce0: 65 5f 74 79 70 65 28 70 56 61 6c 75 65 29 20 29  e_type(pValue) )
0cf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 77 69   return 1;.  swi
0d00: 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tch( sqlite3_col
0d10: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 69  umn_type(pStmt,i
0d20: 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  ) ){.    case SQ
0d30: 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  LITE_NULL:.     
0d40: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e   return 0;  /* N
0d50: 75 6c 6c 73 20 63 6f 6d 70 61 72 65 20 65 71 75  ulls compare equ
0d60: 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65  al to one anothe
0d70: 72 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78  r in this contex
0d80: 74 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53  t */..    case S
0d90: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20  QLITE_INTEGER:. 
0da0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
0db0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
0dc0: 28 70 53 74 6d 74 2c 69 29 21 3d 73 71 6c 69 74  (pStmt,i)!=sqlit
0dd0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
0de0: 56 61 6c 75 65 29 3b 0a 0a 20 20 20 20 63 61 73  Value);..    cas
0df0: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a  e SQLITE_FLOAT:.
0e00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
0e10: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
0e20: 6c 65 28 70 53 74 6d 74 2c 69 29 21 3d 73 71 6c  le(pStmt,i)!=sql
0e30: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
0e40: 65 28 70 56 61 6c 75 65 29 3b 0a 0a 20 20 20 20  e(pValue);..    
0e50: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42  case SQLITE_BLOB
0e60: 3a 0a 20 20 20 20 20 20 6e 31 20 3d 20 73 71 6c  :.      n1 = sql
0e70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
0e80: 73 28 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20  s(pStmt,i);.    
0e90: 20 20 6e 32 20 3d 20 73 71 6c 69 74 65 33 5f 76    n2 = sqlite3_v
0ea0: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 75  alue_bytes(pValu
0eb0: 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 31  e);.      n = n1
0ec0: 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 3b 0a 20  <n2 ? n1 : n2;. 
0ed0: 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
0ee0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
0ef0: 6c 6f 62 28 70 53 74 6d 74 2c 69 29 2c 20 73 71  lob(pStmt,i), sq
0f00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
0f10: 28 70 56 61 6c 75 65 29 2c 6e 29 20 29 7b 0a 20  (pValue),n) ){. 
0f20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
0f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
0f40: 65 74 75 72 6e 20 6e 31 21 3d 6e 32 3b 0a 0a 20  eturn n1!=n2;.. 
0f50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
0f60: 45 58 54 3a 0a 20 20 20 20 20 20 6e 31 20 3d 20  EXT:.      n1 = 
0f70: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
0f80: 79 74 65 73 28 70 53 74 6d 74 2c 69 29 3b 0a 20  ytes(pStmt,i);. 
0f90: 20 20 20 20 20 6e 32 20 3d 20 73 71 6c 69 74 65       n2 = sqlite
0fa0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
0fb0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d  alue);.      n =
0fc0: 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32   n1<n2 ? n1 : n2
0fd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ;.      if( memc
0fe0: 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  mp(sqlite3_colum
0ff0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 69 29 2c  n_text(pStmt,i),
1000: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
1010: 65 78 74 28 70 56 61 6c 75 65 29 2c 6e 29 20 29  ext(pValue),n) )
1020: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1030: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1040: 20 20 72 65 74 75 72 6e 20 6e 31 21 3d 6e 32 3b    return n1!=n2;
1050: 0a 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  . .  }.  return 
1060: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74  1;.}../*.** Stat
1070: 31 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20  1 for an index. 
1080: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
1090: 20 69 66 20 61 6e 20 65 6e 74 72 79 20 77 61 73   if an entry was
10a0: 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 73 74 61   created..*/.sta
10b0: 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 49  tic int analyzeI
10c0: 6e 64 65 78 28 63 6f 6e 73 74 20 63 68 61 72 20  ndex(const char 
10d0: 2a 7a 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *zTab, const cha
10e0: 72 20 2a 7a 49 64 78 29 7b 0a 20 20 73 71 6c 69  r *zIdx){.  sqli
10f0: 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20 65 73  te3_int64 n = es
1100: 74 45 6e 74 72 79 43 6f 75 6e 74 28 7a 49 64 78  tEntryCount(zIdx
1110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  );.  sqlite3_stm
1120: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69  t *pStmt;.  sqli
1130: 74 65 33 5f 75 69 6e 74 36 34 20 2a 61 43 6e 74  te3_uint64 *aCnt
1140: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1150: 65 20 2a 2a 61 70 56 61 6c 75 65 3b 0a 20 20 69  e **apValue;.  i
1160: 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  nt nCol = 0;.  i
1170: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
1180: 69 2c 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 69  i, j, k;.  int i
1190: 4c 69 6d 69 74 3b 0a 20 20 69 6e 74 20 6e 52 6f  Limit;.  int nRo
11a0: 77 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  w = 0;.  char *z
11b0: 52 65 73 3b 0a 20 20 69 6e 74 20 73 7a 52 65 73  Res;.  int szRes
11c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 20 64  ;.  int rc;..# d
11d0: 65 66 69 6e 65 20 4e 5f 53 50 41 4e 20 20 35 0a  efine N_SPAN  5.
11e0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74    if( n==0 ) ret
11f0: 75 72 6e 20 30 3b 0a 20 20 70 53 74 6d 74 20 3d  urn 0;.  pStmt =
1200: 20 64 62 5f 70 72 65 70 61 72 65 28 22 50 52 41   db_prepare("PRA
1210: 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f 3d  GMA index_xinfo=
1220: 5c 22 25 77 5c 22 22 2c 20 7a 49 64 78 29 3b 0a  \"%w\"", zIdx);.
1230: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1240: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
1250: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1260: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1270: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
1280: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1290: 74 65 78 74 28 70 53 74 6d 74 2c 34 29 3b 0a 20  text(pStmt,4);. 
12a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
12b0: 74 72 69 63 6d 70 28 7a 43 6f 6c 6c 2c 22 62 69  tricmp(zColl,"bi
12c0: 6e 61 72 79 22 29 21 3d 30 20 29 7b 0a 20 20 20  nary")!=0 ){.   
12d0: 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 63 61     printf("-- ca
12e0: 6e 6e 6f 74 20 61 6e 61 6c 79 7a 65 20 69 6e 64  nnot analyze ind
12f0: 65 78 20 5c 22 25 73 5c 22 20 62 65 63 61 75 73  ex \"%s\" becaus
1300: 65 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  e column \"%s\" 
1310: 75 73 65 73 22 0a 20 20 20 20 20 20 20 20 20 20  uses".          
1320: 20 20 20 22 20 63 6f 6c 6c 61 74 69 6e 67 20 73     " collating s
1330: 65 71 75 65 6e 63 65 20 5c 22 25 73 5c 22 2e 5c  equence \"%s\".\
1340: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1350: 20 7a 49 64 78 2c 20 73 71 6c 69 74 65 33 5f 63   zIdx, sqlite3_c
1360: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
1370: 2c 20 32 29 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  , 2), zColl);.  
1380: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1390: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
13a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
13b0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
13c0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
13d0: 74 6d 74 2c 20 35 29 3d 3d 30 20 29 20 62 72 65  tmt, 5)==0 ) bre
13e0: 61 6b 3b 0a 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a  ak;.    nCol++;.
13f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
1400: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1410: 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72   if( nCol==0 ) r
1420: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
1430: 20 3d 20 28 73 69 7a 65 6f 66 28 61 43 6e 74 5b   = (sizeof(aCnt[
1440: 30 5d 29 20 2b 20 73 69 7a 65 6f 66 28 61 70 56  0]) + sizeof(apV
1450: 61 6c 75 65 5b 30 5d 29 29 2a 6e 43 6f 6c 20 2b  alue[0]))*nCol +
1460: 20 33 30 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20   30*(nCol+1);.  
1470: 61 43 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aCnt = sqlite3_m
1480: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
1490: 20 20 69 66 28 20 61 43 6e 74 3d 3d 30 20 29 7b    if( aCnt==0 ){
14a0: 0a 20 20 20 20 72 75 6e 74 69 6d 65 45 72 72 6f  .    runtimeErro
14b0: 72 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r("out of memory
14c0: 22 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ");.  }.  memset
14d0: 28 61 43 6e 74 2c 20 30 2c 20 6e 42 79 74 65 29  (aCnt, 0, nByte)
14e0: 3b 0a 20 20 61 70 56 61 6c 75 65 20 3d 20 28 73  ;.  apValue = (s
14f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 26  qlite3_value**)&
1500: 61 43 6e 74 5b 6e 43 6f 6c 5d 3b 0a 20 20 7a 52  aCnt[nCol];.  zR
1510: 65 73 20 3d 20 28 63 68 61 72 2a 29 26 61 70 56  es = (char*)&apV
1520: 61 6c 75 65 5b 6e 43 6f 6c 5d 3b 0a 20 20 73 7a  alue[nCol];.  sz
1530: 52 65 73 20 3d 20 33 30 2a 28 6e 43 6f 6c 2b 31  Res = 30*(nCol+1
1540: 29 3b 0a 0a 20 20 69 4c 69 6d 69 74 20 3d 20 6e  );..  iLimit = n
1550: 3e 31 30 30 30 30 20 3f 20 31 30 30 20 3a 20 32  >10000 ? 100 : 2
1560: 30 30 30 30 3b 0a 20 20 70 53 74 6d 74 20 3d 20  0000;.  pStmt = 
1570: 64 62 5f 70 72 65 70 61 72 65 28 22 50 52 41 47  db_prepare("PRAG
1580: 4d 41 20 62 74 72 65 65 5f 73 61 6d 70 6c 65 28  MA btree_sample(
1590: 5c 22 25 77 5c 22 2c 30 2e 30 2c 25 6c 6c 64 29  \"%w\",0.0,%lld)
15a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15b0: 20 20 20 20 20 20 20 20 7a 49 64 78 2c 20 6e 2a          zIdx, n*
15c0: 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
15d0: 3c 4e 5f 53 50 41 4e 3b 20 69 2b 2b 29 7b 0a 20  <N_SPAN; i++){. 
15e0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 77 68     k = 0;.    wh
15f0: 69 6c 65 28 20 6b 3c 69 4c 69 6d 69 74 20 26 26  ile( k<iLimit &&
1600: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73   (rc = sqlite3_s
1610: 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c  tep(pStmt))==SQL
1620: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
1630: 20 69 6e 74 20 69 46 69 72 73 74 3b 0a 20 20 20   int iFirst;.   
1640: 20 20 20 66 6f 72 28 69 46 69 72 73 74 3d 30 3b     for(iFirst=0;
1650: 20 69 46 69 72 73 74 3c 6e 43 6f 6c 3b 20 69 46   iFirst<nCol; iF
1660: 69 72 73 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  irst++){.       
1670: 20 69 66 28 20 61 70 56 61 6c 75 65 5b 69 46 69   if( apValue[iFi
1680: 72 73 74 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  rst]==0 ) break;
1690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
16a0: 75 6d 6e 4e 6f 74 45 71 75 61 6c 28 70 53 74 6d  umnNotEqual(pStm
16b0: 74 2c 20 69 46 69 72 73 74 2c 20 61 70 56 61 6c  t, iFirst, apVal
16c0: 75 65 5b 69 46 69 72 73 74 5d 29 20 29 20 62 72  ue[iFirst]) ) br
16d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16e0: 20 20 20 66 6f 72 28 6a 3d 69 46 69 72 73 74 3b     for(j=iFirst;
16f0: 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20   j<nCol; j++){. 
1700: 20 20 20 20 20 20 20 61 43 6e 74 5b 6a 5d 2b 2b         aCnt[j]++
1710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1720: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 61 70 56  3_value_free(apV
1730: 61 6c 75 65 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  alue[j]);.      
1740: 20 20 61 70 56 61 6c 75 65 5b 6a 5d 20 3d 20 73    apValue[j] = s
1750: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70  qlite3_value_dup
1760: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
1770: 76 61 6c 75 65 28 70 53 74 6d 74 2c 6a 29 29 3b  value(pStmt,j));
1780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1790: 52 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 6b 2b 2b  Row++;.      k++
17a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17b0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
17c0: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  mt);.    if( rc!
17d0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 69  =SQLITE_ROW || i
17e0: 3d 3d 4e 5f 53 50 41 4e 2d 31 20 29 20 62 72 65  ==N_SPAN-1 ) bre
17f0: 61 6b 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  ak;.    pStmt = 
1800: 64 62 5f 70 72 65 70 61 72 65 28 22 50 52 41 47  db_prepare("PRAG
1810: 4d 41 20 62 74 72 65 65 5f 73 61 6d 70 6c 65 28  MA btree_sample(
1820: 5c 22 25 77 5c 22 2c 25 67 2c 25 6c 6c 64 29 22  \"%w\",%g,%lld)"
1830: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1840: 20 20 20 20 20 20 20 20 20 7a 49 64 78 2c 20 28           zIdx, (
1850: 28 64 6f 75 62 6c 65 29 69 29 2f 28 64 6f 75 62  (double)i)/(doub
1860: 6c 65 29 4e 5f 53 50 41 4e 2c 20 6e 2a 32 29 3b  le)N_SPAN, n*2);
1870: 0a 20 20 7d 20 20 0a 20 20 66 6f 72 28 6a 3d 30  .  }  .  for(j=0
1880: 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29 20 73  ; j<nCol; j++) s
1890: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65  qlite3_value_fre
18a0: 65 28 61 70 56 61 6c 75 65 5b 6a 5d 29 3b 0a 20  e(apValue[j]);. 
18b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18c0: 66 28 73 7a 52 65 73 2c 20 7a 52 65 73 2c 20 22  f(szRes, zRes, "
18d0: 25 6c 6c 64 22 2c 20 6e 29 3b 0a 20 20 6b 20 3d  %lld", n);.  k =
18e0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 52 65   (int)strlen(zRe
18f0: 73 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  s);.  for(j=0; j
1900: 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nCol; j++){.   
1910: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1920: 66 28 73 7a 52 65 73 2d 6b 2c 20 7a 52 65 73 2b  f(szRes-k, zRes+
1930: 6b 2c 20 22 20 25 64 22 2c 20 28 6e 52 6f 77 2b  k, " %d", (nRow+
1940: 61 43 6e 74 5b 6a 5d 2d 31 29 2f 61 43 6e 74 5b  aCnt[j]-1)/aCnt[
1950: 6a 5d 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 28 69  j]);.    k += (i
1960: 6e 74 29 73 74 72 6c 65 6e 28 7a 52 65 73 2b 6b  nt)strlen(zRes+k
1970: 29 3b 0a 20 20 7d 0a 20 20 70 53 74 6d 74 20 3d  );.  }.  pStmt =
1980: 20 64 62 5f 70 72 65 70 61 72 65 28 0a 20 20 20   db_prepare(.   
1990: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
19a0: 65 6d 70 2e 65 73 74 5f 73 74 61 74 31 28 74 62  emp.est_stat1(tb
19b0: 6c 2c 69 64 78 2c 73 74 61 74 29 22 0a 20 20 20  l,idx,stat)".   
19c0: 20 20 22 56 41 4c 55 45 53 28 5c 22 25 77 5c 22    "VALUES(\"%w\"
19d0: 2c 5c 22 25 77 5c 22 2c 27 25 73 27 29 22 2c 20  ,\"%w\",'%s')", 
19e0: 7a 54 61 62 2c 20 7a 49 64 78 2c 20 7a 52 65 73  zTab, zIdx, zRes
19f0: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  .  );.  sqlite3_
1a00: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 73  step(pStmt);.  s
1a10: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1a20: 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
1a30: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61   1;.}../*.** Sta
1a40: 74 31 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  t1 for a table..
1a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1a60: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 63 6f 6e 73  nalyzeTable(cons
1a70: 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
1a80: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1a90: 20 3d 20 65 73 74 45 6e 74 72 79 43 6f 75 6e 74   = estEntryCount
1aa0: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
1ab0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1ac0: 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20 30 3b   int nIndex = 0;
1ad0: 0a 20 20 69 6e 74 20 69 73 57 69 74 68 6f 75 74  .  int isWithout
1ae0: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  Rowid = 0;.  if(
1af0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 70 72 69   n==0 ){.    pri
1b00: 6e 74 66 28 22 2d 2d 20 65 6d 70 74 79 20 74 61  ntf("-- empty ta
1b10: 62 6c 65 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62  ble: %s\n", zTab
1b20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1b30: 20 7d 0a 20 20 69 66 28 20 61 6e 61 6c 79 7a 65   }.  if( analyze
1b40: 49 6e 64 65 78 28 7a 54 61 62 2c 7a 54 61 62 29  Index(zTab,zTab)
1b50: 20 29 7b 0a 20 20 20 20 69 73 57 69 74 68 6f 75   ){.    isWithou
1b60: 74 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20  tRowid = 1;.    
1b70: 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20  nIndex++;.  }.  
1b80: 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61  pStmt = db_prepa
1b90: 72 65 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  re("PRAGMA index
1ba0: 5f 6c 69 73 74 28 5c 22 25 77 5c 22 29 22 2c 20  _list(\"%w\")", 
1bb0: 7a 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  zTab);.  while( 
1bc0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1bd0: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
1be0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1bf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1c00: 53 74 6d 74 2c 33 29 5b 30 5d 3d 3d 27 70 27 20  Stmt,3)[0]=='p' 
1c10: 26 26 20 69 73 57 69 74 68 6f 75 74 52 6f 77 69  && isWithoutRowi
1c20: 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
1c30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
1c40: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 34  lumn_int(pStmt,4
1c50: 29 3d 3d 30 20 29 20 6e 49 6e 64 65 78 2b 2b 3b  )==0 ) nIndex++;
1c60: 0a 20 20 20 20 61 6e 61 6c 79 7a 65 49 6e 64 65  .    analyzeInde
1c70: 78 28 7a 54 61 62 2c 20 28 63 6f 6e 73 74 20 63  x(zTab, (const c
1c80: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
1c90: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31  umn_text(pStmt,1
1ca0: 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
1cb0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1cc0: 29 3b 0a 20 20 69 66 28 20 6e 49 6e 64 65 78 3d  );.  if( nIndex=
1cd0: 3d 30 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 20  =0 ){.    pStmt 
1ce0: 3d 20 64 62 5f 70 72 65 70 61 72 65 28 0a 20 20  = db_prepare(.  
1cf0: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1d00: 4f 20 74 65 6d 70 2e 65 73 74 5f 73 74 61 74 31  O temp.est_stat1
1d10: 28 74 62 6c 2c 69 64 78 2c 73 74 61 74 29 22 0a  (tbl,idx,stat)".
1d20: 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 5c         "VALUES(\
1d30: 22 25 77 5c 22 2c 4e 55 4c 4c 2c 27 25 6c 6c 64  "%w\",NULL,'%lld
1d40: 27 29 22 2c 20 7a 54 61 62 2c 20 6e 0a 20 20 20  ')", zTab, n.   
1d50: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1d60: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
1d70: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1d80: 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 7d 0a  e(pStmt);.  }.}.
1d90: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
1da0: 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  e sqlite3_value 
1db0: 58 20 61 73 20 61 6e 20 53 51 4c 20 6c 69 74 65  X as an SQL lite
1dc0: 72 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ral..*/.static v
1dd0: 6f 69 64 20 70 72 69 6e 74 51 75 6f 74 65 64 28  oid printQuoted(
1de0: 46 49 4c 45 20 2a 6f 75 74 2c 20 73 71 6c 69 74  FILE *out, sqlit
1df0: 65 33 5f 76 61 6c 75 65 20 2a 58 29 7b 0a 20 20  e3_value *X){.  
1e00: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
1e10: 76 61 6c 75 65 5f 74 79 70 65 28 58 29 20 29 7b  value_type(X) ){
1e20: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e30: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1e40: 64 6f 75 62 6c 65 20 72 31 3b 0a 20 20 20 20 20  double r1;.     
1e50: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1e60: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1e70: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
1e80: 58 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  X);.      sqlite
1e90: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1ea0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
1eb0: 25 21 2e 31 35 67 22 2c 20 72 31 29 3b 0a 20 20  %!.15g", r1);.  
1ec0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ed0: 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20   "%s", zBuf);.  
1ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ef0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f00: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1f10: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1f20: 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 76  %lld", sqlite3_v
1f30: 61 6c 75 65 5f 69 6e 74 36 34 28 58 29 29 3b 0a  alue_int64(X));.
1f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f50: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f60: 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
1f70: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f80: 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 73 71  char *zBlob = sq
1f90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
1fa0: 28 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  (X);.      int n
1fb0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
1fc0: 61 6c 75 65 5f 62 79 74 65 73 28 58 29 3b 0a 20  alue_bytes(X);. 
1fd0: 20 20 20 20 20 69 66 28 20 7a 42 6c 6f 62 20 29       if( zBlob )
1fe0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
1ff0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
2000: 28 6f 75 74 2c 20 22 78 27 22 29 3b 0a 20 20 20  (out, "x'");.   
2010: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2020: 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  nBlob; i++){.   
2030: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
2040: 75 74 2c 20 22 25 30 32 78 22 2c 20 7a 42 6c 6f  ut, "%02x", zBlo
2050: 62 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  b[i]);.        }
2060: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
2070: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
2080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2090: 20 2f 2a 20 43 6f 75 6c 64 20 62 65 20 61 6e 20   /* Could be an 
20a0: 4f 4f 4d 2c 20 63 6f 75 6c 64 20 62 65 20 61 20  OOM, could be a 
20b0: 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 20 2a  zero-byte blob *
20c0: 2f 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  /.        fprint
20d0: 66 28 6f 75 74 2c 20 22 58 27 27 22 29 3b 0a 20  f(out, "X''");. 
20e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
20f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2100: 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20  se SQLITE_TEXT: 
2110: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e  {.      const un
2120: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 41 72  signed char *zAr
2130: 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  g = sqlite3_valu
2140: 65 5f 74 65 78 74 28 58 29 3b 0a 20 20 20 20 20  e_text(X);.     
2150: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 20 20   int i, j;..    
2160: 20 20 69 66 28 20 7a 41 72 67 3d 3d 30 20 29 7b    if( zArg==0 ){
2170: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
2180: 28 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  (out, "NULL");. 
2190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21a0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
21b0: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 66   "'");.        f
21c0: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 41 72 67 5b 69  or(i=j=0; zArg[i
21d0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
21e0: 20 20 20 69 66 28 20 7a 41 72 67 5b 69 5d 3d 3d     if( zArg[i]==
21f0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
2200: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
2210: 20 22 25 2e 2a 73 27 22 2c 20 69 2d 6a 2b 31 2c   "%.*s'", i-j+1,
2220: 20 26 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20   &zArg[j]);.    
2230: 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b          j = i+1;
2240: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2260: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 27  printf(out, "%s'
2270: 22 2c 20 26 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20  ", &zArg[j]);.  
2280: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2290: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22a0: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
22b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
22c0: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
22d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74    }.}../*.** Out
22f0: 70 75 74 20 53 51 4c 20 74 68 61 74 20 77 69 6c  put SQL that wil
2300: 6c 20 72 65 63 72 65 61 74 65 20 74 68 65 20 61  l recreate the a
2310: 75 78 2e 7a 54 61 62 20 74 61 62 6c 65 2e 0a 2a  ux.zTab table..*
2320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 75  /.static void du
2330: 6d 70 5f 74 61 62 6c 65 28 63 6f 6e 73 74 20 63  mp_table(const c
2340: 68 61 72 20 2a 7a 54 61 62 2c 20 63 6f 6e 73 74  har *zTab, const
2350: 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 29 7b 0a   char *zAlias){.
2360: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2380: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2390: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
23a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23b0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
23c0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  olumns */.  sqli
23d0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
23e0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
23f0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
2400: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20  t char *zSep;   
2410: 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74        /* Separat
2420: 6f 72 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20  or string */..  
2430: 70 53 74 6d 74 20 3d 20 64 62 5f 70 72 65 70 61  pStmt = db_prepa
2440: 72 65 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  re("SELECT * FRO
2450: 4d 20 25 73 22 2c 20 7a 54 61 62 29 3b 0a 20 20  M %s", zTab);.  
2460: 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
2470: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
2480: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  t);.  while( SQL
2490: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
24a0: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
24b0: 20 20 20 20 70 72 69 6e 74 66 28 22 49 4e 53 45      printf("INSE
24c0: 52 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55 45  RT INTO %s VALUE
24d0: 53 22 2c 20 7a 41 6c 69 61 73 29 3b 0a 20 20 20  S", zAlias);.   
24e0: 20 7a 53 65 70 20 3d 20 22 28 22 3b 0a 20 20 20   zSep = "(";.   
24f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
2500: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70  ; i++){.      fp
2510: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
2520: 73 22 2c 7a 53 65 70 29 3b 0a 20 20 20 20 20 20  s",zSep);.      
2530: 70 72 69 6e 74 51 75 6f 74 65 64 28 73 74 64 6f  printQuoted(stdo
2540: 75 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ut, sqlite3_colu
2550: 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 69  mn_value(pStmt,i
2560: 29 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d  ));.      zSep =
2570: 20 22 2c 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20   ",";.    }.    
2580: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
2590: 22 29 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73  ");\n");.  }.  s
25a0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
25b0: 70 53 74 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pStmt);.}.../*.*
25c0: 2a 20 50 72 69 6e 74 20 73 6b 65 74 63 68 79 20  * Print sketchy 
25d0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
25e0: 72 20 74 68 69 73 20 75 74 69 6c 69 74 79 20 70  r this utility p
25f0: 72 6f 67 72 61 6d 0a 2a 2f 0a 73 74 61 74 69 63  rogram.*/.static
2600: 20 76 6f 69 64 20 73 68 6f 77 48 65 6c 70 28 76   void showHelp(v
2610: 6f 69 64 29 7b 0a 20 20 70 72 69 6e 74 66 28 22  oid){.  printf("
2620: 55 73 61 67 65 3a 20 25 73 20 5b 6f 70 74 69 6f  Usage: %s [optio
2630: 6e 73 5d 20 44 42 46 49 4c 45 5c 6e 22 2c 20 67  ns] DBFILE\n", g
2640: 2e 7a 41 72 67 76 30 29 3b 0a 20 20 70 72 69 6e  .zArgv0);.  prin
2650: 74 66 28 0a 22 47 65 6e 65 72 61 74 65 20 61 6e  tf(."Generate an
2660: 20 61 70 70 72 6f 78 69 6d 61 74 65 20 73 71 6c   approximate sql
2670: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
2680: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2690: 20 69 6e 20 74 68 65 20 44 42 46 49 4c 45 5c 6e   in the DBFILE\n
26a0: 22 0a 22 66 69 6c 65 2e 20 57 72 69 74 65 20 74  "."file. Write t
26b0: 68 65 20 72 65 73 75 6c 74 20 74 6f 20 73 74 61  he result to sta
26c0: 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 5c 6e 22  ndard output.\n"
26d0: 0a 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20  ."Options:\n"." 
26e0: 20 28 6e 6f 6e 65 20 79 65 74 2e 2e 2e 2e 29 5c   (none yet....)\
26f0: 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74 20 6d  n".  );.}..int m
2700: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
2710: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ar **argv){.  co
2720: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
2730: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
2740: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
2750: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c  rrMsg = 0;.  sql
2760: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2770: 3b 0a 0a 20 20 67 2e 7a 41 72 67 76 30 20 3d 20  ;..  g.zArgv0 = 
2780: 61 72 67 76 5b 30 5d 3b 0a 20 20 73 71 6c 69 74  argv[0];.  sqlit
2790: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
27a0: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
27b0: 52 45 41 44 29 3b 0a 20 20 66 6f 72 28 69 3d 31  READ);.  for(i=1
27c0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
27d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27e0: 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20  z = argv[i];.   
27f0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
2800: 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  {.      z++;.   
2810: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
2820: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
2830: 28 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75  ( strcmp(z,"debu
2840: 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
2850: 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20    if( i==argc-1 
2860: 29 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22  ) cmdlineError("
2870: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
2880: 20 74 6f 20 25 73 22 2c 20 61 72 67 76 5b 69 5d   to %s", argv[i]
2890: 29 3b 0a 20 20 20 20 20 20 20 20 67 2e 66 44 65  );.        g.fDe
28a0: 62 75 67 20 3d 20 73 74 72 74 6f 6c 28 61 72 67  bug = strtol(arg
28b0: 76 5b 2b 2b 69 5d 2c 20 30 2c 20 30 29 3b 0a 20  v[++i], 0, 0);. 
28c0: 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
28d0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 68   if( strcmp(z,"h
28e0: 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  elp")==0 ){.    
28f0: 20 20 20 20 73 68 6f 77 48 65 6c 70 28 29 3b 0a      showHelp();.
2900: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
2920: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6d      {.        cm
2930: 64 6c 69 6e 65 45 72 72 6f 72 28 22 75 6e 6b 6e  dlineError("unkn
2940: 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c  own option: %s",
2950: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
2960: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2970: 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zDb==0 ){.     
2980: 20 7a 44 62 20 3d 20 61 72 67 76 5b 69 5d 3b 0a   zDb = argv[i];.
2990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29a0: 20 63 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 75   cmdlineError("u
29b0: 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a  nknown argument:
29c0: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
29d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
29e0: 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6d  zDb==0 ){.    cm
29f0: 64 6c 69 6e 65 45 72 72 6f 72 28 22 64 61 74 61  dlineError("data
2a00: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 72 65  base filename re
2a10: 71 75 69 72 65 64 22 29 3b 0a 20 20 7d 0a 20 20  quired");.  }.  
2a20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2a30: 6e 28 7a 44 62 2c 20 26 67 2e 64 62 29 3b 0a 20  n(zDb, &g.db);. 
2a40: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63   if( rc ){.    c
2a50: 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 63 61 6e  mdlineError("can
2a60: 6e 6f 74 20 6f 70 65 6e 20 64 61 74 61 62 61 73  not open databas
2a70: 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 22 2c 20  e file \"%s\"", 
2a80: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  zDb);.  }.  rc =
2a90: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e   sqlite3_exec(g.
2aa0: 64 62 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  db, "SELECT * FR
2ab0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2ac0: 22 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  ", 0, 0, &zErrMs
2ad0: 67 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20  g);.  if( rc || 
2ae0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63  zErrMsg ){.    c
2af0: 6d 64 6c 69 6e 65 45 72 72 6f 72 28 22 5c 22 25  mdlineError("\"%
2b00: 73 5c 22 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  s\" does not app
2b10: 65 61 72 20 74 6f 20 62 65 20 61 20 76 61 6c 69  ear to be a vali
2b20: 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
2b30: 65 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  e", zDb);.  }.  
2b40: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2b50: 63 28 67 2e 64 62 2c 20 22 43 52 45 41 54 45 20  c(g.db, "CREATE 
2b60: 54 45 4d 50 20 54 41 42 4c 45 20 65 73 74 5f 73  TEMP TABLE est_s
2b70: 74 61 74 31 28 74 62 6c 2c 69 64 78 2c 73 74 61  tat1(tbl,idx,sta
2b80: 74 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20  t);",.          
2b90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
2ba0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
2bb0: 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29   rc || zErrMsg )
2bc0: 7b 0a 20 20 20 20 63 6d 64 6c 69 6e 65 45 72 72  {.    cmdlineErr
2bd0: 6f 72 28 22 43 61 6e 6e 6f 74 20 43 52 45 41 54  or("Cannot CREAT
2be0: 45 20 54 45 4d 50 20 54 41 42 4c 45 22 29 3b 0a  E TEMP TABLE");.
2bf0: 20 20 7d 0a 20 20 70 53 74 6d 74 20 3d 20 64 62    }.  pStmt = db
2c00: 5f 70 72 65 70 61 72 65 28 22 53 45 4c 45 43 54  _prepare("SELECT
2c10: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
2c20: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2c40: 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
2c50: 6c 65 27 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  le' AND rootpage
2c60: 3e 30 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  >0".            
2c70: 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44           "   AND
2c80: 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
2c90: 73 71 6c 69 74 65 5f 25 25 27 22 0a 20 20 20 20  sqlite_%%'".    
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65   " ORDER BY name
2cc0: 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  ");.  while( sql
2cd0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2ce0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2cf0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2d00: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
2d10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2d20: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
2d30: 30 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 54  0);.    analyzeT
2d40: 61 62 6c 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  able(zName);.  }
2d50: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
2d60: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 64 75  ize(pStmt);.  du
2d70: 6d 70 5f 74 61 62 6c 65 28 22 74 65 6d 70 2e 65  mp_table("temp.e
2d80: 73 74 5f 73 74 61 74 31 22 2c 22 73 71 6c 69 74  st_stat1","sqlit
2d90: 65 5f 73 74 61 74 31 22 29 3b 0a 20 20 73 71 6c  e_stat1");.  sql
2da0: 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29  ite3_close(g.db)
2db0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.