/ Hex Artifact Content
Login

Artifact 33842ef151d84c5f8000f9c7b938998c6b999eaef7ce1f4eeb0df8ffe6739496:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 20 41 70 72 69 6c  /*.** 2017 April
0010: 20 30 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   07.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
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 2a  ****************
0170: 2a 2a 0a 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65  **.*/...#include
0180: 20 3c 73 71 6c 69 74 65 33 2e 68 3e 0a 23 69 6e   <sqlite3.h>.#in
0190: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
01a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
01b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
01c0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
01d0: 20 22 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e   "sqlite3expert.
01e0: 68 22 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  h"...static void
01f0: 20 6f 70 74 69 6f 6e 5f 72 65 71 75 69 72 65 73   option_requires
0200: 5f 61 72 67 75 6d 65 6e 74 28 63 6f 6e 73 74 20  _argument(const 
0210: 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 66  char *zOpt){.  f
0220: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0230: 4f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  Option requires 
0240: 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c  an argument: %s\
0250: 6e 22 2c 20 7a 4f 70 74 29 3b 0a 20 20 65 78 69  n", zOpt);.  exi
0260: 74 28 2d 33 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  t(-3);.}..static
0270: 20 69 6e 74 20 6f 70 74 69 6f 6e 5f 69 6e 74 65   int option_inte
0280: 67 65 72 5f 61 72 67 28 63 6f 6e 73 74 20 63 68  ger_arg(const ch
0290: 61 72 20 2a 7a 56 61 6c 29 7b 0a 20 20 72 65 74  ar *zVal){.  ret
02a0: 75 72 6e 20 61 74 6f 69 28 7a 56 61 6c 29 3b 0a  urn atoi(zVal);.
02b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  }..static void u
02c0: 73 61 67 65 28 63 68 61 72 20 2a 2a 61 72 67 76  sage(char **argv
02d0: 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  ){.  fprintf(std
02e0: 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 20 20 66 70  err, "\n");.  fp
02f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
0300: 73 61 67 65 20 25 73 20 3f 4f 50 54 49 4f 4e 53  sage %s ?OPTIONS
0310: 3f 20 44 41 54 41 42 41 53 45 5c 6e 22 2c 20 61  ? DATABASE\n", a
0320: 72 67 76 5b 30 5d 29 3b 0a 20 20 66 70 72 69 6e  rgv[0]);.  fprin
0330: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
0340: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
0350: 72 72 2c 20 22 4f 70 74 69 6f 6e 73 20 61 72 65  rr, "Options are
0360: 3a 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66  :\n");.  fprintf
0370: 28 73 74 64 65 72 72 2c 20 22 20 20 2d 73 71 6c  (stderr, "  -sql
0380: 20 53 51 4c 20 20 20 28 61 6e 61 6c 79 7a 65 20   SQL   (analyze 
0390: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 70  SQL statements p
03a0: 61 73 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e  assed as argumen
03b0: 74 29 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74  t)\n");.  fprint
03c0: 66 28 73 74 64 65 72 72 2c 20 22 20 20 2d 66 69  f(stderr, "  -fi
03d0: 6c 65 20 46 49 4c 45 20 28 72 65 61 64 20 53 51  le FILE (read SQ
03e0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f  L statements fro
03f0: 6d 20 66 69 6c 65 20 46 49 4c 45 29 5c 6e 22 29  m file FILE)\n")
0400: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
0410: 72 72 2c 20 22 20 20 2d 76 65 72 62 6f 73 65 20  rr, "  -verbose 
0420: 4c 45 56 45 4c 20 28 69 6e 74 65 67 65 72 20 76  LEVEL (integer v
0430: 65 72 62 6f 73 69 74 79 20 6c 65 76 65 6c 2e 20  erbosity level. 
0440: 64 65 66 61 75 6c 74 20 31 29 5c 6e 22 29 3b 0a  default 1)\n");.
0450: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0460: 2c 20 22 20 20 2d 73 61 6d 70 6c 65 20 50 45 52  , "  -sample PER
0470: 43 45 4e 54 20 28 70 65 72 63 65 6e 74 20 6f 66  CENT (percent of
0480: 20 64 62 20 74 6f 20 73 61 6d 70 6c 65 2e 20 64   db to sample. d
0490: 65 66 61 75 6c 74 20 31 30 30 29 5c 6e 22 29 3b  efault 100)\n");
04a0: 0a 20 20 65 78 69 74 28 2d 31 29 3b 0a 7d 0a 0a  .  exit(-1);.}..
04b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 53  static int readS
04c0: 71 6c 46 72 6f 6d 46 69 6c 65 28 73 71 6c 69 74  qlFromFile(sqlit
04d0: 65 33 65 78 70 65 72 74 20 2a 70 2c 20 63 6f 6e  e3expert *p, con
04e0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  st char *zFile, 
04f0: 63 68 61 72 20 2a 2a 70 7a 45 72 72 29 7b 0a 20  char **pzErr){. 
0500: 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65   FILE *in = fope
0510: 6e 28 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  n(zFile, "rb");.
0520: 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69    long nIn;.  si
0530: 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68  ze_t nRead;.  ch
0540: 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 6e 74 20  ar *pBuf;.  int 
0550: 72 63 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  rc;.  if( in==0 
0560: 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  ){.    *pzErr = 
0570: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
0580: 22 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "failed to open 
0590: 66 69 6c 65 20 25 73 5c 6e 22 2c 20 7a 46 69 6c  file %s\n", zFil
05a0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
05b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
05c0: 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20  .  fseek(in, 0, 
05d0: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e  SEEK_END);.  nIn
05e0: 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20   = ftell(in);.  
05f0: 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42  rewind(in);.  pB
0600: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  uf = sqlite3_mal
0610: 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a  loc64( nIn+1 );.
0620: 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28    nRead = fread(
0630: 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e  pBuf, nIn, 1, in
0640: 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  );.  fclose(in);
0650: 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20  .  if( nRead!=1 
0660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
0670: 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 2a  ree(pBuf);.    *
0680: 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
0690: 6d 70 72 69 6e 74 66 28 22 66 61 69 6c 65 64 20  mprintf("failed 
06a0: 74 6f 20 72 65 61 64 20 66 69 6c 65 20 25 73 5c  to read file %s\
06b0: 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
06c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
06d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b  ROR;.  }.  pBuf[
06e0: 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d  nIn] = 0;.  rc =
06f0: 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
0700: 73 71 6c 28 70 2c 20 70 42 75 66 2c 20 70 7a 45  sql(p, pBuf, pzE
0710: 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rr);.  sqlite3_f
0720: 72 65 65 28 70 42 75 66 29 3b 0a 20 20 72 65 74  ree(pBuf);.  ret
0730: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6d  urn rc;.}..int m
0740: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
0750: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ar **argv){.  co
0760: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
0770: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
0780: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
0790: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 56   int i;.  int iV
07a0: 65 72 62 6f 73 65 20 3d 20 31 3b 20 20 20 20 20  erbose = 1;     
07b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 76 65            /* -ve
07c0: 72 62 6f 73 65 20 6f 70 74 69 6f 6e 20 2a 2f 0a  rbose option */.
07d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
07e0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 65 78 70   0;.  sqlite3exp
07f0: 65 72 74 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 69  ert *p = 0;..  i
0800: 66 28 20 61 72 67 63 3c 32 20 29 20 75 73 61 67  f( argc<2 ) usag
0810: 65 28 61 72 67 76 29 3b 0a 20 20 7a 44 62 20 3d  e(argv);.  zDb =
0820: 20 61 72 67 76 5b 61 72 67 63 2d 31 5d 3b 0a 20   argv[argc-1];. 
0830: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
0840: 65 6e 28 7a 44 62 2c 20 26 64 62 29 3b 0a 20 20  en(zDb, &db);.  
0850: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
0860: 4b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  K ){.    fprintf
0870: 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
0880: 20 6f 70 65 6e 20 64 62 20 66 69 6c 65 3a 20 25   open db file: %
0890: 73 20 2d 20 25 73 5c 6e 22 2c 20 7a 44 62 2c 20  s - %s\n", zDb, 
08a0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
08b0: 62 29 29 3b 0a 20 20 20 20 65 78 69 74 28 2d 32  b));.    exit(-2
08c0: 29 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  );.  }..  p = sq
08d0: 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77  lite3_expert_new
08e0: 28 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  (db, &zErr);.  i
08f0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( p==0 ){.    f
0900: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0910: 43 61 6e 6e 6f 74 20 72 75 6e 20 61 6e 61 6c 79  Cannot run analy
0920: 73 69 73 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  sis: %s\n", zErr
0930: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
0940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
0950: 69 3d 31 3b 20 69 3c 28 61 72 67 63 2d 31 29 3b  i=1; i<(argc-1);
0960: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
0970: 72 20 2a 7a 41 72 67 20 3d 20 61 72 67 76 5b 69  r *zArg = argv[i
0980: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72  ];.      int nAr
0990: 67 20 3d 20 73 74 72 6c 65 6e 28 7a 41 72 67 29  g = strlen(zArg)
09a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
09b0: 3e 3d 32 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >=2 && 0==sqlite
09c0: 33 5f 73 74 72 6e 69 63 6d 70 28 7a 41 72 67 2c  3_strnicmp(zArg,
09d0: 20 22 2d 66 69 6c 65 22 2c 20 6e 41 72 67 29 20   "-file", nArg) 
09e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2b  ){.        if( +
09f0: 2b 69 3d 3d 28 61 72 67 63 2d 31 29 20 29 20 6f  +i==(argc-1) ) o
0a00: 70 74 69 6f 6e 5f 72 65 71 75 69 72 65 73 5f 61  ption_requires_a
0a10: 72 67 75 6d 65 6e 74 28 22 2d 66 69 6c 65 22 29  rgument("-file")
0a20: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ;.        rc = r
0a30: 65 61 64 53 71 6c 46 72 6f 6d 46 69 6c 65 28 70  eadSqlFromFile(p
0a40: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 7a 45 72 72  , argv[i], &zErr
0a50: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
0a60: 20 20 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e    else if( nArg>
0a70: 3d 33 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  =3 && 0==sqlite3
0a80: 5f 73 74 72 6e 69 63 6d 70 28 7a 41 72 67 2c 20  _strnicmp(zArg, 
0a90: 22 2d 73 71 6c 22 2c 20 6e 41 72 67 29 20 29 7b  "-sql", nArg) ){
0aa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2b 2b 69  .        if( ++i
0ab0: 3d 3d 28 61 72 67 63 2d 31 29 20 29 20 6f 70 74  ==(argc-1) ) opt
0ac0: 69 6f 6e 5f 72 65 71 75 69 72 65 73 5f 61 72 67  ion_requires_arg
0ad0: 75 6d 65 6e 74 28 22 2d 73 71 6c 22 29 3b 0a 20  ument("-sql");. 
0ae0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
0af0: 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c 28 70  te3_expert_sql(p
0b00: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 7a 45 72 72  , argv[i], &zErr
0b10: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
0b20: 20 20 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e    else if( nArg>
0b30: 3d 33 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  =3 && 0==sqlite3
0b40: 5f 73 74 72 6e 69 63 6d 70 28 7a 41 72 67 2c 20  _strnicmp(zArg, 
0b50: 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 41 72 67 29  "-sample", nArg)
0b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
0b70: 69 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 20  iSample;.       
0b80: 20 69 66 28 20 2b 2b 69 3d 3d 28 61 72 67 63 2d   if( ++i==(argc-
0b90: 31 29 20 29 20 6f 70 74 69 6f 6e 5f 72 65 71 75  1) ) option_requ
0ba0: 69 72 65 73 5f 61 72 67 75 6d 65 6e 74 28 22 2d  ires_argument("-
0bb0: 73 61 6d 70 6c 65 22 29 3b 0a 20 20 20 20 20 20  sample");.      
0bc0: 20 20 69 53 61 6d 70 6c 65 20 3d 20 6f 70 74 69    iSample = opti
0bd0: 6f 6e 5f 69 6e 74 65 67 65 72 5f 61 72 67 28 61  on_integer_arg(a
0be0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
0bf0: 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
0c00: 63 6f 6e 66 69 67 28 70 2c 20 45 58 50 45 52 54  config(p, EXPERT
0c10: 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c 20  _CONFIG_SAMPLE, 
0c20: 69 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20 20  iSample);.      
0c30: 7d 0a 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  }..      else if
0c40: 28 20 6e 41 72 67 3e 3d 32 20 26 26 20 30 3d 3d  ( nArg>=2 && 0==
0c50: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
0c60: 28 7a 41 72 67 2c 20 22 2d 76 65 72 62 6f 73 65  (zArg, "-verbose
0c70: 22 2c 20 6e 41 72 67 29 20 29 7b 0a 20 20 20 20  ", nArg) ){.    
0c80: 20 20 20 20 69 66 28 20 2b 2b 69 3d 3d 28 61 72      if( ++i==(ar
0c90: 67 63 2d 31 29 20 29 20 6f 70 74 69 6f 6e 5f 72  gc-1) ) option_r
0ca0: 65 71 75 69 72 65 73 5f 61 72 67 75 6d 65 6e 74  equires_argument
0cb0: 28 22 2d 76 65 72 62 6f 73 65 22 29 3b 0a 20 20  ("-verbose");.  
0cc0: 20 20 20 20 20 20 69 56 65 72 62 6f 73 65 20 3d        iVerbose =
0cd0: 20 6f 70 74 69 6f 6e 5f 69 6e 74 65 67 65 72 5f   option_integer_
0ce0: 61 72 67 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  arg(argv[i]);.  
0cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 65 6c 73      }..      els
0d00: 65 7b 0a 20 20 20 20 20 20 20 20 75 73 61 67 65  e{.        usage
0d10: 28 61 72 67 76 29 3b 0a 20 20 20 20 20 20 7d 0a  (argv);.      }.
0d20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
0d30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
0d40: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
0d50: 65 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a  e3_expert_analyz
0d60: 65 28 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d  e(p, &zErr);.  }
0d70: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
0d80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
0d90: 20 6e 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65   nQuery = sqlite
0da0: 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28 70  3_expert_count(p
0db0: 29 3b 0a 20 20 20 20 69 66 28 20 69 56 65 72 62  );.    if( iVerb
0dc0: 6f 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 63  ose>0 ){.      c
0dd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 6e 64  onst char *zCand
0de0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
0df0: 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45 58 50  t_report(p,0,EXP
0e00: 45 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49  ERT_REPORT_CANDI
0e10: 44 41 54 45 53 29 3b 0a 20 20 20 20 20 20 66 70  DATES);.      fp
0e20: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 2d  rintf(stdout, "-
0e30: 2d 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d  - Candidates ---
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ------------\n")
0e60: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
0e70: 73 74 64 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  stdout, "%s\n", 
0e80: 7a 43 61 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20  zCand);.    }.  
0e90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75    for(i=0; i<nQu
0ea0: 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ery; i++){.     
0eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0ec0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  l = sqlite3_expe
0ed0: 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20  rt_report(p, i, 
0ee0: 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53 51  EXPERT_REPORT_SQ
0ef0: 4c 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  L);.      const 
0f00: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c  char *zIdx = sql
0f10: 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f  ite3_expert_repo
0f20: 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f  rt(p, i, EXPERT_
0f30: 52 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b  REPORT_INDEXES);
0f40: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
0f50: 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65  r *zEQP = sqlite
0f60: 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
0f70: 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
0f80: 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20  ORT_PLAN);.     
0f90: 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a   if( zIdx==0 ) z
0fa0: 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69  Idx = "(no new i
0fb0: 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20  ndexes)\n";.    
0fc0: 20 20 69 66 28 20 69 56 65 72 62 6f 73 65 3e 30    if( iVerbose>0
0fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
0fe0: 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 2d 2d 20  ntf(stdout, "-- 
0ff0: 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d  Query %d -------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69  -----------\n",i
1020: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  +1);.        fpr
1030: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
1040: 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  \n\n", zSql);.  
1050: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
1060: 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 5c  ntf(stdout, "%s\
1070: 6e 25 73 5c 6e 22 2c 20 7a 49 64 78 2c 20 7a 45  n%s\n", zIdx, zE
1080: 51 50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  QP);.    }.  }el
1090: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
10a0: 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
10b0: 25 73 5c 6e 22 2c 20 7a 45 72 72 20 3f 20 7a 45  %s\n", zErr ? zE
10c0: 72 72 20 3a 20 22 3f 22 29 3b 0a 20 20 7d 0a 0a  rr : "?");.  }..
10d0: 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74    sqlite3_expert
10e0: 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 73  _destroy(p);.  s
10f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
1100: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1110: 7d 0a 0a 0a                                      }...