/ Hex Artifact Content
Login

Artifact 4bbf5ddf9680587c6d4917e02e378b6037be3651:


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: 37 20 32 30 30 37 2f 30 33 2f 32 39 20 30 35 3a  7 2007/03/29 05:
01e0: 35 31 3a 34 39 20 64 72 68 20 45 78 70 20 24 0a  51:49 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 70 44 62 20 3d 20 26 64 62 2d  );..  pDb = &db-
04f0: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 69 66 28  >aDb[iDb];.  if(
0500: 20 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65   (pStat = sqlite
0510: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
0520: 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 70  sqlite_stat1", p
0530: 44 62 2d 3e 7a 4e 61 6d 65 29 29 3d 3d 30 20 29  Db->zName))==0 )
0540: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c  {.    /* The sql
0550: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 73  ite_stat1 tables
0560: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
0570: 20 20 43 72 65 61 74 65 20 69 74 2e 20 20 0a 20    Create it.  . 
0580: 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
0590: 61 20 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66  a side-effect of
05a0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
05b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  E statement is t
05c0: 6f 20 6c 65 61 76 65 0a 20 20 20 20 2a 2a 20 74  o leave.    ** t
05d0: 68 65 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 74  he rootpage of t
05e0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6f 6e 20  he new table on 
05f0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
0600: 74 61 63 6b 2e 20 20 54 68 69 73 20 69 73 0a 20  tack.  This is. 
0610: 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
0620: 62 65 63 61 75 73 65 20 74 68 65 20 4f 70 65 6e  because the Open
0630: 57 72 69 74 65 20 6f 70 63 6f 64 65 20 62 65 6c  Write opcode bel
0640: 6f 77 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69  ow will be needi
0650: 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 73 71  ng it. */.    sq
0660: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
0670: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
0680: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
0690: 73 71 6c 69 74 65 5f 73 74 61 74 31 28 74 62 6c  sqlite_stat1(tbl
06a0: 2c 69 64 78 2c 73 74 61 74 29 22 2c 0a 20 20 20  ,idx,stat)",.   
06b0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
06c0: 20 20 29 3b 0a 20 20 20 20 69 52 6f 6f 74 50 61    );.    iRootPa
06d0: 67 65 20 3d 20 30 3b 20 20 2f 2a 20 43 61 75 73  ge = 0;  /* Caus
06e0: 65 20 72 6f 6f 74 70 61 67 65 20 74 6f 20 62 65  e rootpage to be
06f0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 6f 70 20   taken from top 
0700: 6f 66 20 73 74 61 63 6b 20 2a 2f 0a 20 20 7d 65  of stack */.  }e
0710: 6c 73 65 20 69 66 28 20 7a 57 68 65 72 65 20 29  lse if( zWhere )
0720: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c  {.    /* The sql
0730: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
0740: 65 78 69 73 74 73 2e 20 20 44 65 6c 65 74 65 20  exists.  Delete 
0750: 61 6c 6c 20 65 6e 74 72 69 65 73 20 61 73 73 6f  all entries asso
0760: 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
0770: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 7a 57 68  ** the table zWh
0780: 65 72 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ere. */.    sqli
0790: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
07a0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
07b0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
07c0: 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45  lite_stat1 WHERE
07d0: 20 74 62 6c 3d 25 51 22 2c 0a 20 20 20 20 20 20   tbl=%Q",.      
07e0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68   pDb->zName, zWh
07f0: 65 72 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ere.    );.    i
0800: 52 6f 6f 74 50 61 67 65 20 3d 20 70 53 74 61 74  RootPage = pStat
0810: 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 65 6c 73 65 7b  ->tnum;.  }else{
0820: 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c 69  .    /* The sqli
0830: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 61  te_stat1 table a
0840: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
0850: 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73 2e  Delete all rows.
0860: 20 2a 2f 0a 20 20 20 20 69 52 6f 6f 74 50 61 67   */.    iRootPag
0870: 65 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75 6d 3b  e = pStat->tnum;
0880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
0890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61  AddOp(v, OP_Clea
08a0: 72 2c 20 70 53 74 61 74 2d 3e 74 6e 75 6d 2c 20  r, pStat->tnum, 
08b0: 69 44 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  iDb);.  }..  /* 
08c0: 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  Open the sqlite_
08d0: 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 20  stat1 table for 
08e0: 77 72 69 74 69 6e 67 2e 20 55 6e 6c 65 73 73 20  writing. Unless 
08f0: 69 74 20 77 61 73 20 63 72 65 61 74 65 64 0a 20  it was created. 
0900: 20 2a 2a 20 62 79 20 74 68 69 73 20 76 64 62 65   ** by this vdbe
0910: 20 70 72 6f 67 72 61 6d 2c 20 6c 6f 63 6b 20 69   program, lock i
0920: 74 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 74  t for writing at
0930: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
0940: 65 20 6c 65 76 65 6c 2e 20 0a 20 20 2a 2a 20 49  e level. .  ** I
0950: 66 20 74 68 69 73 20 76 64 62 65 20 64 69 64 20  f this vdbe did 
0960: 63 72 65 61 74 65 20 74 68 65 20 73 71 6c 69 74  create the sqlit
0970: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20 74  e_stat1 table, t
0980: 68 65 6e 20 69 74 20 6d 75 73 74 20 68 61 76 65  hen it must have
0990: 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6f   .  ** already o
09a0: 62 74 61 69 6e 65 64 20 61 20 73 63 68 65 6d 61  btained a schema
09b0: 2d 6c 6f 63 6b 2c 20 6d 61 6b 69 6e 67 20 74 68  -lock, making th
09c0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 72 65 64  e write-lock red
09d0: 75 6e 64 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69  undant..  */.  i
09e0: 66 28 20 69 52 6f 6f 74 50 61 67 65 3e 30 20 29  f( iRootPage>0 )
09f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  {.    sqlite3Tab
0a00: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
0a10: 44 62 2c 20 69 52 6f 6f 74 50 61 67 65 2c 20 31  Db, iRootPage, 1
0a20: 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
0a30: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
0a40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
0a50: 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
0a60: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
0a70: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
0a80: 72 69 74 65 2c 20 69 53 74 61 74 43 75 72 2c 20  rite, iStatCur, 
0a90: 69 52 6f 6f 74 50 61 67 65 29 3b 0a 20 20 73 71  iRootPage);.  sq
0aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
0ab0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
0ac0: 6e 73 2c 20 69 53 74 61 74 43 75 72 2c 20 33 29  ns, iStatCur, 3)
0ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
0ae0: 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 61  ate code to do a
0af0: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 6c  n analysis of al
0b00: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
0b10: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73  ated with.** a s
0b20: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ingle table..*/.
0b30: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c  static void anal
0b40: 79 7a 65 4f 6e 65 54 61 62 6c 65 28 0a 20 20 50  yzeOneTable(.  P
0b50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
0b60: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
0b70: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
0b80: 61 62 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab,     /* Table
0b90: 20 77 68 6f 73 65 20 69 6e 64 69 63 65 73 20 61   whose indices a
0ba0: 72 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  re to be analyze
0bb0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74  d */.  int iStat
0bc0: 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f  Cur,    /* Curso
0bd0: 72 20 74 68 61 74 20 77 72 69 74 65 73 20 74 6f  r that writes to
0be0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0bf0: 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  1 table */.  int
0c00: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 2f 2a   iMem         /*
0c10: 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   Available memor
0c20: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69  y locations begi
0c30: 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  n here */.){.  I
0c40: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
0c50: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62  /* An index to b
0c60: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0c70: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
0c80: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0c90: 6d 62 65 72 20 66 6f 72 20 69 6e 64 65 78 20 62  mber for index b
0ca0: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
0cb0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
0cc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0cd0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
0ce0: 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
0cf0: 2a 76 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  *v;         /* T
0d00: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
0d10: 6e 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75  ne being built u
0d20: 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  p */.  int i;   
0d30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
0d40: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
0d50: 20 74 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 2f 2a   topOfLoop;   /*
0d60: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
0d70: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  loop */.  int en
0d80: 64 4f 66 4c 6f 6f 70 3b 20 20 20 2f 2a 20 54 68  dOfLoop;   /* Th
0d90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
0da0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  p */.  int addr;
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
0dc0: 64 64 72 65 73 73 20 6f 66 20 61 6e 20 69 6e 73  ddress of an ins
0dd0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
0de0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
0df0: 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
0e00: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ase containing p
0e10: 54 61 62 20 2a 2f 0a 0a 20 20 76 20 3d 20 73 71  Tab */..  v = sq
0e20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0e30: 72 73 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  rse);.  if( pTab
0e40: 3d 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ==0 || pTab->pIn
0e50: 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  dex==0 ){.    /*
0e60: 20 44 6f 20 6e 6f 20 61 6e 61 6c 79 73 69 73 20   Do no analysis 
0e70: 66 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74 20  for tables that 
0e80: 68 61 76 65 20 6e 6f 20 69 6e 64 69 63 65 73 20  have no indices 
0e90: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
0ea0: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   }..  iDb = sqli
0eb0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
0ec0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
0ed0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
0ee0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b  ssert( iDb>=0 );
0ef0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0f00: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
0f10: 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
0f20: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
0f30: 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45  , SQLITE_ANALYZE
0f40: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
0f50: 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
0f60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
0f70: 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
0f80: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
0f90: 20 20 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 61    /* Establish a
0fa0: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
0fb0: 65 20 74 61 62 6c 65 20 61 74 20 74 68 65 20 73  e table at the s
0fc0: 68 61 72 65 64 2d 63 61 63 68 65 20 6c 65 76 65  hared-cache leve
0fd0: 6c 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  l. */.  sqlite3T
0fe0: 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
0ff0: 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
1000: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
1010: 29 3b 0a 0a 20 20 69 49 64 78 43 75 72 20 3d 20  );..  iIdxCur = 
1020: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
1030: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
1040: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
1050: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
1060: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1070: 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
1080: 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
1090: 70 49 64 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  pIdx);..    /* O
10a0: 70 65 6e 20 61 20 63 75 72 73 6f 72 20 74 6f 20  pen a cursor to 
10b0: 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  the index to be 
10c0: 61 6e 61 6c 79 7a 65 64 0a 20 20 20 20 2a 2f 0a  analyzed.    */.
10d0: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
10e0: 3d 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f  =sqlite3SchemaTo
10f0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
1100: 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29  , pIdx->pSchema)
1110: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
1120: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1130: 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
1140: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1150: 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70 49 64  ((v, "# %s", pId
1160: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1170: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
1180: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
1190: 49 64 78 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e  IdxCur, pIdx->tn
11a0: 75 6d 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61  um,.        (cha
11b0: 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  r *)pKey, P3_KEY
11c0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
11d0: 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e     nCol = pIdx->
11e0: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28  nColumn;.    if(
11f0: 20 69 4d 65 6d 2b 6e 43 6f 6c 2a 32 3e 3d 70 50   iMem+nCol*2>=pP
1200: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20  arse->nMem ){.  
1210: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
1220: 20 3d 20 69 4d 65 6d 2b 6e 43 6f 6c 2a 32 2b 31   = iMem+nCol*2+1
1230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1240: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1250: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
1260: 2c 20 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 2b  , iIdxCur, nCol+
1270: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 65 6d 6f  1);..    /* Memo
1280: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
1290: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
12a0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6d    **.    **    m
12b0: 65 6d 5b 69 4d 65 6d 5d 3a 20 20 20 20 20 20 20  em[iMem]:       
12c0: 20 20 20 20 20 20 54 68 65 20 74 6f 74 61 6c 20        The total 
12d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
12e0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
12f0: 20 2a 2a 20 20 20 20 6d 65 6d 5b 69 4d 65 6d 2b   **    mem[iMem+
1300: 31 5d 3a 20 20 20 20 20 20 20 20 20 20 20 4e 75  1]:           Nu
1310: 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
1320: 20 76 61 6c 75 65 73 20 69 6e 20 63 6f 6c 75 6d   values in colum
1330: 6e 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 2e 2e  n 1.    **    ..
1340: 2e 0a 20 20 20 20 2a 2a 20 20 20 20 6d 65 6d 5b  ..    **    mem[
1350: 69 4d 65 6d 2b 6e 43 6f 6c 5d 3a 20 20 20 20 20  iMem+nCol]:     
1360: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73     Number of dis
1370: 74 69 6e 63 74 20 76 61 6c 75 65 73 20 69 6e 20  tinct values in 
1380: 63 6f 6c 75 6d 6e 20 4e 0a 20 20 20 20 2a 2a 20  column N.    ** 
1390: 20 20 20 6d 65 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c     mem[iMem+nCol
13a0: 2b 31 5d 20 20 20 20 20 20 20 4c 61 73 74 20 6f  +1]       Last o
13b0: 62 73 65 72 76 65 64 20 76 61 6c 75 65 20 6f 66  bserved value of
13c0: 20 63 6f 6c 75 6d 6e 20 31 0a 20 20 20 20 2a 2a   column 1.    **
13d0: 20 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20      ....    **  
13e0: 20 20 6d 65 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 2b    mem[iMem+nCol+
13f0: 6e 43 6f 6c 5d 3a 20 20 20 4c 61 73 74 20 6f 62  nCol]:   Last ob
1400: 73 65 72 76 65 64 20 76 61 6c 75 65 20 6f 66 20  served value of 
1410: 63 6f 6c 75 6d 6e 20 4e 0a 20 20 20 20 2a 2a 0a  column N.    **.
1420: 20 20 20 20 2a 2a 20 43 65 6c 6c 73 20 69 4d 65      ** Cells iMe
1430: 6d 20 74 68 72 6f 75 67 68 20 69 4d 65 6d 2b 6e  m through iMem+n
1440: 43 6f 6c 20 61 72 65 20 69 6e 69 74 69 61 6c 69  Col are initiali
1450: 7a 65 64 20 74 6f 20 30 2e 20 20 54 68 65 20 6f  zed to 0.  The o
1460: 74 68 65 72 73 0a 20 20 20 20 2a 2a 20 61 72 65  thers.    ** are
1470: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
1480: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
1490: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6e 43 6f   for(i=0; i<=nCo
14a0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
14b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14c0: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
14d0: 20 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a   iMem+i);.    }.
14e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14f0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1510: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c  p(v, OP_MemNull,
1520: 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 2c 20   iMem+nCol+i+1, 
1530: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
1540: 2a 20 44 6f 20 74 68 65 20 61 6e 61 6c 79 73 69  * Do the analysi
1550: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6e  s..    */.    en
1560: 64 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  dOfLoop = sqlite
1570: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
15a0: 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 65  wind, iIdxCur, e
15b0: 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 74  ndOfLoop);.    t
15c0: 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
15d0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15e0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
15f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1600: 5f 4d 65 6d 49 6e 63 72 2c 20 31 2c 20 69 4d 65  _MemIncr, 1, iMe
1610: 6d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  m);.    for(i=0;
1620: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
1630: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1640: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
1650: 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 29 3b  mn, iIdxCur, i);
1660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1680: 6d 4c 6f 61 64 2c 20 69 4d 65 6d 2b 6e 43 6f 6c  mLoad, iMem+nCol
1690: 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  +i+1, 0);.      
16a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b0: 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 31 30 30  (v, OP_Ne, 0x100
16c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
16d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16e0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16f0: 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  endOfLoop);.    
1700: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
1710: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 64 64   i++){.      add
1720: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1730: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
1740: 63 72 2c 20 31 2c 20 69 4d 65 6d 2b 69 2b 31 29  cr, 1, iMem+i+1)
1750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1760: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 74  dbeChangeP2(v, t
1770: 6f 70 4f 66 4c 6f 6f 70 20 2b 20 33 2a 69 20 2b  opOfLoop + 3*i +
1780: 20 33 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20   3, addr);.     
1790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17a0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
17b0: 69 49 64 78 43 75 72 2c 20 69 29 3b 0a 20 20 20  iIdxCur, i);.   
17c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17d0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
17e0: 72 65 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b  re, iMem+nCol+i+
17f0: 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
1800: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1810: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f  lveLabel(v, endO
1820: 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  fLoop);.    sqli
1830: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1840: 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72  OP_Next, iIdxCur
1850: 2c 20 74 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  , topOfLoop);.  
1860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1870: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
1880: 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 0a 20 20  iIdxCur, 0);..  
1890: 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
18a0: 65 73 75 6c 74 73 2e 20 20 0a 20 20 20 20 2a 2a  esults.  .    **
18b0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
18c0: 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 72  lt is a single r
18d0: 6f 77 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ow of the sqlite
18e0: 5f 73 74 6d 74 31 20 74 61 62 6c 65 2e 20 20 54  _stmt1 table.  T
18f0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  he first.    ** 
1900: 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  two columns are 
1910: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
1920: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
1930: 2e 20 20 54 68 65 20 74 68 69 72 64 20 63 6f 6c  .  The third col
1940: 75 6d 6e 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  umn.    ** is a 
1950: 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73 65 64 20  string composed 
1960: 6f 66 20 61 20 6c 69 73 74 20 6f 66 20 69 6e 74  of a list of int
1970: 65 67 65 72 20 73 74 61 74 69 73 74 69 63 73 20  eger statistics 
1980: 61 62 6f 75 74 20 74 68 65 0a 20 20 20 20 2a 2a  about the.    **
1990: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 66 69 72   index.  The fir
19a0: 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68  st integer in th
19b0: 65 20 6c 69 73 74 20 69 73 20 74 68 65 20 74 6f  e list is the to
19c0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  tal number of en
19d0: 74 69 72 65 73 0a 20 20 20 20 2a 2a 20 69 6e 20  tires.    ** in 
19e0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 72  the index.  Ther
19f0: 65 20 69 73 20 6f 6e 65 20 61 64 64 69 74 69 6f  e is one additio
1a00: 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 6e 20 74  nal integer in t
1a10: 68 65 20 6c 69 73 74 20 66 6f 72 20 65 61 63 68  he list for each
1a20: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  .    ** column o
1a30: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
1a40: 69 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  is additional in
1a50: 74 65 67 65 72 20 69 73 20 61 20 67 75 65 73 73  teger is a guess
1a60: 20 6f 66 20 68 6f 77 20 6d 61 6e 79 0a 20 20 20   of how many.   
1a70: 20 2a 2a 20 72 6f 77 73 20 6f 66 20 74 68 65 20   ** rows of the 
1a80: 74 61 62 6c 65 20 74 68 65 20 69 6e 64 65 78 20  table the index 
1a90: 77 69 6c 6c 20 73 65 6c 65 63 74 2e 20 20 49 66  will select.  If
1aa0: 20 44 20 69 73 20 74 68 65 20 63 6f 75 6e 74 20   D is the count 
1ab0: 6f 66 20 64 69 73 74 69 6e 63 74 0a 20 20 20 20  of distinct.    
1ac0: 2a 2a 20 76 61 6c 75 65 73 20 61 6e 64 20 4b 20  ** values and K 
1ad0: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1ae0: 62 65 72 20 6f 66 20 72 6f 77 73 2c 20 74 68 65  ber of rows, the
1af0: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73  n the integer is
1b00: 20 63 6f 6d 70 75 74 65 64 0a 20 20 20 20 2a 2a   computed.    **
1b10: 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   as:.    **.    
1b20: 2a 2a 20 20 20 20 20 20 20 20 49 20 3d 20 28 4b  **        I = (K
1b30: 2b 44 2d 31 29 2f 44 0a 20 20 20 20 2a 2a 0a 20  +D-1)/D.    **. 
1b40: 20 20 20 2a 2a 20 49 66 20 4b 3d 3d 30 20 74 68     ** If K==0 th
1b50: 65 6e 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 6d  en no entry is m
1b60: 61 64 65 20 69 6e 74 6f 20 74 68 65 20 73 71 6c  ade into the sql
1b70: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e  ite_stat1 table.
1b80: 20 20 0a 20 20 20 20 2a 2a 20 49 66 20 4b 3e 30    .    ** If K>0
1b90: 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 77 61   then it is alwa
1ba0: 79 73 20 74 68 65 20 63 61 73 65 20 74 68 65 20  ys the case the 
1bb0: 44 3e 30 20 73 6f 20 64 69 76 69 73 69 6f 6e 20  D>0 so division 
1bc0: 62 79 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 69  by zero.    ** i
1bd0: 73 20 6e 65 76 65 72 20 70 6f 73 73 69 62 6c 65  s never possible
1be0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1c00: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65   OP_MemLoad, iMe
1c10: 6d 2c 20 30 29 3b 0a 20 20 20 20 61 64 64 72 20  m, 0);.    addr 
1c20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1c30: 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  Op(v, OP_IfNot, 
1c40: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1c50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1c60: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
1c70: 74 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  tCur, 0);.    sq
1c80: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
1c90: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
1ca0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
1cb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cc0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
1cd0: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 49 64 78 2d  ng8, 0, 0, pIdx-
1ce0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
1cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d00: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
1d10: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  iMem, 0);.    sq
1d20: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
1d30: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
1d40: 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 66  , " ", 0);.    f
1d50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1d60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1d70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1d80: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d  OP_MemLoad, iMem
1d90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1da0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1db0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d  OP_MemLoad, iMem
1dc0: 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  +i+1, 0);.      
1dd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1de0: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30  (v, OP_Add, 0, 0
1df0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1e10: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
1e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1e40: 4c 6f 61 64 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20  Load, iMem+i+1, 
1e50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1e60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1e70: 5f 44 69 76 69 64 65 2c 20 30 2c 20 30 29 3b 0a  _Divide, 0, 0);.
1e80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 6f 49  eAddOp(v, OP_ToI
1ea0: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nt, 0, 0);.     
1eb0: 20 69 66 28 20 69 3d 3d 6e 43 6f 6c 2d 31 20 29   if( i==nCol-1 )
1ec0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ed0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1ee0: 5f 43 6f 6e 63 61 74 2c 20 6e 43 6f 6c 2a 32 2d  _Concat, nCol*2-
1ef0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1, 0);.      }el
1f00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1f10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1f20: 4f 50 5f 44 75 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Dup, 1, 0);. 
1f30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f40: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
1f50: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
1f60: 2c 20 33 2c 20 30 2c 20 22 61 61 61 22 2c 20 30  , 3, 0, "aaa", 0
1f70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
1f90: 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20  sert, iStatCur, 
1fa0: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
1fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1fc0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
1fd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1fe0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1ff0: 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  t will cause the
2000: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 64   most recent ind
2010: 65 78 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a  ex analysis to.*
2020: 2a 20 62 65 20 6c 61 6f 64 65 64 20 69 6e 74 6f  * be laoded into
2030: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
2040: 61 62 6c 65 73 20 77 68 65 72 65 20 69 73 20 63  ables where is c
2050: 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73  an be used..*/.s
2060: 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 41  tatic void loadA
2070: 6e 61 6c 79 73 69 73 28 50 61 72 73 65 20 2a 70  nalysis(Parse *p
2080: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
2090: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
20a0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20b0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
20c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 6f  beAddOp(v, OP_Lo
20d0: 61 64 41 6e 61 6c 79 73 69 73 2c 20 69 44 62 2c  adAnalysis, iDb,
20e0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
20f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2100: 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c   will do an anal
2110: 79 73 69 73 20 6f 66 20 61 6e 20 65 6e 74 69 72  ysis of an entir
2120: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  e database.*/.st
2130: 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a  atic void analyz
2140: 65 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  eDatabase(Parse 
2150: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
2160: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2170: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2180: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
2190: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
21a0: 70 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53  pSchema;    /* S
21b0: 63 68 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73  chema of databas
21c0: 65 20 69 44 62 20 2a 2f 0a 20 20 48 61 73 68 45  e iDb */.  HashE
21d0: 6c 65 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53  lem *k;.  int iS
21e0: 74 61 74 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d  tatCur;.  int iM
21f0: 65 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65  em;..  sqlite3Be
2200: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
2210: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
2220: 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20  );.  iStatCur = 
2230: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2240: 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28    openStatTable(
2250: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74  pParse, iDb, iSt
2260: 61 74 43 75 72 2c 20 30 29 3b 0a 20 20 69 4d 65  atCur, 0);.  iMe
2270: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
2280: 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65  ;.  for(k=sqlite
2290: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
22a0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b  ma->tblHash); k;
22b0: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
22c0: 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(k)){.    Table
22d0: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a   *pTab = (Table*
22e0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
22f0: 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f  k);.    analyzeO
2300: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
2310: 70 54 61 62 2c 20 69 53 74 61 74 43 75 72 2c 20  pTab, iStatCur, 
2320: 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61  iMem);.  }.  loa
2330: 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65  dAnalysis(pParse
2340: 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
2350: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2360: 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61  hat will do an a
2370: 6e 61 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e  nalysis of a sin
2380: 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  gle table in.** 
2390: 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  a database..*/.s
23a0: 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
23b0: 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  zeTable(Parse *p
23c0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
23d0: 61 62 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ab){.  int iDb;.
23e0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a    int iStatCur;.
23f0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
2400: 3d 30 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  =0 );.  iDb = sq
2410: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2420: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
2430: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2440: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
2450: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
2460: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69  se, 0, iDb);.  i
2470: 53 74 61 74 43 75 72 20 3d 20 70 50 61 72 73 65  StatCur = pParse
2480: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 6f 70 65 6e  ->nTab++;.  open
2490: 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65  StatTable(pParse
24a0: 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c  , iDb, iStatCur,
24b0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
24c0: 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65   analyzeOneTable
24d0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
24e0: 53 74 61 74 43 75 72 2c 20 70 50 61 72 73 65 2d  StatCur, pParse-
24f0: 3e 6e 4d 65 6d 29 3b 0a 20 20 6c 6f 61 64 41 6e  >nMem);.  loadAn
2500: 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69  alysis(pParse, i
2510: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Db);.}../*.** Ge
2520: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2530: 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
2540: 61 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65 72  and.  The parser
2550: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
2560: 69 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72  ine.** when it r
2570: 65 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41  ecognizes an ANA
2580: 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
2590: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
25a0: 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE              
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
25c0: 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41   1.**        ANA
25d0: 4c 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e  LYZE  <database>
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41  -- 2.**        A
2600: 4e 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61  NALYZE  ?<databa
2610: 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
2620: 20 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 3.**.** For
2630: 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
2640: 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
2650: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
2660: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e   to be analyzed.
2670: 0a 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79  .** Form 2 analy
2680: 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  zes all indices 
2690: 74 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62  the single datab
26a0: 61 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f  ase named..** Fo
26b0: 72 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c  rm 3 analyzes al
26c0: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
26d0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
26e0: 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  med table..*/.vo
26f0: 69 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a  id sqlite3Analyz
2700: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2710: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
2720: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
2730: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2740: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
2750: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  t iDb;.  int i;.
2760: 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b    char *z, *zDb;
2770: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
2780: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
2790: 61 6d 65 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ame;..  /* Read 
27a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
27b0: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
27c0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
27d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
27e0: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
27f0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2800: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
2810: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
2820: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
2830: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2840: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
2850: 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
2860: 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41 6e    /* Form 1:  An
2870: 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alyze everything
2880: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
2890: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
28a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  {.      if( i==1
28b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
28c0: 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65 20   Do not analyze 
28d0: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
28e0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c 79  e */.      analy
28f0: 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73  zeDatabase(pPars
2900: 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
2910: 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d  else if( pName2=
2920: 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 6e 3d  =0 || pName2->n=
2930: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  =0 ){.    /* For
2940: 6d 20 32 3a 20 20 41 6e 61 6c 79 7a 65 20 74 68  m 2:  Analyze th
2950: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 74 61  e database or ta
2960: 62 6c 65 20 6e 61 6d 65 64 20 2a 2f 0a 20 20 20  ble named */.   
2970: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
2980: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
2990: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30  ;.    if( iDb>=0
29a0: 20 29 7b 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a   ){.      analyz
29b0: 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  eDatabase(pParse
29c0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 65 6c 73  , iDb);.    }els
29d0: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
29e0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
29f0: 6e 28 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  n(pName1);.     
2a00: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
2a10: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
2a20: 65 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, z, 0);.      
2a30: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
2a40: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
2a50: 0a 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65  .        analyze
2a60: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2a70: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
2a80: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2a90: 2f 2a 20 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79  /* Form 3: Analy
2aa0: 7a 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ze the fully qua
2ab0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
2ac0: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
2ad0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
2ae0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
2af0: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c  , pName2, &pTabl
2b00: 65 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  eName);.    if( 
2b10: 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  iDb>=0 ){.      
2b20: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
2b30: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
2b40: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
2b50: 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e  romToken(pTableN
2b60: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ame);.      pTab
2b70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
2b80: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 7a 2c  Table(pParse, z,
2b90: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   zDb);.      sql
2ba0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
2bb0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
2bc0: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62        analyzeTab
2bd0: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
2be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
2bf0: 20 20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20    .  }.}../*.** 
2c00: 55 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  Used to pass inf
2c10: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2c20: 65 20 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65  e analyzer reade
2c30: 72 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  r through to the
2c40: 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  .** callback rou
2c50: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
2c60: 20 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73   struct analysis
2c70: 49 6e 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66  Info analysisInf
2c80: 6f 3b 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73  o;.struct analys
2c90: 69 73 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74  isInfo {.  sqlit
2ca0: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
2cb0: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b  char *zDatabase;
2cc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
2cd0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
2ce0: 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
2cf0: 68 20 69 6e 64 65 78 20 77 68 65 6e 20 72 65 61  h index when rea
2d00: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ding the.** sqli
2d10: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20  te_stat1 table. 
2d20: 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76   .**.**     argv
2d30: 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68  [0] = name of th
2d40: 65 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 61  e index.**     a
2d50: 72 67 76 5b 31 5d 20 3d 20 72 65 73 75 6c 74 73  rgv[1] = results
2d60: 20 6f 66 20 61 6e 61 6c 79 73 69 73 20 2d 20 6f   of analysis - o
2d70: 6e 20 69 6e 74 65 67 65 72 20 66 6f 72 20 65 61  n integer for ea
2d80: 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  ch column.*/.sta
2d90: 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 73 69 73  tic int analysis
2da0: 4c 6f 61 64 65 72 28 76 6f 69 64 20 2a 70 44 61  Loader(void *pDa
2db0: 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68  ta, int argc, ch
2dc0: 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20  ar **argv, char 
2dd0: 2a 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  **azNotUsed){.  
2de0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70 49  analysisInfo *pI
2df0: 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73 49  nfo = (analysisI
2e00: 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49 6e  nfo*)pData;.  In
2e10: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69  dex *pIndex;.  i
2e20: 6e 74 20 69 2c 20 63 3b 0a 20 20 75 6e 73 69 67  nt i, c;.  unsig
2e30: 6e 65 64 20 69 6e 74 20 76 3b 0a 20 20 63 6f 6e  ned int v;.  con
2e40: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  st char *z;..  a
2e50: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 20 29  ssert( argc==2 )
2e60: 3b 0a 20 20 69 66 28 20 61 72 67 76 3d 3d 30 20  ;.  if( argv==0 
2e70: 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c  || argv[0]==0 ||
2e80: 20 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a 20   argv[1]==0 ){. 
2e90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2ea0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2eb0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 70 49 6e  te3FindIndex(pIn
2ec0: 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c  fo->db, argv[0],
2ed0: 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73   pInfo->zDatabas
2ee0: 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
2ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2f00: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61  n 0;.  }.  z = a
2f10: 72 67 76 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  rgv[1];.  for(i=
2f20: 30 3b 20 2a 7a 20 26 26 20 69 3c 3d 70 49 6e 64  0; *z && i<=pInd
2f30: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
2f40: 29 7b 0a 20 20 20 20 76 20 3d 20 30 3b 0a 20 20  ){.    v = 0;.  
2f50: 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 30 5d    while( (c=z[0]
2f60: 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27  )>='0' && c<='9'
2f70: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a   ){.      v = v*
2f80: 31 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20  10 + c - '0';.  
2f90: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
2fa0: 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77     pIndex->aiRow
2fb0: 45 73 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20  Est[i] = v;.    
2fc0: 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b  if( *z==' ' ) z+
2fd0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2fe0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  0;.}../*.** Load
2ff0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
3000: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
3010: 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20   table into the 
3020: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
3030: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3040: 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 73  e3AnalysisLoad(s
3050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3060: 69 44 62 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73  iDb){.  analysis
3070: 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a 20 20 48 61  Info sInfo;.  Ha
3080: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 63 68 61  shElem *i;.  cha
3090: 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 2f 2a 20 43  r *zSql;..  /* C
30a0: 6c 65 61 72 20 61 6e 79 20 70 72 69 6f 72 20 73  lear any prior s
30b0: 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 66  tatistics */.  f
30c0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
30d0: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44  irst(&db->aDb[iD
30e0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
30f0: 61 73 68 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48  ash);i;i=sqliteH
3100: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
3110: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
3120: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
3130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 66  ;.    sqlite3Def
3140: 61 75 6c 74 52 6f 77 45 73 74 28 70 49 64 78 29  aultRowEst(pIdx)
3150: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
3160: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
3170: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
3180: 74 61 62 6c 65 20 65 78 69 73 74 73 73 20 2a 2f  table existss */
3190: 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20 64 62  .  sInfo.db = db
31a0: 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62  ;.  sInfo.zDatab
31b0: 61 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ase = db->aDb[iD
31c0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  b].zName;.  if( 
31d0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
31e0: 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  (db, "sqlite_sta
31f0: 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61  t1", sInfo.zData
3200: 62 61 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  base)==0 ){.    
3210: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 0a 20   return;.  }... 
3220: 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61   /* Load new sta
3230: 74 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74  tistics out of t
3240: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
3250: 74 61 62 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20  table */.  zSql 
3260: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
3270: 28 22 53 45 4c 45 43 54 20 69 64 78 2c 20 73 74  ("SELECT idx, st
3280: 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  at FROM %Q.sqlit
3290: 65 5f 73 74 61 74 31 22 2c 0a 20 20 20 20 20 20  e_stat1",.      
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73    sInfo.zDatabas
32c0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66  e);.  sqlite3Saf
32d0: 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 73 71  etyOff(db);.  sq
32e0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
32f0: 53 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c 6f 61  Sql, analysisLoa
3300: 64 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30 29 3b  der, &sInfo, 0);
3310: 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  .  sqlite3Safety
3320: 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  On(db);.  sqlite
3330: 46 72 65 65 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 0a  Free(zSql);.}...
3340: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3350: 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a 2f  _OMIT_ANALYZE */
3360: 0a                                               .