/ Hex Artifact Content
Login

Artifact fd2fe03b10dd5058747083362e56dec5bd9c4e5c:


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: 34 20 32 30 30 36 2f 30 31 2f 30 38 20 31 38 3a  4 2006/01/08 18:
01e0: 31 30 3a 31 38 20 64 72 68 20 45 78 70 20 24 0a  10:18 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 2f 2a 20 4f 70 65 6e 20 61 20 63 75      /* Open a cu
1070: 72 73 6f 72 20 74 6f 20 74 68 65 20 69 6e 64 65  rsor to the inde
1080: 78 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  x to be analyzed
1090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
10a0: 72 74 28 20 69 44 62 3d 3d 73 71 6c 69 74 65 33  rt( iDb==sqlite3
10b0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
10c0: 61 72 73 65 2d 3e 64 62 2c 20 70 49 64 78 2d 3e  arse->db, pIdx->
10d0: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
10e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10f0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1100: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62  iDb, 0);.    Vdb
1110: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1120: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
1130: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
1140: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  dbeOp3(v, OP_Ope
1150: 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
1160: 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20  pIdx->tnum,.    
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b   (char*)&pIdx->k
1190: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
11a0: 46 4f 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  FO);.    nCol = 
11b0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
11c0: 20 20 20 69 66 28 20 69 4d 65 6d 2b 6e 43 6f 6c     if( iMem+nCol
11d0: 2a 32 3e 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  *2>=pParse->nMem
11e0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
11f0: 2d 3e 6e 4d 65 6d 20 3d 20 69 4d 65 6d 2b 6e 43  ->nMem = iMem+nC
1200: 6f 6c 2a 32 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  ol*2+1;.    }.  
1210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1220: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
1230: 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c  olumns, iIdxCur,
1240: 20 6e 43 6f 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f   nCol+1);..    /
1250: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  * Memory cells a
1260: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
1270: 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
1280: 2a 20 20 20 20 6d 65 6d 5b 69 4d 65 6d 5d 3a 20  *    mem[iMem]: 
1290: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
12a0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
12b0: 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
12c0: 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 6d 65 6d  e..    **    mem
12d0: 5b 69 4d 65 6d 2b 31 5d 3a 20 20 20 20 20 20 20  [iMem+1]:       
12e0: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 64 69      Number of di
12f0: 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20 69 6e  stinct values in
1300: 20 63 6f 6c 75 6d 6e 20 31 0a 20 20 20 20 2a 2a   column 1.    **
1310: 20 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20      ....    **  
1320: 20 20 6d 65 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 5d    mem[iMem+nCol]
1330: 3a 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20  :        Number 
1340: 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  of distinct valu
1350: 65 73 20 69 6e 20 63 6f 6c 75 6d 6e 20 4e 0a 20  es in column N. 
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 2b 31 5d 20 20 20 20 20 20 20  m+nCol+1]       
1380: 4c 61 73 74 20 6f 62 73 65 72 76 65 64 20 76 61  Last observed va
1390: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 31 0a  lue of column 1.
13a0: 20 20 20 20 2a 2a 20 20 20 20 2e 2e 2e 0a 20 20      **    ....  
13b0: 20 20 2a 2a 20 20 20 20 6d 65 6d 5b 69 4d 65 6d    **    mem[iMem
13c0: 2b 6e 43 6f 6c 2b 6e 43 6f 6c 5d 3a 20 20 20 4c  +nCol+nCol]:   L
13d0: 61 73 74 20 6f 62 73 65 72 76 65 64 20 76 61 6c  ast observed val
13e0: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 4e 0a 20  ue of column N. 
13f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 65 6c     **.    ** Cel
1400: 6c 73 20 69 4d 65 6d 20 74 68 72 6f 75 67 68 20  ls iMem through 
1410: 69 4d 65 6d 2b 6e 43 6f 6c 20 61 72 65 20 69 6e  iMem+nCol are in
1420: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 2e 20  itialized to 0. 
1430: 20 54 68 65 20 6f 74 68 65 72 73 0a 20 20 20 20   The others.    
1440: 2a 2a 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ** are initializ
1450: 65 64 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  ed to NULL..    
1460: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1470: 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  i<=nCol; i++){. 
1480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1490: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
14a0: 6e 74 2c 20 30 2c 20 69 4d 65 6d 2b 69 29 3b 0a  nt, 0, iMem+i);.
14b0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
14c0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
14d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
14f0: 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2b 6e 43 6f 6c  mNull, iMem+nCol
1500: 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  +i+1, 0);.    }.
1510: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 61  .    /* Do the a
1520: 6e 61 6c 79 73 69 73 2e 0a 20 20 20 20 2a 2f 0a  nalysis..    */.
1530: 20 20 20 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20      endOfLoop = 
1540: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1550: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
1560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1570: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78   OP_Rewind, iIdx
1580: 43 75 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b  Cur, endOfLoop);
1590: 0a 20 20 20 20 74 6f 70 4f 66 4c 6f 6f 70 20 3d  .    topOfLoop =
15a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15b0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d0: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20  (v, OP_MemIncr, 
15e0: 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 66 6f  1, iMem);.    fo
15f0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
1600: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1610: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1620: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
1630: 72 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, i);.      sql
1640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1650: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65   OP_MemLoad, iMe
1660: 6d 2b 6e 43 6f 6c 2b 69 2b 31 2c 20 30 29 3b 0a  m+nCol+i+1, 0);.
1670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1680: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c  eAddOp(v, OP_Ne,
1690: 20 30 78 31 30 30 2c 20 30 29 3b 0a 20 20 20 20   0x100, 0);.    
16a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
16b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
16c0: 6f 2c 20 30 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29  o, 0, endOfLoop)
16d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
16e0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
16f0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1700: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1710: 5f 4d 65 6d 49 6e 63 72 2c 20 31 2c 20 69 4d 65  _MemIncr, 1, iMe
1720: 6d 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  m+i+1);.      sq
1730: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1740: 32 28 76 2c 20 74 6f 70 4f 66 4c 6f 6f 70 20 2b  2(v, topOfLoop +
1750: 20 33 2a 69 20 2b 20 33 2c 20 61 64 64 72 29 3b   3*i + 3, addr);
1760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1770: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
1780: 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69  lumn, iIdxCur, i
1790: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17b0: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2b 6e  MemStore, iMem+n
17c0: 43 6f 6c 2b 69 2b 31 2c 20 31 29 3b 0a 20 20 20  Col+i+1, 1);.   
17d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
17e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17f0: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20  , endOfLoop);.  
1800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1810: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
1820: 49 64 78 43 75 72 2c 20 74 6f 70 4f 66 4c 6f 6f  IdxCur, topOfLoo
1830: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
1840: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
1850: 6c 6f 73 65 2c 20 69 49 64 78 43 75 72 2c 20 30  lose, iIdxCur, 0
1860: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  );..    /* Store
1870: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 0a   the results.  .
1880: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1890: 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 69  e result is a si
18a0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
18b0: 73 71 6c 69 74 65 5f 73 74 6d 74 31 20 74 61 62  sqlite_stmt1 tab
18c0: 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 0a 20  le.  The first. 
18d0: 20 20 20 2a 2a 20 74 77 6f 20 63 6f 6c 75 6d 6e     ** two column
18e0: 73 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20  s are the names 
18f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
1900: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74 68 69   index.  The thi
1910: 72 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a  rd column.    **
1920: 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6d   is a string com
1930: 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74 20  posed of a list 
1940: 6f 66 20 69 6e 74 65 67 65 72 20 73 74 61 74 69  of integer stati
1950: 73 74 69 63 73 20 61 62 6f 75 74 20 74 68 65 0a  stics about the.
1960: 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 54      ** index.  T
1970: 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
1980: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   in the list is 
1990: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
19a0: 20 6f 66 20 65 6e 74 69 72 65 73 0a 20 20 20 20   of entires.    
19b0: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ** in the index.
19c0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 61    There is one a
19d0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65  dditional intege
19e0: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 66 6f  r in the list fo
19f0: 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 63 6f  r each.    ** co
1a00: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
1a10: 65 2e 20 20 54 68 69 73 20 61 64 64 69 74 69 6f  e.  This additio
1a20: 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 73 20 61  nal integer is a
1a30: 20 67 75 65 73 73 20 6f 66 20 68 6f 77 20 6d 61   guess of how ma
1a40: 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 73 20 6f  ny.    ** rows o
1a50: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  f the table the 
1a60: 69 6e 64 65 78 20 77 69 6c 6c 20 73 65 6c 65 63  index will selec
1a70: 74 2e 20 20 49 66 20 44 20 69 73 20 74 68 65 20  t.  If D is the 
1a80: 63 6f 75 6e 74 20 6f 66 20 64 69 73 74 69 6e 63  count of distinc
1a90: 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  t.    ** values 
1aa0: 61 6e 64 20 4b 20 69 73 20 74 68 65 20 74 6f 74  and K is the tot
1ab0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
1ac0: 73 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  s, then the inte
1ad0: 67 65 72 20 69 73 20 63 6f 6d 70 75 74 65 64 0a  ger is computed.
1ae0: 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20 20 20 2a      ** as:.    *
1af0: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1b00: 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20  I = (K+D-1)/D.  
1b10: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 4b    **.    ** If K
1b20: 3d 3d 30 20 74 68 65 6e 20 6e 6f 20 65 6e 74 72  ==0 then no entr
1b30: 79 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 74  y is made into t
1b40: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
1b50: 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2a 20  table.  .    ** 
1b60: 49 66 20 4b 3e 30 20 74 68 65 6e 20 69 74 20 69  If K>0 then it i
1b70: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
1b80: 65 20 74 68 65 20 44 3e 30 20 73 6f 20 64 69 76  e the D>0 so div
1b90: 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f 0a 20 20  ision by zero.  
1ba0: 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20 70 6f    ** is never po
1bb0: 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  ssible..    */. 
1bc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
1be0: 64 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  d, iMem, 0);.   
1bf0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1c00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1c10: 66 4e 6f 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  fNot, 0, 0);.   
1c20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c30: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  p(v, OP_NewRowid
1c40: 2c 20 69 53 74 61 74 43 75 72 2c 20 30 29 3b 0a  , iStatCur, 0);.
1c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
1c60: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
1c70: 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
1c80: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
1c90: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
1ca0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
1cb0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pIdx->zName, 0)
1cc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1ce0: 4c 6f 61 64 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  Load, iMem, 0);.
1cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
1d00: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
1d10: 2c 20 30 2c 20 30 2c 20 22 20 22 2c 20 30 29 3b  , 0, 0, " ", 0);
1d20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d30: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d50: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
1d60: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
1d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d80: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
1d90: 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 30 29 3b 0a  , iMem+i+1, 0);.
1da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1db0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
1dc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
1dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1de0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
1df0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1e00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1e10: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d  OP_MemLoad, iMem
1e20: 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  +i+1, 0);.      
1e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e40: 28 76 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20 30  (v, OP_Divide, 0
1e50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1e60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1e70: 4f 50 5f 54 6f 49 6e 74 2c 20 30 2c 20 30 29 3b  OP_ToInt, 0, 0);
1e80: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 43  .      if( i==nC
1e90: 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ol-1 ){.        
1ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eb0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 6e  (v, OP_Concat, n
1ec0: 43 6f 6c 2a 32 2d 31 2c 20 30 29 3b 0a 20 20 20  Col*2-1, 0);.   
1ed0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ef0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c  Op(v, OP_Dup, 1,
1f00: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1f10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1f20: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
1f30: 52 65 63 6f 72 64 2c 20 33 2c 20 30 2c 20 22 61  Record, 3, 0, "a
1f40: 61 61 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  aa", 0);.    sql
1f50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1f60: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61   OP_Insert, iSta
1f70: 74 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  tCur, 0);.    sq
1f80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1f90: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  e(v, addr);.  }.
1fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1fb0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1fc0: 20 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20   cause the most 
1fd0: 72 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61  recent index ana
1fe0: 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c  lysis to.** be l
1ff0: 61 6f 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  aoded into inter
2000: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
2010: 77 68 65 72 65 20 69 73 20 63 61 6e 20 62 65 20  where is can be 
2020: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
2030: 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69  void loadAnalysi
2040: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
2050: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
2060: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
2070: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
2080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2090: 70 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c  p(v, OP_LoadAnal
20a0: 79 73 69 73 2c 20 69 44 62 2c 20 30 29 3b 0a 7d  ysis, iDb, 0);.}
20b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
20c0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
20d0: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
20e0: 66 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61  f an entire data
20f0: 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  base.*/.static v
2100: 6f 69 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62  oid analyzeDatab
2110: 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
2120: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
2130: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2140: 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 53 63 68  rse->db;.  DbSch
2150: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
2160: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
2170: 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d  ema;    /* Schem
2180: 61 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 44  a of database iD
2190: 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  b */.  HashElem 
21a0: 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43  *k;.  int iStatC
21b0: 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  ur;.  int iMem;.
21c0: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
21d0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
21e0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
21f0: 20 69 53 74 61 74 43 75 72 20 3d 20 70 50 61 72   iStatCur = pPar
2200: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 6f 70  se->nTab++;.  op
2210: 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72  enStatTable(pPar
2220: 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75  se, iDb, iStatCu
2230: 72 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  r, 0);.  iMem = 
2240: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2250: 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
2260: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
2270: 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73  tblHash); k; k=s
2280: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
2290: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
22a0: 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
22b0: 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
22c0: 20 20 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61      analyzeOneTa
22d0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
22e0: 2c 20 69 53 74 61 74 43 75 72 2c 20 69 4d 65 6d  , iStatCur, iMem
22f0: 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61  );.  }.  loadAna
2300: 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44  lysis(pParse, iD
2310: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
2320: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2330: 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79  will do an analy
2340: 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sis of a single 
2350: 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61  table in.** a da
2360: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
2370: 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 54 61  c void analyzeTa
2380: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
2390: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
23a0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
23b0: 74 20 69 53 74 61 74 43 75 72 3b 0a 0a 20 20 61  t iStatCur;..  a
23c0: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
23d0: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
23e0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
23f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
2400: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  >pSchema);.  sql
2410: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
2420: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
2430: 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74  0, iDb);.  iStat
2440: 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Cur = pParse->nT
2450: 61 62 2b 2b 3b 0a 20 20 6f 70 65 6e 53 74 61 74  ab++;.  openStat
2460: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
2470: 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54 61  b, iStatCur, pTa
2480: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 61 6e 61  b->zName);.  ana
2490: 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61  lyzeOneTable(pPa
24a0: 72 73 65 2c 20 70 54 61 62 2c 20 69 53 74 61 74  rse, pTab, iStat
24b0: 43 75 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  Cur, pParse->nMe
24c0: 6d 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73  m);.  loadAnalys
24d0: 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  is(pParse, iDb);
24e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
24f0: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
2500: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
2510: 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c    The parser cal
2520: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ls this routine.
2530: 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f 67  ** when it recog
2540: 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45  nizes an ANALYZE
2550: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
2560: 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20         ANALYZE  
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
2590: 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45  *        ANALYZE
25a0: 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20 20    <database>    
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
25c0: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
25d0: 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  ZE  ?<database>.
25e0: 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
25f0: 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   3.**.** Form 1 
2600: 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
2610: 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
2620: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
2630: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20  be analyzed..** 
2640: 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20  Form 2 analyzes 
2650: 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65 20  all indices the 
2660: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
2670: 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33  named..** Form 3
2680: 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e   analyzes all in
2690: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
26a0: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
26b0: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
26c0: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50 61  qlite3Analyze(Pa
26d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
26e0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
26f0: 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71  n *pName2){.  sq
2700: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2710: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
2720: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  b;.  int i;.  ch
2730: 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54  ar *z, *zDb;.  T
2740: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 54 6f  able *pTab;.  To
2750: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b  ken *pTableName;
2760: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
2770: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
2780: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2790: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
27a0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
27b0: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
27c0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
27d0: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
27e0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
27f0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
2800: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2810: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
2820: 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  me1==0 ){.    /*
2830: 20 46 6f 72 6d 20 31 3a 20 20 41 6e 61 6c 79 7a   Form 1:  Analyz
2840: 65 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a  e everything */.
2850: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
2860: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2870: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
2880: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 44 6f 20  ontinue;  /* Do 
2890: 6e 6f 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20  not analyze the 
28a0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
28b0: 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61  .      analyzeDa
28c0: 74 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69  tabase(pParse, i
28d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
28e0: 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c   if( pName2==0 |
28f0: 7c 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29  | pName2->n==0 )
2900: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a  {.    /* Form 2:
2910: 20 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61    Analyze the da
2920: 74 61 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20  tabase or table 
2930: 6e 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62  named */.    iDb
2940: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
2950: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
2960: 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
2970: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74        analyzeDat
2980: 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 44  abase(pParse, iD
2990: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  b);.    }else{. 
29a0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
29b0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
29c0: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 54 61  ame1);.      pTa
29d0: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
29e0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 7a  eTable(pParse, z
29f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2a00: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
2a10: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
2a20: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
2a30: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
2a40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
2a60: 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20 74  orm 3: Analyze t
2a70: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
2a80: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ed table name */
2a90: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
2aa0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
2ab0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
2ac0: 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61 6d  ame2, &pTableNam
2ad0: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e  e);.    if( iDb>
2ae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20  =0 ){.      zDb 
2af0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
2b00: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Name;.      z = 
2b10: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
2b20: 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29  oken(pTableName)
2b30: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  ;.      pTab = s
2b40: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2b50: 65 28 70 50 61 72 73 65 2c 20 7a 2c 20 7a 44 62  e(pParse, z, zDb
2b60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
2b70: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66  ree(z);.      if
2b80: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
2b90: 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70    analyzeTable(p
2ba0: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
2bb0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 0a 20      }.    }   . 
2bc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64   }.}../*.** Used
2bd0: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
2be0: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 6e  tion from the an
2bf0: 61 6c 79 7a 65 72 20 72 65 61 64 65 72 20 74 68  alyzer reader th
2c00: 72 6f 75 67 68 20 74 6f 20 74 68 65 0a 2a 2a 20  rough to the.** 
2c10: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
2c20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2c30: 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  uct analysisInfo
2c40: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 3b 0a 73   analysisInfo;.s
2c50: 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e  truct analysisIn
2c60: 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  fo {.  sqlite3 *
2c70: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
2c80: 20 2a 7a 44 61 74 61 62 61 73 65 3b 0a 7d 3b 0a   *zDatabase;.};.
2c90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  ./*.** This call
2ca0: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
2cb0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
2cc0: 64 65 78 20 77 68 65 6e 20 72 65 61 64 69 6e 67  dex when reading
2cd0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73   the.** sqlite_s
2ce0: 74 61 74 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a  tat1 table.  .**
2cf0: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20  .**     argv[0] 
2d00: 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  = name of the in
2d10: 64 65 78 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  dex.**     argv[
2d20: 31 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20  1] = results of 
2d30: 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e  analysis - on in
2d40: 74 65 67 65 72 20 66 6f 72 20 65 61 63 68 20 63  teger for each c
2d50: 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
2d60: 69 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64  int analysisLoad
2d70: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  er(void *pData, 
2d80: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
2d90: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 61 7a  *argv, char **az
2da0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c  NotUsed){.  anal
2db0: 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  ysisInfo *pInfo 
2dc0: 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a  = (analysisInfo*
2dd0: 29 70 44 61 74 61 3b 0a 20 20 49 6e 64 65 78 20  )pData;.  Index 
2de0: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 69  *pIndex;.  int i
2df0: 2c 20 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  , c;.  unsigned 
2e00: 69 6e 74 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63  int v;.  const c
2e10: 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
2e20: 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20  t( argc==2 );.  
2e30: 69 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61  if( argv==0 || a
2e40: 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67  rgv[0]==0 || arg
2e50: 76 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  v[1]==0 ){.    r
2e60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
2e70: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
2e80: 69 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e  indIndex(pInfo->
2e90: 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e  db, argv[0], pIn
2ea0: 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  fo->zDatabase);.
2eb0: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
2ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2ed0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b  .  }.  z = argv[
2ee0: 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 2a  1];.  for(i=0; *
2ef0: 7a 20 26 26 20 69 3c 3d 70 49 6e 64 65 78 2d 3e  z && i<=pIndex->
2f00: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2f10: 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68     v = 0;.    wh
2f20: 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27  ile( (c=z[0])>='
2f30: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a  0' && c<='9' ){.
2f40: 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b        v = v*10 +
2f50: 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20   c - '0';.      
2f60: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  z++;.    }.    p
2f70: 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
2f80: 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66 28 20  i] = v;.    if( 
2f90: 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20  *z==' ' ) z++;. 
2fa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2fb0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
2fc0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2fd0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
2fe0: 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 65  le into the inde
2ff0: 78 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a  x hash tables..*
3000: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6e  /.void sqlite3An
3010: 61 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c 69 74  alysisLoad(sqlit
3020: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
3030: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
3040: 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c   sInfo;.  HashEl
3050: 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a  em *i;.  char *z
3060: 53 71 6c 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  Sql;..  /* Clear
3070: 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74 69   any prior stati
3080: 73 74 69 63 73 20 2a 2f 0a 20 20 66 6f 72 28 69  stics */.  for(i
3090: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
30a0: 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  (&db->aDb[iDb].p
30b0: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29  Schema->idxHash)
30c0: 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  ;i;i=sqliteHashN
30d0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64  ext(i)){.    Ind
30e0: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
30f0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
3100: 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
3110: 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20 20  RowEst(pIdx);.  
3120: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
3130: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
3140: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
3150: 65 20 65 78 69 73 74 73 73 20 2a 2f 0a 20 20 73  e existss */.  s
3160: 49 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  Info.db = db;.  
3170: 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 20  sInfo.zDatabase 
3180: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
3190: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69  Name;.  if( sqli
31a0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
31b0: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
31c0: 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
31d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )==0 ){.     ret
31e0: 75 72 6e 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  urn;.  }...  /* 
31f0: 4c 6f 61 64 20 6e 65 77 20 73 74 61 74 69 73 74  Load new statist
3200: 69 63 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ics out of the s
3210: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
3220: 65 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73 71  e */.  zSql = sq
3230: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 53 45  lite3MPrintf("SE
3240: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 74 20 46  LECT idx, stat F
3250: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
3260: 61 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  at1",.          
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 49                sI
3280: 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  nfo.zDatabase);.
3290: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
32a0: 66 66 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ff(db);.  sqlite
32b0: 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
32c0: 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c   analysisLoader,
32d0: 20 26 73 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 73   &sInfo, 0);.  s
32e0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64  qlite3SafetyOn(d
32f0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
3300: 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 0a 23 65 6e 64  (zSql);.}...#end
3310: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
3320: 54 5f 41 4e 41 4c 59 5a 45 20 2a 2f 0a           T_ANALYZE */.