/ Hex Artifact Content
Login

Artifact e239496cfb5394ac8867f1c112905ddab8d01cd9:


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 35   analyze.c,v 1.5
01d0: 32 20 32 30 30 39 2f 30 34 2f 31 36 20 31 37 3a  2 2009/04/16 17:
01e0: 34 35 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a  45:48 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 75 38 20 63 72 65 61 74 65 53 74 61 74 31 20   u8 createStat1 
04c0: 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53  = 0;.  Table *pS
04d0: 74 61 74 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  tat;.  Vdbe *v =
04e0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
04f0: 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20  pParse);..  if( 
0500: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
0510: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0520: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
0530: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 61 73  exes(db) );.  as
0540: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
0550: 65 44 62 28 76 29 3d 3d 64 62 20 29 3b 0a 20 20  eDb(v)==db );.  
0560: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
0570: 44 62 5d 3b 0a 20 20 69 66 28 20 28 70 53 74 61  Db];.  if( (pSta
0580: 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  t = sqlite3FindT
0590: 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
05a0: 5f 73 74 61 74 31 22 2c 20 70 44 62 2d 3e 7a 4e  _stat1", pDb->zN
05b0: 61 6d 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ame))==0 ){.    
05c0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  /* The sqlite_st
05d0: 61 74 31 20 74 61 62 6c 65 73 20 64 6f 65 73 20  at1 tables does 
05e0: 6e 6f 74 20 65 78 69 73 74 2e 20 20 43 72 65 61  not exist.  Crea
05f0: 74 65 20 69 74 2e 20 20 0a 20 20 20 20 2a 2a 20  te it.  .    ** 
0600: 4e 6f 74 65 20 74 68 61 74 20 61 20 73 69 64 65  Note that a side
0610: 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43  -effect of the C
0620: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
0630: 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76  ement is to leav
0640: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 6f  e.    ** the roo
0650: 74 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77  tpage of the new
0660: 20 74 61 62 6c 65 20 69 6e 20 72 65 67 69 73 74   table in regist
0670: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
0680: 6f 74 2e 20 20 54 68 69 73 20 69 73 0a 20 20 20  ot.  This is.   
0690: 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   ** important be
06a0: 63 61 75 73 65 20 74 68 65 20 4f 70 65 6e 57 72  cause the OpenWr
06b0: 69 74 65 20 6f 70 63 6f 64 65 20 62 65 6c 6f 77  ite opcode below
06c0: 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67   will be needing
06d0: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69   it. */.    sqli
06e0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
06f0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 43 52  Parse,.      "CR
0700: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
0710: 6c 69 74 65 5f 73 74 61 74 31 28 74 62 6c 2c 69  lite_stat1(tbl,i
0720: 64 78 2c 73 74 61 74 29 22 2c 0a 20 20 20 20 20  dx,stat)",.     
0730: 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20   pDb->zName.    
0740: 29 3b 0a 20 20 20 20 69 52 6f 6f 74 50 61 67 65  );.    iRootPage
0750: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
0760: 6f 74 3b 0a 20 20 20 20 63 72 65 61 74 65 53 74  ot;.    createSt
0770: 61 74 31 20 3d 20 31 3b 20 20 2f 2a 20 43 61 75  at1 = 1;  /* Cau
0780: 73 65 20 72 6f 6f 74 70 61 67 65 20 74 6f 20 62  se rootpage to b
0790: 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 6f 70  e taken from top
07a0: 20 6f 66 20 73 74 61 63 6b 20 2a 2f 0a 20 20 7d   of stack */.  }
07b0: 65 6c 73 65 20 69 66 28 20 7a 57 68 65 72 65 20  else if( zWhere 
07c0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 71  ){.    /* The sq
07d0: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
07e0: 20 65 78 69 73 74 73 2e 20 20 44 65 6c 65 74 65   exists.  Delete
07f0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 61 73 73   all entries ass
0800: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
0810: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 7a 57   ** the table zW
0820: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  here. */.    sql
0830: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
0840: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
0850: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
0860: 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
0870: 45 20 74 62 6c 3d 25 51 22 2c 0a 20 20 20 20 20  E tbl=%Q",.     
0880: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 57    pDb->zName, zW
0890: 68 65 72 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  here.    );.    
08a0: 69 52 6f 6f 74 50 61 67 65 20 3d 20 70 53 74 61  iRootPage = pSta
08b0: 74 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 65 6c 73 65  t->tnum;.  }else
08c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c  {.    /* The sql
08d0: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
08e0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
08f0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73   Delete all rows
0900: 2e 20 2a 2f 0a 20 20 20 20 69 52 6f 6f 74 50 61  . */.    iRootPa
0910: 67 65 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75 6d  ge = pStat->tnum
0920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0930: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
0940: 65 61 72 2c 20 70 53 74 61 74 2d 3e 74 6e 75 6d  ear, pStat->tnum
0950: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  , iDb);.  }..  /
0960: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
0970: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f  e_stat1 table fo
0980: 72 20 77 72 69 74 69 6e 67 2e 20 55 6e 6c 65 73  r writing. Unles
0990: 73 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64  s it was created
09a0: 0a 20 20 2a 2a 20 62 79 20 74 68 69 73 20 76 64  .  ** by this vd
09b0: 62 65 20 70 72 6f 67 72 61 6d 2c 20 6c 6f 63 6b  be program, lock
09c0: 20 69 74 20 66 6f 72 20 77 72 69 74 69 6e 67 20   it for writing 
09d0: 61 74 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  at the shared-ca
09e0: 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20 20 2a 2a  che level. .  **
09f0: 20 49 66 20 74 68 69 73 20 76 64 62 65 20 64 69   If this vdbe di
0a00: 64 20 63 72 65 61 74 65 20 74 68 65 20 73 71 6c  d create the sql
0a10: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c  ite_stat1 table,
0a20: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 68 61   then it must ha
0a30: 76 65 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  ve .  ** already
0a40: 20 6f 62 74 61 69 6e 65 64 20 61 20 73 63 68 65   obtained a sche
0a50: 6d 61 2d 6c 6f 63 6b 2c 20 6d 61 6b 69 6e 67 20  ma-lock, making 
0a60: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 72  the write-lock r
0a70: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 2a 2f 0a 20  edundant..  */. 
0a80: 20 69 66 28 20 21 63 72 65 61 74 65 53 74 61 74   if( !createStat
0a90: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
0aa0: 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
0ab0: 2c 20 69 44 62 2c 20 69 52 6f 6f 74 50 61 67 65  , iDb, iRootPage
0ac0: 2c 20 31 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  , 1, "sqlite_sta
0ad0: 74 31 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  t1");.  }.  sqli
0ae0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
0af0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
0b00: 53 74 61 74 43 75 72 2c 20 69 52 6f 6f 74 50 61  StatCur, iRootPa
0b10: 67 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  ge, iDb);.  sqli
0b20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
0b30: 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 33  v, -1, (char *)3
0b40: 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 73  , P4_INT32);.  s
0b50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
0b60: 50 35 28 76 2c 20 63 72 65 61 74 65 53 74 61 74  P5(v, createStat
0b70: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  1);.}../*.** Gen
0b80: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
0b90: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
0ba0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
0bb0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  ciated with.** a
0bc0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a   single table..*
0bd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  /.static void an
0be0: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 0a 20  alyzeOneTable(. 
0bf0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0c00: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
0c10: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
0c20: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61 62  pTab,     /* Tab
0c30: 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63 65 73  le whose indices
0c40: 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61 6c 79   are to be analy
0c50: 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  zed */.  int iSt
0c60: 61 74 43 75 72 2c 20 20 20 20 2f 2a 20 49 6e 64  atCur,    /* Ind
0c70: 65 78 20 6f 66 20 56 64 62 65 43 75 72 73 6f 72  ex of VdbeCursor
0c80: 20 74 68 61 74 20 77 72 69 74 65 73 20 74 68 65   that writes the
0c90: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
0ca0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  ble */.  int iMe
0cb0: 6d 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61  m         /* Ava
0cc0: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f  ilable memory lo
0cd0: 63 61 74 69 6f 6e 73 20 62 65 67 69 6e 20 68 65  cations begin he
0ce0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
0cf0: 20 2a 70 49 64 78 3b 20 20 20 20 20 2f 2a 20 41   *pIdx;     /* A
0d00: 6e 20 69 6e 64 65 78 20 74 6f 20 62 65 69 6e 67  n index to being
0d10: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69   analyzed */.  i
0d20: 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
0d30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56 64 62 65  /* Index of Vdbe
0d40: 43 75 72 73 6f 72 20 66 6f 72 20 69 6e 64 65 78  Cursor for index
0d50: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
0d60: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
0d70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0d80: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
0d90: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  e index */.  Vdb
0da0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 2f 2a  e *v;         /*
0db0: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
0dc0: 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69 6c 74  hine being built
0dd0: 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20   up */.  int i; 
0de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
0df0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
0e00: 6e 74 20 74 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20  nt topOfLoop;   
0e10: 2f 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  /* The top of th
0e20: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
0e30: 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20 2f 2a 20  endOfLoop;   /* 
0e40: 54 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  The end of the l
0e50: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
0e60: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r;        /* The
0e70: 20 61 64 64 72 65 73 73 20 6f 66 20 61 6e 20 69   address of an i
0e80: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
0e90: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
0ea0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
0eb0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
0ec0: 20 70 54 61 62 20 2a 2f 0a 0a 20 20 76 20 3d 20   pTab */..  v = 
0ed0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
0ee0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
0ef0: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61 62  =0 || NEVER(pTab
0f00: 3d 3d 30 29 20 7c 7c 20 70 54 61 62 2d 3e 70 49  ==0) || pTab->pI
0f10: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ndex==0 ){.    /
0f20: 2a 20 44 6f 20 6e 6f 20 61 6e 61 6c 79 73 69 73  * Do no analysis
0f30: 20 66 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74   for tables that
0f40: 20 68 61 76 65 20 6e 6f 20 69 6e 64 69 63 65 73   have no indices
0f50: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
0f60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
0f70: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
0f80: 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65  llMutexes(pParse
0f90: 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44 62 20 3d  ->db) );.  iDb =
0fa0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
0fb0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
0fc0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
0fd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
0fe0: 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
0ff0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1000: 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
1010: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1020: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4e  Parse, SQLITE_AN
1030: 41 4c 59 5a 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ALYZE, pTab->zNa
1040: 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61  me, 0,.      pPa
1050: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
1060: 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  ].zName ) ){.   
1070: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
1080: 64 69 66 0a 0a 20 20 2f 2a 20 45 73 74 61 62 6c  dif..  /* Establ
1090: 69 73 68 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ish a read-lock 
10a0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 61 74 20  on the table at 
10b0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
10c0: 20 6c 65 76 65 6c 2e 20 2a 2f 0a 20 20 73 71 6c   level. */.  sql
10d0: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
10e0: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
10f0: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
1100: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 69 49 64 78 43  zName);..  iIdxC
1110: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
1120: 62 2b 2b 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  b++;.  for(pIdx=
1130: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1140: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1150: 4e 65 78 74 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Next){.    KeyIn
1160: 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
1170: 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
1180: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
1190: 20 20 69 6e 74 20 72 65 67 46 69 65 6c 64 73 3b    int regFields;
11a0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11b0: 62 6c 6f 63 6b 20 66 6f 72 20 62 75 69 6c 64 69  block for buildi
11c0: 6e 67 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  ng records */.  
11d0: 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
11e0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11f0: 68 6f 6c 64 69 6e 67 20 63 6f 6d 70 6c 65 74 65  holding complete
1200: 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20  d record */.    
1210: 69 6e 74 20 72 65 67 54 65 6d 70 3b 20 20 20 20  int regTemp;    
1220: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75    /* Temporary u
1230: 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
1240: 20 20 20 69 6e 74 20 72 65 67 43 6f 6c 3b 20 20     int regCol;  
1250: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
1260: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  of a column from
1270: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
1280: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 20   analyzed */.   
1290: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
12a0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
12b0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 72 65 63  the inserted rec
12c0: 6f 72 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ord */.    int r
12d0: 65 67 46 32 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  egF2;..    /* Op
12e0: 65 6e 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74  en a cursor to t
12f0: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 61  he index to be a
1300: 6e 61 6c 79 7a 65 64 0a 20 20 20 20 2a 2f 0a 20  nalyzed.    */. 
1310: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
1320: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1330: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
1340: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 20   pIdx->pSchema) 
1350: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  );.    nCol = pI
1360: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
1370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1380: 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
1390: 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 64 78  d, iIdxCur, pIdx
13a0: 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
13b0: 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
13c0: 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
13d0: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 56 64 62 65  NDOFF);.    Vdbe
13e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
13f0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
1400: 0a 20 20 20 20 72 65 67 46 69 65 6c 64 73 20 3d  .    regFields =
1410: 20 69 4d 65 6d 2b 6e 43 6f 6c 2a 32 3b 0a 20 20   iMem+nCol*2;.  
1420: 20 20 72 65 67 54 65 6d 70 20 3d 20 72 65 67 52    regTemp = regR
1430: 6f 77 69 64 20 3d 20 72 65 67 43 6f 6c 20 3d 20  owid = regCol = 
1440: 72 65 67 46 69 65 6c 64 73 2b 33 3b 0a 20 20 20  regFields+3;.   
1450: 20 72 65 67 52 65 63 20 3d 20 72 65 67 43 6f 6c   regRec = regCol
1460: 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 65 67 52  +1;.    if( regR
1470: 65 63 3e 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  ec>pParse->nMem 
1480: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
1490: 3e 6e 4d 65 6d 20 3d 20 72 65 67 52 65 63 3b 0a  >nMem = regRec;.
14a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 65      }..    /* Me
14b0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
14c0: 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  sed as follows:.
14d0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
14e0: 20 6d 65 6d 5b 69 4d 65 6d 5d 3a 20 20 20 20 20   mem[iMem]:     
14f0: 20 20 20 20 20 20 20 20 54 68 65 20 74 6f 74 61          The tota
1500: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  l number of rows
1510: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   in the table.. 
1520: 20 20 20 2a 2a 20 20 20 20 6d 65 6d 5b 69 4d 65     **    mem[iMe
1530: 6d 2b 31 5d 3a 20 20 20 20 20 20 20 20 20 20 20  m+1]:           
1540: 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
1550: 63 74 20 76 61 6c 75 65 73 20 69 6e 20 63 6f 6c  ct values in col
1560: 75 6d 6e 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  umn 1.    **    
1570: 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 6d 65  ....    **    me
1580: 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 5d 3a 20 20 20  m[iMem+nCol]:   
1590: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 64       Number of d
15a0: 69 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20 69  istinct values i
15b0: 6e 20 63 6f 6c 75 6d 6e 20 4e 0a 20 20 20 20 2a  n column N.    *
15c0: 2a 20 20 20 20 6d 65 6d 5b 69 4d 65 6d 2b 6e 43  *    mem[iMem+nC
15d0: 6f 6c 2b 31 5d 20 20 20 20 20 20 20 4c 61 73 74  ol+1]       Last
15e0: 20 6f 62 73 65 72 76 65 64 20 76 61 6c 75 65 20   observed value 
15f0: 6f 66 20 63 6f 6c 75 6d 6e 20 31 0a 20 20 20 20  of column 1.    
1600: 2a 2a 20 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a  **    ....    **
1610: 20 20 20 20 6d 65 6d 5b 69 4d 65 6d 2b 6e 43 6f      mem[iMem+nCo
1620: 6c 2b 6e 43 6f 6c 5d 3a 20 20 20 4c 61 73 74 20  l+nCol]:   Last 
1630: 6f 62 73 65 72 76 65 64 20 76 61 6c 75 65 20 6f  observed value o
1640: 66 20 63 6f 6c 75 6d 6e 20 4e 0a 20 20 20 20 2a  f column N.    *
1650: 2a 0a 20 20 20 20 2a 2a 20 43 65 6c 6c 73 20 69  *.    ** Cells i
1660: 4d 65 6d 20 74 68 72 6f 75 67 68 20 69 4d 65 6d  Mem through iMem
1670: 2b 6e 43 6f 6c 20 61 72 65 20 69 6e 69 74 69 61  +nCol are initia
1680: 6c 69 7a 65 64 20 74 6f 20 30 2e 20 20 54 68 65  lized to 0.  The
1690: 20 6f 74 68 65 72 73 0a 20 20 20 20 2a 2a 20 61   others.    ** a
16a0: 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
16b0: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  o NULL..    */. 
16c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6e     for(i=0; i<=n
16d0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
16e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16f0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1700: 2c 20 30 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20  , 0, iMem+i);.  
1710: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1720: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
1730: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1740: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1750: 6c 2c 20 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b  l, 0, iMem+nCol+
1760: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  i+1);.    }..   
1770: 20 2f 2a 20 44 6f 20 74 68 65 20 61 6e 61 6c 79   /* Do the analy
1780: 73 69 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sis..    */.    
1790: 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  endOfLoop = sqli
17a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17b0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
17c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17d0: 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72  _Rewind, iIdxCur
17e0: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20  , endOfLoop);.  
17f0: 20 20 74 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71    topOfLoop = sq
1800: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1810: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
1820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1830: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4d 65  , OP_AddImm, iMe
1840: 6d 2c 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69  m, 1);.    for(i
1850: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1860: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1870: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1880: 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
1890: 20 69 2c 20 72 65 67 43 6f 6c 29 3b 0a 20 20 20   i, regCol);.   
18a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp3(v, OP_Ne, r
18c0: 65 67 43 6f 6c 2c 20 30 2c 20 69 4d 65 6d 2b 6e  egCol, 0, iMem+n
18d0: 43 6f 6c 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20  Col+i+1);.      
18e0: 2f 2a 2a 2a 2a 20 54 4f 44 4f 3a 20 20 61 64 64  /**** TODO:  add
18f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1900: 6e 63 65 20 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 20  nce *****/.     
1910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1920: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a  geP5(v, SQLITE_J
1930: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1940: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1950: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1960: 74 6f 2c 20 30 2c 20 65 6e 64 4f 66 4c 6f 6f 70  to, 0, endOfLoop
1970: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1980: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
1990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19a0: 75 6d 70 48 65 72 65 28 76 2c 20 74 6f 70 4f 66  umpHere(v, topOf
19b0: 4c 6f 6f 70 20 2b 20 32 2a 28 69 20 2b 20 31 29  Loop + 2*(i + 1)
19c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19e0: 5f 41 64 64 49 6d 6d 2c 20 69 4d 65 6d 2b 69 2b  _AddImm, iMem+i+
19f0: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
1a00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a10: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
1a20: 78 43 75 72 2c 20 69 2c 20 69 4d 65 6d 2b 6e 43  xCur, i, iMem+nC
1a30: 6f 6c 2b 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ol+i+1);.    }. 
1a40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1a50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
1a60: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71  dOfLoop);.    sq
1a70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a80: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78  v, OP_Next, iIdx
1a90: 43 75 72 2c 20 74 6f 70 4f 66 4c 6f 6f 70 29 3b  Cur, topOfLoop);
1aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ab0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
1ac0: 73 65 2c 20 69 49 64 78 43 75 72 29 3b 0a 0a 20  se, iIdxCur);.. 
1ad0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1ae0: 72 65 73 75 6c 74 73 2e 20 20 0a 20 20 20 20 2a  results.  .    *
1af0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
1b00: 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ult is a single 
1b10: 72 6f 77 20 6f 66 20 74 68 65 20 73 71 6c 69 74  row of the sqlit
1b20: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20 20  e_stat1 table.  
1b30: 54 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  The first.    **
1b40: 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 61 72 65   two columns are
1b50: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
1b60: 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  e table and inde
1b70: 78 2e 20 20 54 68 65 20 74 68 69 72 64 20 63 6f  x.  The third co
1b80: 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 69 73 20 61  lumn.    ** is a
1b90: 20 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73 65 64   string composed
1ba0: 20 6f 66 20 61 20 6c 69 73 74 20 6f 66 20 69 6e   of a list of in
1bb0: 74 65 67 65 72 20 73 74 61 74 69 73 74 69 63 73  teger statistics
1bc0: 20 61 62 6f 75 74 20 74 68 65 0a 20 20 20 20 2a   about the.    *
1bd0: 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20 66 69  * index.  The fi
1be0: 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20 74  rst integer in t
1bf0: 68 65 20 6c 69 73 74 20 69 73 20 74 68 65 20 74  he list is the t
1c00: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65  otal number of e
1c10: 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 69 6e  ntries.    ** in
1c20: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
1c30: 72 65 20 69 73 20 6f 6e 65 20 61 64 64 69 74 69  re is one additi
1c40: 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 6e 20  onal integer in 
1c50: 74 68 65 20 6c 69 73 74 20 66 6f 72 20 65 61 63  the list for eac
1c60: 68 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  h.    ** column 
1c70: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
1c80: 68 69 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  his additional i
1c90: 6e 74 65 67 65 72 20 69 73 20 61 20 67 75 65 73  nteger is a gues
1ca0: 73 20 6f 66 20 68 6f 77 20 6d 61 6e 79 0a 20 20  s of how many.  
1cb0: 20 20 2a 2a 20 72 6f 77 73 20 6f 66 20 74 68 65    ** rows of the
1cc0: 20 74 61 62 6c 65 20 74 68 65 20 69 6e 64 65 78   table the index
1cd0: 20 77 69 6c 6c 20 73 65 6c 65 63 74 2e 20 20 49   will select.  I
1ce0: 66 20 44 20 69 73 20 74 68 65 20 63 6f 75 6e 74  f D is the count
1cf0: 20 6f 66 20 64 69 73 74 69 6e 63 74 0a 20 20 20   of distinct.   
1d00: 20 2a 2a 20 76 61 6c 75 65 73 20 61 6e 64 20 4b   ** values and K
1d10: 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1d20: 6d 62 65 72 20 6f 66 20 72 6f 77 73 2c 20 74 68  mber of rows, th
1d30: 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  en the integer i
1d40: 73 20 63 6f 6d 70 75 74 65 64 0a 20 20 20 20 2a  s computed.    *
1d50: 2a 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  * as:.    **.   
1d60: 20 2a 2a 20 20 20 20 20 20 20 20 49 20 3d 20 28   **        I = (
1d70: 4b 2b 44 2d 31 29 2f 44 0a 20 20 20 20 2a 2a 0a  K+D-1)/D.    **.
1d80: 20 20 20 20 2a 2a 20 49 66 20 4b 3d 3d 30 20 74      ** If K==0 t
1d90: 68 65 6e 20 6e 6f 20 65 6e 74 72 79 20 69 73 20  hen no entry is 
1da0: 6d 61 64 65 20 69 6e 74 6f 20 74 68 65 20 73 71  made into the sq
1db0: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
1dc0: 2e 20 20 0a 20 20 20 20 2a 2a 20 49 66 20 4b 3e  .  .    ** If K>
1dd0: 30 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 77  0 then it is alw
1de0: 61 79 73 20 74 68 65 20 63 61 73 65 20 74 68 65  ays the case the
1df0: 20 44 3e 30 20 73 6f 20 64 69 76 69 73 69 6f 6e   D>0 so division
1e00: 20 62 79 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20   by zero.    ** 
1e10: 69 73 20 6e 65 76 65 72 20 70 6f 73 73 69 62 6c  is never possibl
1e20: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64  e..    */.    ad
1e30: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1e40: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
1e50: 6f 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 73  ot, iMem);.    s
1e60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e70: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
1e80: 30 2c 20 72 65 67 46 69 65 6c 64 73 2c 20 30 2c  0, regFields, 0,
1e90: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
1ea0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1eb0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
1ec0: 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 46 69 65  ring8, 0, regFie
1ed0: 6c 64 73 2b 31 2c 20 30 2c 20 70 49 64 78 2d 3e  lds+1, 0, pIdx->
1ee0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 72  zName, 0);.    r
1ef0: 65 67 46 32 20 3d 20 72 65 67 46 69 65 6c 64 73  egF2 = regFields
1f00: 2b 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +2;.    sqlite3V
1f10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f20: 53 43 6f 70 79 2c 20 69 4d 65 6d 2c 20 72 65 67  SCopy, iMem, reg
1f30: 46 32 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  F2);.    for(i=0
1f40: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1f50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f60: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
1f70: 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 54 65 6d  ring8, 0, regTem
1f80: 70 2c 20 30 2c 20 22 20 22 2c 20 30 29 3b 0a 20  p, 0, " ", 0);. 
1f90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fa0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
1fb0: 63 61 74 2c 20 72 65 67 54 65 6d 70 2c 20 72 65  cat, regTemp, re
1fc0: 67 46 32 2c 20 72 65 67 46 32 29 3b 0a 20 20 20  gF2, regF2);.   
1fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fe0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
1ff0: 69 4d 65 6d 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20  iMem, iMem+i+1, 
2000: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
2010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2020: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
2030: 72 65 67 54 65 6d 70 2c 20 2d 31 29 3b 0a 20 20  regTemp, -1);.  
2040: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2050: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 69 76 69  ddOp3(v, OP_Divi
2060: 64 65 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 72 65  de, iMem+i+1, re
2070: 67 54 65 6d 70 2c 20 72 65 67 54 65 6d 70 29 3b  gTemp, regTemp);
2080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2090: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 54  beAddOp1(v, OP_T
20a0: 6f 49 6e 74 2c 20 72 65 67 54 65 6d 70 29 3b 0a  oInt, regTemp);.
20b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
20d0: 6e 63 61 74 2c 20 72 65 67 54 65 6d 70 2c 20 72  ncat, regTemp, r
20e0: 65 67 46 32 2c 20 72 65 67 46 32 29 3b 0a 20 20  egF2, regF2);.  
20f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
2100: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2110: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 46  MakeRecord, regF
2120: 69 65 6c 64 73 2c 20 33 2c 20 72 65 67 52 65 63  ields, 3, regRec
2130: 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a 20 20 20  , "aaa", 0);.   
2140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2150: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
2160: 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  d, iStatCur, reg
2170: 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Rowid);.    sqli
2180: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2190: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61   OP_Insert, iSta
21a0: 74 43 75 72 2c 20 72 65 67 52 65 63 2c 20 72 65  tCur, regRec, re
21b0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  gRowid);.    sql
21c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
21d0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
21e0: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
21f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2200: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
2210: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
2220: 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65   that will cause
2230: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2240: 20 69 6e 64 65 78 20 61 6e 61 6c 79 73 69 73 20   index analysis 
2250: 74 6f 0a 2a 2a 20 62 65 20 6c 61 6f 64 65 64 20  to.** be laoded 
2260: 69 6e 74 6f 20 69 6e 74 65 72 6e 61 6c 20 68 61  into internal ha
2270: 73 68 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  sh tables where 
2280: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  is can be used..
2290: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
22a0: 6f 61 64 41 6e 61 6c 79 73 69 73 28 50 61 72 73  oadAnalysis(Pars
22b0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
22c0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
22d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
22e0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
22f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2300: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2310: 4c 6f 61 64 41 6e 61 6c 79 73 69 73 2c 20 69 44  LoadAnalysis, iD
2320: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
2330: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2340: 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61  hat will do an a
2350: 6e 61 6c 79 73 69 73 20 6f 66 20 61 6e 20 65 6e  nalysis of an en
2360: 74 69 72 65 20 64 61 74 61 62 61 73 65 0a 2a 2f  tire database.*/
2370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
2380: 6c 79 7a 65 44 61 74 61 62 61 73 65 28 50 61 72  lyzeDatabase(Par
2390: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
23a0: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
23b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23c0: 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  ;.  Schema *pSch
23d0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
23e0: 62 5d 2e 70 53 63 68 65 6d 61 3b 20 20 20 20 2f  b].pSchema;    /
23f0: 2a 20 53 63 68 65 6d 61 20 6f 66 20 64 61 74 61  * Schema of data
2400: 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 48 61  base iDb */.  Ha
2410: 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20 20 69 6e 74  shElem *k;.  int
2420: 20 69 53 74 61 74 43 75 72 3b 0a 20 20 69 6e 74   iStatCur;.  int
2430: 20 69 4d 65 6d 3b 0a 0a 20 20 73 71 6c 69 74 65   iMem;..  sqlite
2440: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
2450: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
2460: 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72  iDb);.  iStatCur
2470: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2480: 2b 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54 61 62  +;.  openStatTab
2490: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  le(pParse, iDb, 
24a0: 69 53 74 61 74 43 75 72 2c 20 30 29 3b 0a 20 20  iStatCur, 0);.  
24b0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
24c0: 4d 65 6d 2b 31 3b 0a 20 20 66 6f 72 28 6b 3d 73  Mem+1;.  for(k=s
24d0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
24e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
24f0: 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ); k; k=sqliteHa
2500: 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
2510: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
2520: 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
2530: 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61  Data(k);.    ana
2540: 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61  lyzeOneTable(pPa
2550: 72 73 65 2c 20 70 54 61 62 2c 20 69 53 74 61 74  rse, pTab, iStat
2560: 43 75 72 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 0a  Cur, iMem);.  }.
2570: 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70    loadAnalysis(p
2580: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a  Parse, iDb);.}..
2590: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
25a0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f  ode that will do
25b0: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
25c0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
25d0: 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 2e  n.** a database.
25e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25f0: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72  analyzeTable(Par
2600: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
2610: 65 20 2a 70 54 61 62 29 7b 0a 20 20 69 6e 74 20  e *pTab){.  int 
2620: 69 44 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74  iDb;.  int iStat
2630: 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cur;..  assert( 
2640: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
2650: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2660: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
2670: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
2680: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2690: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
26a0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
26b0: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
26c0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
26d0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
26e0: 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75   iDb);.  iStatCu
26f0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2700: 2b 2b 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54 61  ++;.  openStatTa
2710: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ble(pParse, iDb,
2720: 20 69 53 74 61 74 43 75 72 2c 20 70 54 61 62 2d   iStatCur, pTab-
2730: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 61 6e 61 6c 79  >zName);.  analy
2740: 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73  zeOneTable(pPars
2750: 65 2c 20 70 54 61 62 2c 20 69 53 74 61 74 43 75  e, pTab, iStatCu
2760: 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  r, pParse->nMem+
2770: 31 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73  1);.  loadAnalys
2780: 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  is(pParse, iDb);
2790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
27a0: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
27b0: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
27c0: 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c    The parser cal
27d0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ls this routine.
27e0: 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f 67  ** when it recog
27f0: 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45  nizes an ANALYZE
2800: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
2810: 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20         ANALYZE  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
2840: 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45  *        ANALYZE
2850: 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20 20    <database>    
2860: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
2870: 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59  .**        ANALY
2880: 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  ZE  ?<database>.
2890: 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
28a0: 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   3.**.** Form 1 
28b0: 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
28c0: 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
28d0: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
28e0: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20  be analyzed..** 
28f0: 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20  Form 2 analyzes 
2900: 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65 20  all indices the 
2910: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
2920: 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33  named..** Form 3
2930: 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e   analyzes all in
2940: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
2950: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
2960: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
2970: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50 61  qlite3Analyze(Pa
2980: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
2990: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
29a0: 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71  n *pName2){.  sq
29b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29c0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
29d0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  b;.  int i;.  ch
29e0: 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54  ar *z, *zDb;.  T
29f0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 54 6f  able *pTab;.  To
2a00: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b  ken *pTableName;
2a10: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
2a20: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
2a30: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2a40: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
2a50: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
2a60: 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
2a70: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
2a80: 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ULL. */.  assert
2a90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2aa0: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50  ldsAllMutexes(pP
2ab0: 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69  arse->db) );.  i
2ac0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
2ad0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
2ae0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
2af0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73  eturn;.  }..  as
2b00: 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20  sert( pName2!=0 
2b10: 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a  || pName1==0 );.
2b20: 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20    if( pName1==0 
2b30: 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 31  ){.    /* Form 1
2b40: 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76 65 72 79  :  Analyze every
2b50: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 66 6f 72  thing */.    for
2b60: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
2b70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2b80: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
2b90: 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e 61  ;  /* Do not ana
2ba0: 6c 79 7a 65 20 74 68 65 20 54 45 4d 50 20 64 61  lyze the TEMP da
2bb0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
2bc0: 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28  analyzeDatabase(
2bd0: 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20  pParse, i);.    
2be0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  }.  }else if( pN
2bf0: 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  ame2->n==0 ){.  
2c00: 20 20 2f 2a 20 46 6f 72 6d 20 32 3a 20 20 41 6e    /* Form 2:  An
2c10: 61 6c 79 7a 65 20 74 68 65 20 64 61 74 61 62 61  alyze the databa
2c20: 73 65 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  se or table name
2c30: 64 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  d */.    iDb = s
2c40: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
2c50: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
2c60: 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20  ( iDb>=0 ){.    
2c70: 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73    analyzeDatabas
2c80: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
2c90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ca0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
2cb0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
2cc0: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 69 66 28  ame1);.      if(
2cd0: 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54   z ){.        pT
2ce0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
2cf0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
2d00: 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, z, 0);.      
2d10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d20: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  db, z);.        
2d30: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
2d40: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62        analyzeTab
2d50: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
2d60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2d80: 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33  e{.    /* Form 3
2d90: 3a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 66 75  : Analyze the fu
2da0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 74 61  lly qualified ta
2db0: 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ble name */.    
2dc0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
2dd0: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
2de0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
2df0: 20 26 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20   &pTableName);. 
2e00: 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b     if( iDb>=0 ){
2e10: 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 64 62 2d  .      zDb = db-
2e20: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
2e30: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
2e40: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
2e50: 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b  db, pTableName);
2e60: 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  .      if( z ){.
2e70: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 73          pTab = s
2e80: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2e90: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20  e(pParse, 0, z, 
2ea0: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  zDb);.        sq
2eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2ec0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
2ed0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
2ee0: 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70    analyzeTable(p
2ef0: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
2f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f10: 20 20 20 20 7d 20 20 20 0a 20 20 7d 0a 7d 0a 0a      }   .  }.}..
2f20: 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 61  /*.** Used to pa
2f30: 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ss information f
2f40: 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a 65 72  rom the analyzer
2f50: 20 72 65 61 64 65 72 20 74 68 72 6f 75 67 68 20   reader through 
2f60: 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 62 61  to the.** callba
2f70: 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74  ck routine..*/.t
2f80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 6e  ypedef struct an
2f90: 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61 6c 79  alysisInfo analy
2fa0: 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20  sisInfo;.struct 
2fb0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b 0a 20  analysisInfo {. 
2fc0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2fd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
2fe0: 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  abase;.};../*.**
2ff0: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
3000: 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
3010: 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 77 68  or each index wh
3020: 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  en reading the.*
3030: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  * sqlite_stat1 t
3040: 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20  able.  .**.**   
3050: 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65    argv[0] = name
3060: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   of the index.**
3070: 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 72       argv[1] = r
3080: 65 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73  esults of analys
3090: 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20  is - on integer 
30a0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
30b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
30c0: 61 6c 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69  alysisLoader(voi
30d0: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72  d *pData, int ar
30e0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
30f0: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
3100: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
3110: 20 2a 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79   *pInfo = (analy
3120: 73 69 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a  sisInfo*)pData;.
3130: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
3140: 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 75  .  int i, c;.  u
3150: 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 3b 0a 20  nsigned int v;. 
3160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
3170: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
3180: 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =2 );.  UNUSED_P
3190: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
31a0: 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20 69 66 28  d, argc);..  if(
31b0: 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67 76   argv==0 || argv
31c0: 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 31  [0]==0 || argv[1
31d0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ]==0 ){.    retu
31e0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  rn 0;.  }.  pInd
31f0: 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
3200: 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62 2c  Index(pInfo->db,
3210: 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d   argv[0], pInfo-
3220: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  >zDatabase);.  i
3230: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
3240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3250: 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b 31 5d 3b  }.  z = argv[1];
3260: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26  .  for(i=0; *z &
3270: 26 20 69 3c 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  & i<=pIndex->nCo
3280: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
3290: 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  v = 0;.    while
32a0: 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20  ( (c=z[0])>='0' 
32b0: 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20  && c<='9' ){.   
32c0: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 63 20     v = v*10 + c 
32d0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b  - '0';.      z++
32e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
32f0: 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20  ex->aiRowEst[i] 
3300: 3d 20 76 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  = v;.    if( *z=
3310: 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a  =' ' ) z++;.  }.
3320: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3330: 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f  *.** Load the co
3340: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71 6c  ntent of the sql
3350: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
3360: 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20 68  into the index h
3370: 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69  ash tables..*/.i
3380: 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73  nt sqlite3Analys
3390: 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a  isLoad(sqlite3 *
33a0: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
33b0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e  analysisInfo sIn
33c0: 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  fo;.  HashElem *
33d0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  i;.  char *zSql;
33e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
33f0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
3400: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
3410: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
3420: 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a  [iDb].pBt!=0 );.
3430: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3440: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3450: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
3460: 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61  t) );..  /* Clea
3470: 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74  r any prior stat
3480: 69 73 74 69 63 73 20 2a 2f 0a 20 20 66 6f 72 28  istics */.  for(
3490: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
34a0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
34b0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
34c0: 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  );i;i=sqliteHash
34d0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e  Next(i)){.    In
34e0: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
34f0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
3500: 20 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c     sqlite3Defaul
3510: 74 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20  tRowEst(pIdx);. 
3520: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
3530: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
3540: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
3550: 6c 65 20 65 78 69 73 74 73 73 20 2a 2f 0a 20 20  le existss */.  
3560: 73 49 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20  sInfo.db = db;. 
3570: 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
3580: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
3590: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c  zName;.  if( sql
35a0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
35b0: 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
35c0: 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73  , sInfo.zDatabas
35d0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  e)==0 ){.     re
35e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35f0: 52 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c 6f  R;.  }...  /* Lo
3600: 61 64 20 6e 65 77 20 73 74 61 74 69 73 74 69 63  ad new statistic
3610: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 71 6c  s out of the sql
3620: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
3630: 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  */.  zSql = sqli
3640: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
3650: 53 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 74  SELECT idx, stat
3660: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
3670: 73 74 61 74 31 22 2c 0a 20 20 20 20 20 20 20 20  stat1",.        
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29  sInfo.zDatabase)
36a0: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
36b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
36c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
36d0: 65 7b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  e{.    (void)sql
36e0: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
36f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
3700: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
3710: 6c 2c 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65  l, analysisLoade
3720: 72 2c 20 26 73 49 6e 66 6f 2c 20 30 29 3b 0a 20  r, &sInfo, 0);. 
3730: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
3740: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
3750: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3760: 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 69  db, zSql);.    i
3770: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
3780: 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  MEM ) db->malloc
3790: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
37a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37c0: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a  E_OMIT_ANALYZE *
37d0: 2f 0a                                            /.