/ Hex Artifact Content
Login

Artifact 8d345472e0f4e44fc88f5cf489c16dcb77904525:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 4a 75 6c 79 20  /*.** 2005 July 
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f  .** This file co
0180: 6e 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f  ntains code asso
0190: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
01a0: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
01b0: 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64 3a  .**.** @(#) $Id:
01c0: 20 61 6e 61 6c 79 7a 65 2e 63 2c 76 20 31 2e 31   analyze.c,v 1.1
01d0: 39 20 32 30 30 37 2f 30 36 2f 32 30 20 31 33 3a  9 2007/06/20 13:
01e0: 33 37 3a 33 31 20 64 72 68 20 45 78 70 20 24 0a  37:31 drh Exp $.
01f0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0200: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 23  E_OMIT_ANALYZE.#
0210: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0220: 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  nt.h"../*.** Thi
0230: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
0240: 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6f 70  tes code that op
0250: 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ens the sqlite_s
0260: 74 61 74 31 20 74 61 62 6c 65 20 6f 6e 20 63 75  tat1 table on cu
0270: 72 73 6f 72 0a 2a 2a 20 69 53 74 61 74 43 75 72  rsor.** iStatCur
0280: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
0290: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
02a0: 65 73 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  es does not prev
02b0: 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69 74  iously exist, it
02c0: 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 20   is created..** 
02d0: 49 66 20 69 74 20 64 6f 65 73 20 70 72 65 76 69  If it does previ
02e0: 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 61 6c 6c  ously exist, all
02f0: 20 65 6e 74 69 72 65 73 20 61 73 73 6f 63 69 61   entires associa
0300: 74 65 64 20 77 69 74 68 20 74 61 62 6c 65 20 7a  ted with table z
0310: 57 68 65 72 65 0a 2a 2a 20 61 72 65 20 72 65 6d  Where.** are rem
0320: 6f 76 65 64 2e 20 20 49 66 20 7a 57 68 65 72 65  oved.  If zWhere
0330: 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 65 6e 74  ==0 then all ent
0340: 72 69 65 73 20 61 72 65 20 72 65 6d 6f 76 65 64  ries are removed
0350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0360: 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 0a   openStatTable(.
0370: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
0390: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
03a0: 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
03b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
03c0: 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72 65   database we are
03d0: 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a 20   looking in */. 
03e0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20   int iStatCur,  
03f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
0400: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0410: 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73 20  1 table on this 
0420: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
0430: 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 20  t char *zWhere  
0440: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 6e      /* Delete en
0450: 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
0460: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
0470: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
0480: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0490: 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
04a0: 69 6e 74 20 69 52 6f 6f 74 50 61 67 65 3b 0a 20  int iRootPage;. 
04b0: 20 54 61 62 6c 65 20 2a 70 53 74 61 74 3b 0a 20   Table *pStat;. 
04c0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
04d0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
04e0: 29 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  );..  if( v==0 )
04f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 44 62 20 3d   return;.  pDb =
0500: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
0510: 20 20 69 66 28 20 28 70 53 74 61 74 20 3d 20 73    if( (pStat = s
0520: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
0530: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
0540: 31 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29  1", pDb->zName))
0550: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
0560: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
0570: 61 62 6c 65 73 20 64 6f 65 73 20 6e 6f 74 20 65  ables does not e
0580: 78 69 73 74 2e 20 20 43 72 65 61 74 65 20 69 74  xist.  Create it
0590: 2e 20 20 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20  .  .    ** Note 
05a0: 74 68 61 74 20 61 20 73 69 64 65 2d 65 66 66 65  that a side-effe
05b0: 63 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  ct of the CREATE
05c0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
05d0: 20 69 73 20 74 6f 20 6c 65 61 76 65 0a 20 20 20   is to leave.   
05e0: 20 2a 2a 20 74 68 65 20 72 6f 6f 74 70 61 67 65   ** the rootpage
05f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
0600: 65 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  e on the top of 
0610: 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 69 73  the stack.  This
0620: 20 69 73 0a 20 20 20 20 2a 2a 20 69 6d 70 6f 72   is.    ** impor
0630: 74 61 6e 74 20 62 65 63 61 75 73 65 20 74 68 65  tant because the
0640: 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63 6f 64   OpenWrite opcod
0650: 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 20  e below will be 
0660: 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f 0a 20  needing it. */. 
0670: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
0680: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
0690: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
06a0: 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  E %Q.sqlite_stat
06b0: 31 28 74 62 6c 2c 69 64 78 2c 73 74 61 74 29 22  1(tbl,idx,stat)"
06c0: 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
06d0: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 52  me.    );.    iR
06e0: 6f 6f 74 50 61 67 65 20 3d 20 30 3b 20 20 2f 2a  ootPage = 0;  /*
06f0: 20 43 61 75 73 65 20 72 6f 6f 74 70 61 67 65 20   Cause rootpage 
0700: 74 6f 20 62 65 20 74 61 6b 65 6e 20 66 72 6f 6d  to be taken from
0710: 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 20 2a 2f   top of stack */
0720: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 57 68  .  }else if( zWh
0730: 65 72 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ere ){.    /* Th
0740: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
0750: 61 62 6c 65 20 65 78 69 73 74 73 2e 20 20 44 65  able exists.  De
0760: 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73  lete all entries
0770: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
0780: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
0790: 65 20 7a 57 68 65 72 65 2e 20 2a 2f 0a 20 20 20  e zWhere. */.   
07a0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
07b0: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
07c0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
07d0: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20  %Q.sqlite_stat1 
07e0: 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c 0a 20  WHERE tbl=%Q",. 
07f0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
0800: 2c 20 7a 57 68 65 72 65 0a 20 20 20 20 29 3b 0a  , zWhere.    );.
0810: 20 20 20 20 69 52 6f 6f 74 50 61 67 65 20 3d 20      iRootPage = 
0820: 70 53 74 61 74 2d 3e 74 6e 75 6d 3b 0a 20 20 7d  pStat->tnum;.  }
0830: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
0840: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
0850: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
0860: 74 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20  ts.  Delete all 
0870: 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 69 52 6f  rows. */.    iRo
0880: 6f 74 50 61 67 65 20 3d 20 70 53 74 61 74 2d 3e  otPage = pStat->
0890: 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  tnum;.    sqlite
08a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
08b0: 5f 43 6c 65 61 72 2c 20 70 53 74 61 74 2d 3e 74  _Clear, pStat->t
08c0: 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 0a  num, iDb);.  }..
08d0: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71    /* Open the sq
08e0: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
08f0: 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 55 6e   for writing. Un
0900: 6c 65 73 73 20 69 74 20 77 61 73 20 63 72 65 61  less it was crea
0910: 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 69 73  ted.  ** by this
0920: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2c 20 6c   vdbe program, l
0930: 6f 63 6b 20 69 74 20 66 6f 72 20 77 72 69 74 69  ock it for writi
0940: 6e 67 20 61 74 20 74 68 65 20 73 68 61 72 65 64  ng at the shared
0950: 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20  -cache level. . 
0960: 20 2a 2a 20 49 66 20 74 68 69 73 20 76 64 62 65   ** If this vdbe
0970: 20 64 69 64 20 63 72 65 61 74 65 20 74 68 65 20   did create the 
0980: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
0990: 6c 65 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  le, then it must
09a0: 20 68 61 76 65 20 0a 20 20 2a 2a 20 61 6c 72 65   have .  ** alre
09b0: 61 64 79 20 6f 62 74 61 69 6e 65 64 20 61 20 73  ady obtained a s
09c0: 63 68 65 6d 61 2d 6c 6f 63 6b 2c 20 6d 61 6b 69  chema-lock, maki
09d0: 6e 67 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ng the write-loc
09e0: 6b 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 2a  k redundant..  *
09f0: 2f 0a 20 20 69 66 28 20 69 52 6f 6f 74 50 61 67  /.  if( iRootPag
0a00: 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e>0 ){.    sqlit
0a10: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
0a20: 73 65 2c 20 69 44 62 2c 20 69 52 6f 6f 74 50 61  se, iDb, iRootPa
0a30: 67 65 2c 20 31 2c 20 22 73 71 6c 69 74 65 5f 73  ge, 1, "sqlite_s
0a40: 74 61 74 31 22 29 3b 0a 20 20 7d 0a 20 20 73 71  tat1");.  }.  sq
0a50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
0a60: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
0a70: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
0a80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0a90: 4f 70 65 6e 57 72 69 74 65 2c 20 69 53 74 61 74  OpenWrite, iStat
0aa0: 43 75 72 2c 20 69 52 6f 6f 74 50 61 67 65 29 3b  Cur, iRootPage);
0ab0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
0ac0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
0ad0: 43 6f 6c 75 6d 6e 73 2c 20 69 53 74 61 74 43 75  Columns, iStatCu
0ae0: 72 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 3);.}../*.** 
0af0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
0b00: 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   do an analysis 
0b10: 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  of all indices a
0b20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
0b30: 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  * a single table
0b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0b50: 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65   analyzeOneTable
0b60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0b70: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
0b80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
0b90: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
0ba0: 54 61 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69  Table whose indi
0bb0: 63 65 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e  ces are to be an
0bc0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alyzed */.  int 
0bd0: 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a 20  iStatCur,    /* 
0be0: 43 75 72 73 6f 72 20 74 68 61 74 20 77 72 69 74  Cursor that writ
0bf0: 65 73 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  es to the sqlite
0c00: 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a  _stat1 table */.
0c10: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
0c20: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
0c30: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
0c40: 20 62 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 29   begin here */.)
0c50: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  {.  Index *pIdx;
0c60: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
0c70: 20 74 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a   to being analyz
0c80: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ed */.  int iIdx
0c90: 43 75 72 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur;     /* Curs
0ca0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 69 6e  or number for in
0cb0: 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  dex being analyz
0cc0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ed */.  int nCol
0cd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
0ce0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
0cf0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
0d00: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
0d10: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
0d20: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 62 75  machine being bu
0d30: 69 6c 74 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20  ilt up */.  int 
0d40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;           /* 
0d50: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
0d60: 20 20 69 6e 74 20 74 6f 70 4f 66 4c 6f 6f 70 3b    int topOfLoop;
0d70: 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 6f 66     /* The top of
0d80: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
0d90: 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20  nt endOfLoop;   
0da0: 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 74 68  /* The end of th
0db0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0dc0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
0dd0: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
0de0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  n instruction */
0df0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
0e00: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
0e10: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
0e20: 69 6e 67 20 70 54 61 62 20 2a 2f 0a 0a 20 20 76  ing pTab */..  v
0e30: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0e40: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
0e50: 20 76 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30   v==0 || pTab==0
0e60: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
0e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ==0 ){.    /* Do
0e80: 20 6e 6f 20 61 6e 61 6c 79 73 69 73 20 66 6f 72   no analysis for
0e90: 20 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 76   tables that hav
0ea0: 65 20 6e 6f 20 69 6e 64 69 63 65 73 20 2a 2f 0a  e no indices */.
0eb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
0ec0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
0ed0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
0ee0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
0ef0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
0f00: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 23 69  rt( iDb>=0 );.#i
0f10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0f20: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
0f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
0f40: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
0f50: 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c 20 70  QLITE_ANALYZE, p
0f60: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  Tab->zName, 0,. 
0f70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
0f80: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
0f90: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
0fa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
0fb0: 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20 72 65  * Establish a re
0fc0: 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  ad-lock on the t
0fd0: 61 62 6c 65 20 61 74 20 74 68 65 20 73 68 61 72  able at the shar
0fe0: 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e 20  ed-cache level. 
0ff0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
1000: 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
1010: 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
1020: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
1030: 0a 20 20 69 49 64 78 43 75 72 20 3d 20 70 50 61  .  iIdxCur = pPa
1040: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 66 6f 72  rse->nTab;.  for
1050: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1060: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
1070: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
1080: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
1090: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
10a0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
10b0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  x);..    /* Open
10c0: 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65   a cursor to the
10d0: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 61 6e 61   index to be ana
10e0: 6c 79 7a 65 64 0a 20 20 20 20 2a 2f 0a 20 20 20  lyzed.    */.   
10f0: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 73 71   assert( iDb==sq
1100: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1110: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
1120: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  Idx->pSchema) );
1130: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1140: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
1150: 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
1160: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1170: 2c 20 22 23 20 25 73 22 2c 20 70 49 64 78 2d 3e  , "# %s", pIdx->
1180: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c  zName));.    sql
1190: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
11a0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
11b0: 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Cur, pIdx->tnum,
11c0: 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a  .        (char *
11d0: 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46  )pKey, P3_KEYINF
11e0: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
11f0: 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
1200: 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 69 4d  lumn;.    if( iM
1210: 65 6d 2b 6e 43 6f 6c 2a 32 3e 3d 70 50 61 72 73  em+nCol*2>=pPars
1220: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20  e->nMem ){.     
1230: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
1240: 69 4d 65 6d 2b 6e 43 6f 6c 2a 32 2b 31 3b 0a 20  iMem+nCol*2+1;. 
1250: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1260: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1270: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
1280: 49 64 78 43 75 72 2c 20 6e 43 6f 6c 2b 31 29 3b  IdxCur, nCol+1);
1290: 0a 0a 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  ..    /* Memory 
12a0: 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 61  cells are used a
12b0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
12c0: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6d 65 6d 5b  *.    **    mem[
12d0: 69 4d 65 6d 5d 3a 20 20 20 20 20 20 20 20 20 20  iMem]:          
12e0: 20 20 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d     The total num
12f0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1300: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
1310: 20 20 20 20 6d 65 6d 5b 69 4d 65 6d 2b 31 5d 3a      mem[iMem+1]:
1320: 20 20 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65             Numbe
1330: 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61  r of distinct va
1340: 6c 75 65 73 20 69 6e 20 63 6f 6c 75 6d 6e 20 31  lues in column 1
1350: 0a 20 20 20 20 2a 2a 20 20 20 20 2e 2e 2e 0a 20  .    **    .... 
1360: 20 20 20 2a 2a 20 20 20 20 6d 65 6d 5b 69 4d 65     **    mem[iMe
1370: 6d 2b 6e 43 6f 6c 5d 3a 20 20 20 20 20 20 20 20  m+nCol]:        
1380: 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
1390: 63 74 20 76 61 6c 75 65 73 20 69 6e 20 63 6f 6c  ct values in col
13a0: 75 6d 6e 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  umn N.    **    
13b0: 6d 65 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 2b 31 5d  mem[iMem+nCol+1]
13c0: 20 20 20 20 20 20 20 4c 61 73 74 20 6f 62 73 65         Last obse
13d0: 72 76 65 64 20 76 61 6c 75 65 20 6f 66 20 63 6f  rved value of co
13e0: 6c 75 6d 6e 20 31 0a 20 20 20 20 2a 2a 20 20 20  lumn 1.    **   
13f0: 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 6d   ....    **    m
1400: 65 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 2b 6e 43 6f  em[iMem+nCol+nCo
1410: 6c 5d 3a 20 20 20 4c 61 73 74 20 6f 62 73 65 72  l]:   Last obser
1420: 76 65 64 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ved value of col
1430: 75 6d 6e 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  umn N.    **.   
1440: 20 2a 2a 20 43 65 6c 6c 73 20 69 4d 65 6d 20 74   ** Cells iMem t
1450: 68 72 6f 75 67 68 20 69 4d 65 6d 2b 6e 43 6f 6c  hrough iMem+nCol
1460: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
1470: 20 74 6f 20 30 2e 20 20 54 68 65 20 6f 74 68 65   to 0.  The othe
1480: 72 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 69 6e  rs.    ** are in
1490: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4e 55 4c  itialized to NUL
14a0: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  L..    */.    fo
14b0: 72 28 69 3d 30 3b 20 69 3c 3d 6e 43 6f 6c 3b 20  r(i=0; i<=nCol; 
14c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
14d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14e0: 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 4d  OP_MemInt, 0, iM
14f0: 65 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  em+i);.    }.   
1500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1530: 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 69 4d  , OP_MemNull, iM
1540: 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 2c 20 30 29 3b  em+nCol+i+1, 0);
1550: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
1560: 6f 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  o the analysis..
1570: 20 20 20 20 2a 2f 0a 20 20 20 20 65 6e 64 4f 66      */.    endOf
1580: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
1590: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
15c0: 64 2c 20 69 49 64 78 43 75 72 2c 20 65 6e 64 4f  d, iIdxCur, endO
15d0: 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 74 6f 70 4f  fLoop);.    topO
15e0: 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
15f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1600: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1610: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1620: 6d 49 6e 63 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  mIncr, 1, iMem);
1630: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1640: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1660: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
1670: 20 69 49 64 78 43 75 72 2c 20 69 29 3b 0a 20 20   iIdxCur, i);.  
1680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1690: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
16a0: 61 64 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b  ad, iMem+nCol+i+
16b0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
16c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16d0: 20 4f 50 5f 4e 65 2c 20 30 78 31 30 30 2c 20 30   OP_Ne, 0x100, 0
16e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1700: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64   OP_Goto, 0, end
1710: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 66 6f 72  OfLoop);.    for
1720: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
1730: 2b 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  +){.      addr =
1740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1750: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
1760: 20 31 2c 20 69 4d 65 6d 2b 69 2b 31 29 3b 0a 20   1, iMem+i+1);. 
1770: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1780: 43 68 61 6e 67 65 50 32 28 76 2c 20 74 6f 70 4f  ChangeP2(v, topO
1790: 66 4c 6f 6f 70 20 2b 20 33 2a 69 20 2b 20 33 2c  fLoop + 3*i + 3,
17a0: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71   addr);.      sq
17b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
17c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
17d0: 78 43 75 72 2c 20 69 29 3b 0a 20 20 20 20 20 20  xCur, i);.      
17e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
1800: 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 2c 20   iMem+nCol+i+1, 
1810: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
1820: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1830: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f  Label(v, endOfLo
1840: 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  op);.    sqlite3
1850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1860: 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2c 20 74  Next, iIdxCur, t
1870: 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73  opOfLoop);.    s
1880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1890: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
18a0: 78 43 75 72 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  xCur, 0);..    /
18b0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
18c0: 6c 74 73 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  lts.  .    **.  
18d0: 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
18e0: 69 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  is a single row 
18f0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
1900: 61 74 31 20 74 61 62 6c 65 2e 20 20 54 68 65 20  at1 table.  The 
1910: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 74 77 6f  first.    ** two
1920: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 74 68 65   columns are the
1930: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 74 61   names of the ta
1940: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 2e 20 20  ble and index.  
1950: 54 68 65 20 74 68 69 72 64 20 63 6f 6c 75 6d 6e  The third column
1960: 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 73 74 72  .    ** is a str
1970: 69 6e 67 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20  ing composed of 
1980: 61 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  a list of intege
1990: 72 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f  r statistics abo
19a0: 75 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e  ut the.    ** in
19b0: 64 65 78 2e 20 20 54 68 65 20 66 69 72 73 74 20  dex.  The first 
19c0: 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c  integer in the l
19d0: 69 73 74 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ist is the total
19e0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 69 72   number of entir
19f0: 65 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  es.    ** in the
1a00: 20 69 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69   index.  There i
1a10: 73 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c  s one additional
1a20: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
1a30: 6c 69 73 74 20 66 6f 72 20 65 61 63 68 0a 20 20  list for each.  
1a40: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74    ** column of t
1a50: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
1a60: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
1a70: 65 72 20 69 73 20 61 20 67 75 65 73 73 20 6f 66  er is a guess of
1a80: 20 68 6f 77 20 6d 61 6e 79 0a 20 20 20 20 2a 2a   how many.    **
1a90: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
1aa0: 6c 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  le the index wil
1ab0: 6c 20 73 65 6c 65 63 74 2e 20 20 49 66 20 44 20  l select.  If D 
1ac0: 69 73 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  is the count of 
1ad0: 64 69 73 74 69 6e 63 74 0a 20 20 20 20 2a 2a 20  distinct.    ** 
1ae0: 76 61 6c 75 65 73 20 61 6e 64 20 4b 20 69 73 20  values and K is 
1af0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1b00: 20 6f 66 20 72 6f 77 73 2c 20 74 68 65 6e 20 74   of rows, then t
1b10: 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 63 6f  he integer is co
1b20: 6d 70 75 74 65 64 0a 20 20 20 20 2a 2a 20 61 73  mputed.    ** as
1b30: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1b40: 20 20 20 20 20 20 20 49 20 3d 20 28 4b 2b 44 2d         I = (K+D-
1b50: 31 29 2f 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20  1)/D.    **.    
1b60: 2a 2a 20 49 66 20 4b 3d 3d 30 20 74 68 65 6e 20  ** If K==0 then 
1b70: 6e 6f 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  no entry is made
1b80: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
1b90: 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20 20 0a  _stat1 table.  .
1ba0: 20 20 20 20 2a 2a 20 49 66 20 4b 3e 30 20 74 68      ** If K>0 th
1bb0: 65 6e 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  en it is always 
1bc0: 74 68 65 20 63 61 73 65 20 74 68 65 20 44 3e 30  the case the D>0
1bd0: 20 73 6f 20 64 69 76 69 73 69 6f 6e 20 62 79 20   so division by 
1be0: 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 69 73 20 6e  zero.    ** is n
1bf0: 65 76 65 72 20 70 6f 73 73 69 62 6c 65 2e 0a 20  ever possible.. 
1c00: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1c10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1c20: 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d 2c 20  _MemLoad, iMem, 
1c30: 30 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  0);.    addr = s
1c40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1c50: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 30 2c 20  v, OP_IfNot, 0, 
1c60: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
1c70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
1c80: 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75  ewRowid, iStatCu
1c90: 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
1ca0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
1cb0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
1cc0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
1cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
1ce0: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
1cf0: 2c 20 30 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e  , 0, 0, pIdx->zN
1d00: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
1d10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1d20: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65   OP_MemLoad, iMe
1d30: 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
1d40: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
1d50: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22  String8, 0, 0, "
1d60: 20 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28   ", 0);.    for(
1d70: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
1d80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1da0: 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d 2c 20 30  MemLoad, iMem, 0
1db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1dd0: 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d 2b 69 2b  MemLoad, iMem+i+
1de0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
1df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1e00: 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29 3b 0a   OP_Add, 0, 0);.
1e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
1e30: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  Imm, -1, 0);.   
1e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e50: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
1e60: 64 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 30 29 3b  d, iMem+i+1, 0);
1e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69  beAddOp(v, OP_Di
1e90: 76 69 64 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  vide, 0, 0);.   
1ea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1eb0: 64 4f 70 28 76 2c 20 4f 50 5f 54 6f 49 6e 74 2c  dOp(v, OP_ToInt,
1ec0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1ed0: 28 20 69 3d 3d 6e 43 6f 6c 2d 31 20 29 7b 0a 20  ( i==nCol-1 ){. 
1ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ef0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
1f00: 6e 63 61 74 2c 20 6e 43 6f 6c 2a 32 2d 31 2c 20  ncat, nCol*2-1, 
1f10: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
1f20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1f40: 44 75 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Dup, 1, 0);.    
1f50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1f60: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
1f70: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 33  OP_MakeRecord, 3
1f80: 2c 20 30 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a  , 0, "aaa", 0);.
1f90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72  ddOp(v, OP_Inser
1fb0: 74 2c 20 69 53 74 61 74 43 75 72 2c 20 4f 50 46  t, iStatCur, OPF
1fc0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
1fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1fe0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
1ff0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
2000: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
2010: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 6f  ill cause the mo
2020: 73 74 20 72 65 63 65 6e 74 20 69 6e 64 65 78 20  st recent index 
2030: 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62  analysis to.** b
2040: 65 20 6c 61 6f 64 65 64 20 69 6e 74 6f 20 69 6e  e laoded into in
2050: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
2060: 65 73 20 77 68 65 72 65 20 69 73 20 63 61 6e 20  es where is can 
2070: 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  be used..*/.stat
2080: 69 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c  ic void loadAnal
2090: 79 73 69 73 28 50 61 72 73 65 20 2a 70 50 61 72  ysis(Parse *pPar
20a0: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
20b0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
20c0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
20d0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
20e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20f0: 70 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c  p(v, OP_LoadAnal
2100: 79 73 69 73 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ysis, iDb, 0);. 
2110: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
2120: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
2130: 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73  ill do an analys
2140: 69 73 20 6f 66 20 61 6e 20 65 6e 74 69 72 65 20  is of an entire 
2150: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74  database.*/.stat
2160: 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44  ic void analyzeD
2170: 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
2180: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
2190: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53   pParse->db;.  S
21b0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
21c0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
21d0: 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68  chema;    /* Sch
21e0: 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65 20  ema of database 
21f0: 69 44 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  iDb */.  HashEle
2200: 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61  m *k;.  int iSta
2210: 74 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  tCur;.  int iMem
2220: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  ;..  sqlite3Begi
2230: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
2240: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
2250: 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50  .  iStatCur = pP
2260: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2270: 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50  openStatTable(pP
2280: 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74  arse, iDb, iStat
2290: 43 75 72 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20  Cur, 0);.  iMem 
22a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
22b0: 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
22c0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
22d0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b  ->tblHash); k; k
22e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
22f0: 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  k)){.    Table *
2300: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
2310: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
2320: 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f 6e 65  ;.    analyzeOne
2330: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2340: 61 62 2c 20 69 53 74 61 74 43 75 72 2c 20 69 4d  ab, iStatCur, iM
2350: 65 6d 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41  em);.  }.  loadA
2360: 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20  nalysis(pParse, 
2370: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iDb);.}../*.** G
2380: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
2390: 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61  t will do an ana
23a0: 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c  lysis of a singl
23b0: 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20  e table in.** a 
23c0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
23d0: 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
23e0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
23f0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
2400: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  ){.  int iDb;.  
2410: 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 0a 20  int iStatCur;.. 
2420: 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2430: 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   );.  iDb = sqli
2440: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2450: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
2460: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  b->pSchema);.  s
2470: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
2480: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
2490: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74  , 0, iDb);.  iSt
24a0: 61 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  atCur = pParse->
24b0: 6e 54 61 62 2b 2b 3b 0a 20 20 6f 70 65 6e 53 74  nTab++;.  openSt
24c0: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
24d0: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70  iDb, iStatCur, p
24e0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 61  Tab->zName);.  a
24f0: 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70  nalyzeOneTable(p
2500: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 53 74  Parse, pTab, iSt
2510: 61 74 43 75 72 2c 20 70 50 61 72 73 65 2d 3e 6e  atCur, pParse->n
2520: 4d 65 6d 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c  Mem);.  loadAnal
2530: 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62  ysis(pParse, iDb
2540: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
2550: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
2560: 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
2570: 64 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63  d.  The parser c
2580: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
2590: 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63  e.** when it rec
25a0: 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59  ognizes an ANALY
25b0: 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
25c0: 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45  *        ANALYZE
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
25f0: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
2600: 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20  ZE  <database>  
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
2620: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41   2.**        ANA
2630: 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65  LYZE  ?<database
2640: 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
2650: 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 3.**.** Form 
2660: 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
2670: 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
2680: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
2690: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a  o be analyzed..*
26a0: 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65  * Form 2 analyze
26b0: 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68  s all indices th
26c0: 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  e single databas
26d0: 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d  e named..** Form
26e0: 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20   3 analyzes all 
26f0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
2700: 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
2710: 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  d table..*/.void
2720: 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28   sqlite3Analyze(
2730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2740: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
2750: 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
2760: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2770: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
2780: 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  iDb;.  int i;.  
2790: 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20  char *z, *zDb;. 
27a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
27b0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
27c0: 65 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  e;..  /* Read th
27d0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
27e0: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
27f0: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
2800: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
2810: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
2820: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
2830: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
2840: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
2850: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
2860: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
2870: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
2880: 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
2890: 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41 6e 61 6c  /* Form 1:  Anal
28a0: 79 7a 65 20 65 76 65 72 79 74 68 69 6e 67 20 2a  yze everything *
28b0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
28c0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
28d0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29        if( i==1 )
28e0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 44   continue;  /* D
28f0: 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65 20 74 68  o not analyze th
2900: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
2910: 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a 65  */.      analyze
2920: 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 2c  Database(pParse,
2930: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   i);.    }.  }el
2940: 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30  se if( pName2==0
2950: 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30   || pName2->n==0
2960: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20   ){.    /* Form 
2970: 32 3a 20 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  2:  Analyze the 
2980: 64 61 74 61 62 61 73 65 20 6f 72 20 74 61 62 6c  database or tabl
2990: 65 20 6e 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69  e named */.    i
29a0: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
29b0: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
29c0: 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29      if( iDb>=0 )
29d0: 7b 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44  {.      analyzeD
29e0: 61 74 61 62 61 73 65 28 70 50 61 72 73 65 2c 20  atabase(pParse, 
29f0: 69 44 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iDb);.    }else{
2a00: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
2a10: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
2a20: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
2a30: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
2a40: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
2a50: 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   z, 0);.      sq
2a60: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
2a70: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
2a80: 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61         analyzeTa
2a90: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
2aa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2ab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2ac0: 20 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65   Form 3: Analyze
2ad0: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
2ae0: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  fied table name 
2af0: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
2b00: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
2b10: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
2b20: 70 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e  pName2, &pTableN
2b30: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
2b40: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44  b>=0 ){.      zD
2b50: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
2b60: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a 20  .zName;.      z 
2b70: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
2b80: 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d  mToken(pTableNam
2b90: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20  e);.      if( z 
2ba0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
2bb0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
2bc0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 7a 2c 20  able(pParse, z, 
2bd0: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  zDb);.        sq
2be0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
2bf0: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
2c00: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
2c10: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
2c20: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  pTab);.        }
2c30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20  .      }.    }  
2c40: 20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   .  }.}../*.** U
2c50: 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
2c60: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
2c70: 20 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65 72   analyzer reader
2c80: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a   through to the.
2c90: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  ** callback rout
2ca0: 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ine..*/.typedef 
2cb0: 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49  struct analysisI
2cc0: 6e 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  nfo analysisInfo
2cd0: 3b 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69  ;.struct analysi
2ce0: 73 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  sInfo {.  sqlite
2cf0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
2d00: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b 0a  har *zDatabase;.
2d10: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63  };../*.** This c
2d20: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
2d30: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
2d40: 20 69 6e 64 65 78 20 77 68 65 6e 20 72 65 61 64   index when read
2d50: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
2d60: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20 20  e_stat1 table.  
2d70: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  .**.**     argv[
2d80: 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65  0] = name of the
2d90: 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 61 72   index.**     ar
2da0: 67 76 5b 31 5d 20 3d 20 72 65 73 75 6c 74 73 20  gv[1] = results 
2db0: 6f 66 20 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e  of analysis - on
2dc0: 20 69 6e 74 65 67 65 72 20 66 6f 72 20 65 61 63   integer for eac
2dd0: 68 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  h column.*/.stat
2de0: 69 63 20 69 6e 74 20 61 6e 61 6c 79 73 69 73 4c  ic int analysisL
2df0: 6f 61 64 65 72 28 76 6f 69 64 20 2a 70 44 61 74  oader(void *pDat
2e00: 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  a, int argc, cha
2e10: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
2e20: 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61  *azNotUsed){.  a
2e30: 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e  nalysisInfo *pIn
2e40: 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e  fo = (analysisIn
2e50: 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49 6e 64  fo*)pData;.  Ind
2e60: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
2e70: 74 20 69 2c 20 63 3b 0a 20 20 75 6e 73 69 67 6e  t i, c;.  unsign
2e80: 65 64 20 69 6e 74 20 76 3b 0a 20 20 63 6f 6e 73  ed int v;.  cons
2e90: 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73  t char *z;..  as
2ea0: 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b  sert( argc==2 );
2eb0: 0a 20 20 69 66 28 20 61 72 67 76 3d 3d 30 20 7c  .  if( argv==0 |
2ec0: 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20  | argv[0]==0 || 
2ed0: 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  argv[1]==0 ){.  
2ee0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2ef0: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
2f00: 65 33 46 69 6e 64 49 6e 64 65 78 28 70 49 6e 66  e3FindIndex(pInf
2f10: 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20  o->db, argv[0], 
2f20: 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65  pInfo->zDatabase
2f30: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
2f40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2f50: 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72   0;.  }.  z = ar
2f60: 67 76 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  gv[1];.  for(i=0
2f70: 3b 20 2a 7a 20 26 26 20 69 3c 3d 70 49 6e 64 65  ; *z && i<=pInde
2f80: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
2f90: 7b 0a 20 20 20 20 76 20 3d 20 30 3b 0a 20 20 20  {.    v = 0;.   
2fa0: 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29   while( (c=z[0])
2fb0: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20  >='0' && c<='9' 
2fc0: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31  ){.      v = v*1
2fd0: 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20  0 + c - '0';.   
2fe0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     z++;.    }.  
2ff0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45    pIndex->aiRowE
3000: 73 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69  st[i] = v;.    i
3010: 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b  f( *z==' ' ) z++
3020: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
3030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
3040: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
3050: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
3060: 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 69  table into the i
3070: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 73  ndex hash tables
3080: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3090: 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c  AnalysisLoad(sql
30a0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
30b0: 62 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e  b){.  analysisIn
30c0: 66 6f 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68  fo sInfo;.  Hash
30d0: 45 6c 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20  Elem *i;.  char 
30e0: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zSql;.  int rc;
30f0: 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 61 6e 79  ..  /* Clear any
3100: 20 70 72 69 6f 72 20 73 74 61 74 69 73 74 69 63   prior statistic
3110: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 73 71 6c  s */.  for(i=sql
3120: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
3130: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
3140: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 69 3b 69  ma->idxHash);i;i
3150: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
3160: 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  i)){.    Index *
3170: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
3180: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71  hData(i);.    sq
3190: 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
31a0: 73 74 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  st(pIdx);.  }.. 
31b0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
31c0: 65 20 73 75 72 65 20 74 68 65 20 73 71 6c 69 74  e sure the sqlit
31d0: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 65 78  e_stat1 table ex
31e0: 69 73 74 73 73 20 2a 2f 0a 20 20 73 49 6e 66 6f  istss */.  sInfo
31f0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66  .db = db;.  sInf
3200: 6f 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62  o.zDatabase = db
3210: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
3220: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
3230: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
3240: 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e  lite_stat1", sIn
3250: 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3d 3d 30  fo.zDatabase)==0
3260: 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
3270: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
3280: 7d 0a 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 6e 65  }...  /* Load ne
3290: 77 20 73 74 61 74 69 73 74 69 63 73 20 6f 75 74  w statistics out
32a0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
32b0: 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tat1 table */.  
32c0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  zSql = sqlite3MP
32d0: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 69 64  rintf("SELECT id
32e0: 78 2c 20 73 74 61 74 20 46 52 4f 4d 20 25 51 2e  x, stat FROM %Q.
32f0: 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 0a 20  sqlite_stat1",. 
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 20 20 20 73 49 6e 66 6f 2e 7a 44 61         sInfo.zDa
3320: 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
3330: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
3340: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
3350: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61  exec(db, zSql, a
3360: 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c 20 26  nalysisLoader, &
3370: 73 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 73 71 6c  sInfo, 0);.  sql
3380: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
3390: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
33a0: 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sql);.  return r
33b0: 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  c;.}...#endif /*
33c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
33d0: 4c 59 5a 45 20 2a 2f 0a                          LYZE */.