/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 5aa93f191b365ea308795f62ca6f2e8caa9de3e1:


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 33   analyze.c,v 1.3
01d0: 38 20 32 30 30 38 2f 30 31 2f 31 32 20 31 32 3a  8 2008/01/12 12:
01e0: 34 38 3a 30 38 20 64 72 68 20 45 78 70 20 24 0a  48:08 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 69 6e 74 20 63 72 65 61 74 65 53 74 61 74 31   int createStat1
04c0: 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
04d0: 53 74 61 74 3b 0a 20 20 56 64 62 65 20 2a 76 20  Stat;.  Vdbe *v 
04e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
04f0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28  (pParse);..  if(
0500: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
0510: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0520: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
0530: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 61  texes(db) );.  a
0540: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
0550: 62 65 44 62 28 76 29 3d 3d 64 62 20 29 3b 0a 20  beDb(v)==db );. 
0560: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
0570: 69 44 62 5d 3b 0a 20 20 69 66 28 20 28 70 53 74  iDb];.  if( (pSt
0580: 61 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  at = sqlite3Find
0590: 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
05a0: 65 5f 73 74 61 74 31 22 2c 20 70 44 62 2d 3e 7a  e_stat1", pDb->z
05b0: 4e 61 6d 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Name))==0 ){.   
05c0: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73   /* The sqlite_s
05d0: 74 61 74 31 20 74 61 62 6c 65 73 20 64 6f 65 73  tat1 tables does
05e0: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 43 72 65   not exist.  Cre
05f0: 61 74 65 20 69 74 2e 20 20 0a 20 20 20 20 2a 2a  ate it.  .    **
0600: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 73 69 64   Note that a sid
0610: 65 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20  e-effect of the 
0620: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
0630: 74 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61  tement is to lea
0640: 76 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 6f  ve.    ** the ro
0650: 6f 74 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  otpage of the ne
0660: 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67 69 73  w table in regis
0670: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
0680: 6f 6f 74 2e 20 20 54 68 69 73 20 69 73 0a 20 20  oot.  This is.  
0690: 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 62    ** important b
06a0: 65 63 61 75 73 65 20 74 68 65 20 4f 70 65 6e 57  ecause the OpenW
06b0: 72 69 74 65 20 6f 70 63 6f 64 65 20 62 65 6c 6f  rite opcode belo
06c0: 77 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e  w will be needin
06d0: 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  g it. */.    sql
06e0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
06f0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 43  pParse,.      "C
0700: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
0710: 71 6c 69 74 65 5f 73 74 61 74 31 28 74 62 6c 2c  qlite_stat1(tbl,
0720: 69 64 78 2c 73 74 61 74 29 22 2c 0a 20 20 20 20  idx,stat)",.    
0730: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20    pDb->zName.   
0740: 20 29 3b 0a 20 20 20 20 69 52 6f 6f 74 50 61 67   );.    iRootPag
0750: 65 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  e = pParse->regR
0760: 6f 6f 74 3b 0a 20 20 20 20 63 72 65 61 74 65 53  oot;.    createS
0770: 74 61 74 31 20 3d 20 31 3b 20 20 2f 2a 20 43 61  tat1 = 1;  /* Ca
0780: 75 73 65 20 72 6f 6f 74 70 61 67 65 20 74 6f 20  use rootpage to 
0790: 62 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 6f  be taken from to
07a0: 70 20 6f 66 20 73 74 61 63 6b 20 2a 2f 0a 20 20  p of stack */.  
07b0: 7d 65 6c 73 65 20 69 66 28 20 7a 57 68 65 72 65  }else if( zWhere
07c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
07d0: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
07e0: 65 20 65 78 69 73 74 73 2e 20 20 44 65 6c 65 74  e exists.  Delet
07f0: 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 61 73  e all entries as
0800: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
0810: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 7a    ** the table z
0820: 57 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 73 71  Where. */.    sq
0830: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
0840: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
0850: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
0860: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45  sqlite_stat1 WHE
0870: 52 45 20 74 62 6c 3d 25 51 22 2c 0a 20 20 20 20  RE tbl=%Q",.    
0880: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a     pDb->zName, z
0890: 57 68 65 72 65 0a 20 20 20 20 29 3b 0a 20 20 20  Where.    );.   
08a0: 20 69 52 6f 6f 74 50 61 67 65 20 3d 20 70 53 74   iRootPage = pSt
08b0: 61 74 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 65 6c 73  at->tnum;.  }els
08c0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 71  e{.    /* The sq
08d0: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
08e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
08f0: 20 20 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77    Delete all row
0900: 73 2e 20 2a 2f 0a 20 20 20 20 69 52 6f 6f 74 50  s. */.    iRootP
0910: 61 67 65 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75  age = pStat->tnu
0920: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
0930: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
0940: 6c 65 61 72 2c 20 70 53 74 61 74 2d 3e 74 6e 75  lear, pStat->tnu
0950: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 0a 20 20  m, iDb);.  }..  
0960: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  /* Open the sqli
0970: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66  te_stat1 table f
0980: 6f 72 20 77 72 69 74 69 6e 67 2e 20 55 6e 6c 65  or writing. Unle
0990: 73 73 20 69 74 20 77 61 73 20 63 72 65 61 74 65  ss it was create
09a0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 69 73 20 76  d.  ** by this v
09b0: 64 62 65 20 70 72 6f 67 72 61 6d 2c 20 6c 6f 63  dbe program, loc
09c0: 6b 20 69 74 20 66 6f 72 20 77 72 69 74 69 6e 67  k it for writing
09d0: 20 61 74 20 74 68 65 20 73 68 61 72 65 64 2d 63   at the shared-c
09e0: 61 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20 20 2a  ache level. .  *
09f0: 2a 20 49 66 20 74 68 69 73 20 76 64 62 65 20 64  * If this vdbe d
0a00: 69 64 20 63 72 65 61 74 65 20 74 68 65 20 73 71  id create the sq
0a10: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
0a20: 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 68  , then it must h
0a30: 61 76 65 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64  ave .  ** alread
0a40: 79 20 6f 62 74 61 69 6e 65 64 20 61 20 73 63 68  y obtained a sch
0a50: 65 6d 61 2d 6c 6f 63 6b 2c 20 6d 61 6b 69 6e 67  ema-lock, making
0a60: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
0a70: 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 2a 2f 0a  redundant..  */.
0a80: 20 20 69 66 28 20 21 63 72 65 61 74 65 53 74 61    if( !createSta
0a90: 74 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t1 ){.    sqlite
0aa0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
0ab0: 65 2c 20 69 44 62 2c 20 69 52 6f 6f 74 50 61 67  e, iDb, iRootPag
0ac0: 65 2c 20 31 2c 20 22 73 71 6c 69 74 65 5f 73 74  e, 1, "sqlite_st
0ad0: 61 74 31 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  at1");.  }.  sql
0ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
0af0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
0b00: 69 53 74 61 74 43 75 72 2c 20 69 52 6f 6f 74 50  iStatCur, iRootP
0b10: 61 67 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  age, iDb);.  sql
0b20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
0b30: 28 76 2c 20 63 72 65 61 74 65 53 74 61 74 31 29  (v, createStat1)
0b40: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
0b50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
0b60: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 53 74 61 74  umColumns, iStat
0b70: 43 75 72 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cur, 3);.}../*.*
0b80: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
0b90: 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  to do an analysi
0ba0: 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73  s of all indices
0bb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
0bc0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
0bd0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
0be0: 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62  id analyzeOneTab
0bf0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
0c00: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
0c10: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
0c20: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
0c30: 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20 69 6e  * Table whose in
0c40: 64 69 63 65 73 20 61 72 65 20 74 6f 20 62 65 20  dices are to be 
0c50: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e  analyzed */.  in
0c60: 74 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f  t iStatCur,    /
0c70: 2a 20 43 75 72 73 6f 72 20 74 68 61 74 20 77 72  * Cursor that wr
0c80: 69 74 65 73 20 74 6f 20 74 68 65 20 73 71 6c 69  ites to the sqli
0c90: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a  te_stat1 table *
0ca0: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
0cb0: 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c       /* Availabl
0cc0: 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
0cd0: 6e 73 20 62 65 67 69 6e 20 68 65 72 65 20 2a 2f  ns begin here */
0ce0: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  .){.  Index *pId
0cf0: 78 3b 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64  x;     /* An ind
0d00: 65 78 20 74 6f 20 62 65 69 6e 67 20 61 6e 61 6c  ex to being anal
0d10: 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  yzed */.  int iI
0d20: 64 78 43 75 72 3b 20 20 20 20 20 2f 2a 20 43 75  dxCur;     /* Cu
0d30: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
0d40: 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c  index being anal
0d50: 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  yzed */.  int nC
0d60: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ol;        /* Nu
0d70: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
0d80: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
0d90: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
0da0: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
0db0: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
0dc0: 62 75 69 6c 74 20 75 70 20 2a 2f 0a 20 20 69 6e  built up */.  in
0dd0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t i;           /
0de0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
0df0: 2f 0a 20 20 69 6e 74 20 74 6f 70 4f 66 4c 6f 6f  /.  int topOfLoo
0e00: 70 3b 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20  p;   /* The top 
0e10: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
0e20: 20 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20   int endOfLoop; 
0e30: 20 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20    /* The end of 
0e40: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
0e50: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f  t addr;        /
0e60: 2a 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66  * The address of
0e70: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
0e80: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
0e90: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
0ea0: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
0eb0: 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 0a 20  ining pTab */.. 
0ec0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
0ed0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
0ee0: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  f( v==0 || pTab=
0ef0: 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  =0 || pTab->pInd
0f00: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ex==0 ){.    /* 
0f10: 44 6f 20 6e 6f 20 61 6e 61 6c 79 73 69 73 20 66  Do no analysis f
0f20: 6f 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 68  or tables that h
0f30: 61 76 65 20 6e 6f 20 69 6e 64 69 63 65 73 20 2a  ave no indices *
0f40: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
0f50: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
0f60: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
0f70: 4d 75 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e  Mutexes(pParse->
0f80: 64 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73  db) );.  iDb = s
0f90: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
0fa0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
0fb0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
0fc0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
0fd0: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
0fe0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
0ff0: 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
1000: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1010: 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c  rse, SQLITE_ANAL
1020: 59 5a 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  YZE, pTab->zName
1030: 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73  , 0,.      pPars
1040: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
1050: 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
1060: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
1070: 66 0a 0a 20 20 2f 2a 20 45 73 74 61 62 6c 69 73  f..  /* Establis
1080: 68 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  h a read-lock on
1090: 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 74 68   the table at th
10a0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6c  e shared-cache l
10b0: 65 76 65 6c 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  evel. */.  sqlit
10c0: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
10d0: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
10e0: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
10f0: 61 6d 65 29 3b 0a 0a 20 20 69 49 64 78 43 75 72  ame);..  iIdxCur
1100: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
1110: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
1120: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1130: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1140: 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
1150: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
1160: 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
1170: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 6e  e, pIdx);.    in
1180: 74 20 72 65 67 46 69 65 6c 64 73 3b 20 20 20 20  t regFields;    
1190: 2f 2a 20 52 65 67 69 73 74 65 72 20 62 6c 6f 63  /* Register bloc
11a0: 6b 20 66 6f 72 20 62 75 69 6c 64 69 6e 67 20 72  k for building r
11b0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 69 6e  ecords */.    in
11c0: 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
11d0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
11e0: 69 6e 67 20 63 6f 6d 70 6c 65 74 65 64 20 72 65  ing completed re
11f0: 63 6f 72 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  cord */.    int 
1200: 72 65 67 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a  regTemp;      /*
1210: 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   Temporary use r
1220: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 69  egister */.    i
1230: 6e 74 20 72 65 67 43 6f 6c 3b 20 20 20 20 20 20  nt regCol;      
1240: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 61   /* Content of a
1250: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 74 68 65   column from the
1260: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 61 6e 61   table being ana
1270: 6c 79 7a 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  lyzed */.    int
1280: 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 2f   regRowid;     /
1290: 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20  * Rowid for the 
12a0: 69 6e 73 65 72 74 65 64 20 72 65 63 6f 72 64 20  inserted record 
12b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 46 32  */.    int regF2
12c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  ;..    /* Open a
12d0: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 69   cursor to the i
12e0: 6e 64 65 78 20 74 6f 20 62 65 20 61 6e 61 6c 79  ndex to be analy
12f0: 7a 65 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  zed.    */.    a
1300: 73 73 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69  ssert( iDb==sqli
1310: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1320: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 64  (pParse->db, pId
1330: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
1340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1350: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
1360: 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49  ead, iIdxCur, pI
1370: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  dx->tnum, iDb,. 
1380: 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70         (char *)p
1390: 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
13a0: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 56 64  HANDOFF);.    Vd
13b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
13c0: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
13d0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  );.    nCol = pI
13e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
13f0: 20 72 65 67 46 69 65 6c 64 73 20 3d 20 69 4d 65   regFields = iMe
1400: 6d 2b 6e 43 6f 6c 2a 32 3b 0a 20 20 20 20 72 65  m+nCol*2;.    re
1410: 67 54 65 6d 70 20 3d 20 72 65 67 52 6f 77 69 64  gTemp = regRowid
1420: 20 3d 20 72 65 67 43 6f 6c 20 3d 20 72 65 67 46   = regCol = regF
1430: 69 65 6c 64 73 2b 33 3b 0a 20 20 20 20 72 65 67  ields+3;.    reg
1440: 52 65 63 20 3d 20 72 65 67 43 6f 6c 2b 31 3b 0a  Rec = regCol+1;.
1450: 20 20 20 20 69 66 28 20 72 65 67 52 65 63 3e 70      if( regRec>p
1460: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
1470: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1480: 6d 20 3d 20 72 65 67 52 65 63 3b 0a 20 20 20 20  m = regRec;.    
1490: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
14a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
14b0: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64  tNumColumns, iId
14c0: 78 43 75 72 2c 20 6e 43 6f 6c 2b 31 29 3b 0a 0a  xCur, nCol+1);..
14d0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
14e0: 6c 6c 73 20 61 72 65 20 75 73 65 64 20 61 73 20  lls are used as 
14f0: 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a  follows:.    **.
1500: 20 20 20 20 2a 2a 20 20 20 20 6d 65 6d 5b 69 4d      **    mem[iM
1510: 65 6d 5d 3a 20 20 20 20 20 20 20 20 20 20 20 20  em]:            
1520: 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
1530: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1540: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20   table..    **  
1550: 20 20 6d 65 6d 5b 69 4d 65 6d 2b 31 5d 3a 20 20    mem[iMem+1]:  
1560: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
1570: 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  of distinct valu
1580: 65 73 20 69 6e 20 63 6f 6c 75 6d 6e 20 31 0a 20  es in column 1. 
1590: 20 20 20 2a 2a 20 20 20 20 2e 2e 2e 0a 20 20 20     **    ....   
15a0: 20 2a 2a 20 20 20 20 6d 65 6d 5b 69 4d 65 6d 2b   **    mem[iMem+
15b0: 6e 43 6f 6c 5d 3a 20 20 20 20 20 20 20 20 4e 75  nCol]:        Nu
15c0: 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74  mber of distinct
15d0: 20 76 61 6c 75 65 73 20 69 6e 20 63 6f 6c 75 6d   values in colum
15e0: 6e 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 6d 65  n N.    **    me
15f0: 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 2b 31 5d 20 20  m[iMem+nCol+1]  
1600: 20 20 20 20 20 4c 61 73 74 20 6f 62 73 65 72 76       Last observ
1610: 65 64 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  ed value of colu
1620: 6d 6e 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 2e  mn 1.    **    .
1630: 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 6d 65 6d  ...    **    mem
1640: 5b 69 4d 65 6d 2b 6e 43 6f 6c 2b 6e 43 6f 6c 5d  [iMem+nCol+nCol]
1650: 3a 20 20 20 4c 61 73 74 20 6f 62 73 65 72 76 65  :   Last observe
1660: 64 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  d value of colum
1670: 6e 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n N.    **.    *
1680: 2a 20 43 65 6c 6c 73 20 69 4d 65 6d 20 74 68 72  * Cells iMem thr
1690: 6f 75 67 68 20 69 4d 65 6d 2b 6e 43 6f 6c 20 61  ough iMem+nCol a
16a0: 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
16b0: 6f 20 30 2e 20 20 54 68 65 20 6f 74 68 65 72 73  o 0.  The others
16c0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 69 6e 69 74  .    ** are init
16d0: 69 61 6c 69 7a 65 64 20 74 6f 20 4e 55 4c 4c 2e  ialized to NULL.
16e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
16f0: 69 3d 30 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b  i=0; i<=nCol; i+
1700: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1710: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1720: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4d  P_Integer, 0, iM
1730: 65 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  em+i);.    }.   
1740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1770: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
1780: 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 29 3b 0a 20  Mem+nCol+i+1);. 
1790: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
17a0: 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20  the analysis..  
17b0: 20 20 2a 2f 0a 20 20 20 20 65 6e 64 4f 66 4c 6f    */.    endOfLo
17c0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
17d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
1800: 2c 20 69 49 64 78 43 75 72 2c 20 65 6e 64 4f 66  , iIdxCur, endOf
1810: 4c 6f 6f 70 29 3b 0a 20 20 20 20 74 6f 70 4f 66  Loop);.    topOf
1820: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
1830: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1850: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
1860: 64 49 6d 6d 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a  dImm, iMem, 1);.
1870: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1880: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
18b0: 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72 65 67   iIdxCur, i, reg
18c0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
18d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18e0: 20 4f 50 5f 4e 65 2c 20 72 65 67 43 6f 6c 2c 20   OP_Ne, regCol, 
18f0: 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31  0, iMem+nCol+i+1
1900: 29 3b 0a 20 20 20 20 20 20 2f 2a 2a 2a 2a 20 54  );.      /**** T
1910: 4f 44 4f 3a 20 20 61 64 64 20 63 6f 6c 6c 61 74  ODO:  add collat
1920: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2a 2a  ing sequence ***
1930: 2a 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65  **/.      sqlite
1940: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1950: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
1960: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  LL);.    }.    s
1970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1980: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1990: 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  endOfLoop);.    
19a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
19b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
19c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
19d0: 28 76 2c 20 74 6f 70 4f 66 4c 6f 6f 70 20 2b 20  (v, topOfLoop + 
19e0: 32 2a 28 69 20 2b 20 31 29 29 3b 0a 20 20 20 20  2*(i + 1));.    
19f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a00: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
1a10: 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 31 29 3b 0a  , iMem+i+1, 1);.
1a20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
1a40: 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69  lumn, iIdxCur, i
1a50: 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 29  , iMem+nCol+i+1)
1a60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1a70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a80: 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70  bel(v, endOfLoop
1a90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1aa0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1ab0: 65 78 74 2c 20 69 49 64 78 43 75 72 2c 20 74 6f  ext, iIdxCur, to
1ac0: 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71  pOfLoop);.    sq
1ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1ae0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
1af0: 78 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  xCur);..    /* S
1b00: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1b10: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
1b20: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20  * The result is 
1b30: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
1b40: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
1b50: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 66 69 72   table.  The fir
1b60: 73 74 0a 20 20 20 20 2a 2a 20 74 77 6f 20 63 6f  st.    ** two co
1b70: 6c 75 6d 6e 73 20 61 72 65 20 74 68 65 20 6e 61  lumns are the na
1b80: 6d 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mes of the table
1b90: 20 61 6e 64 20 69 6e 64 65 78 2e 20 20 54 68 65   and index.  The
1ba0: 20 74 68 69 72 64 20 63 6f 6c 75 6d 6e 0a 20 20   third column.  
1bb0: 20 20 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67    ** is a string
1bc0: 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c   composed of a l
1bd0: 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72 20 73  ist of integer s
1be0: 74 61 74 69 73 74 69 63 73 20 61 62 6f 75 74 20  tatistics about 
1bf0: 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  the.    ** index
1c00: 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  .  The first int
1c10: 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  eger in the list
1c20: 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1c30: 6d 62 65 72 20 6f 66 20 65 6e 74 69 72 65 73 0a  mber of entires.
1c40: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
1c50: 64 65 78 2e 20 20 54 68 65 72 65 20 69 73 20 6f  dex.  There is o
1c60: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ne additional in
1c70: 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73  teger in the lis
1c80: 74 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a  t for each.    *
1c90: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  * column of the 
1ca0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 61 64 64  table.  This add
1cb0: 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20  itional integer 
1cc0: 69 73 20 61 20 67 75 65 73 73 20 6f 66 20 68 6f  is a guess of ho
1cd0: 77 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  w many.    ** ro
1ce0: 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ws of the table 
1cf0: 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 73  the index will s
1d00: 65 6c 65 63 74 2e 20 20 49 66 20 44 20 69 73 20  elect.  If D is 
1d10: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 64 69 73  the count of dis
1d20: 74 69 6e 63 74 0a 20 20 20 20 2a 2a 20 76 61 6c  tinct.    ** val
1d30: 75 65 73 20 61 6e 64 20 4b 20 69 73 20 74 68 65  ues and K is the
1d40: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1d50: 20 72 6f 77 73 2c 20 74 68 65 6e 20 74 68 65 20   rows, then the 
1d60: 69 6e 74 65 67 65 72 20 69 73 20 63 6f 6d 70 75  integer is compu
1d70: 74 65 64 0a 20 20 20 20 2a 2a 20 61 73 3a 0a 20  ted.    ** as:. 
1d80: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d90: 20 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f      I = (K+D-1)/
1da0: 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
1db0: 49 66 20 4b 3d 3d 30 20 74 68 65 6e 20 6e 6f 20  If K==0 then no 
1dc0: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
1dd0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  to the sqlite_st
1de0: 61 74 31 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  at1 table.  .   
1df0: 20 2a 2a 20 49 66 20 4b 3e 30 20 74 68 65 6e 20   ** If K>0 then 
1e00: 69 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  it is always the
1e10: 20 63 61 73 65 20 74 68 65 20 44 3e 30 20 73 6f   case the D>0 so
1e20: 20 64 69 76 69 73 69 6f 6e 20 62 79 20 7a 65 72   division by zer
1e30: 6f 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 76 65  o.    ** is neve
1e40: 72 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 20 20  r possible..    
1e50: 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  */.    addr = sq
1e60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1e70: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4d 65  v, OP_IfNot, iMe
1e80: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
1e90: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1ea0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 46  String8, 0, regF
1eb0: 69 65 6c 64 73 2c 20 30 2c 20 70 54 61 62 2d 3e  ields, 0, pTab->
1ec0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ee0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
1ef0: 30 2c 20 72 65 67 46 69 65 6c 64 73 2b 31 2c 20  0, regFields+1, 
1f00: 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  0, pIdx->zName, 
1f10: 30 29 3b 0a 20 20 20 20 72 65 67 46 32 20 3d 20  0);.    regF2 = 
1f20: 72 65 67 46 69 65 6c 64 73 2b 32 3b 0a 20 20 20  regFields+2;.   
1f30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f40: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
1f50: 69 4d 65 6d 2c 20 72 65 67 46 32 29 3b 0a 20 20  iMem, regF2);.  
1f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1f70: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
1f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f90: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
1fa0: 30 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c 20 22  0, regTemp, 0, "
1fb0: 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   ", 0);.      sq
1fc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1fd0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 72 65  v, OP_Concat, re
1fe0: 67 54 65 6d 70 2c 20 72 65 67 46 32 2c 20 72 65  gTemp, regF2, re
1ff0: 67 46 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  gF2);.      sqli
2000: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2010: 20 4f 50 5f 41 64 64 2c 20 69 4d 65 6d 2c 20 69   OP_Add, iMem, i
2020: 4d 65 6d 2b 69 2b 31 2c 20 72 65 67 54 65 6d 70  Mem+i+1, regTemp
2030: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2040: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2050: 5f 41 64 64 49 6d 6d 2c 20 72 65 67 54 65 6d 70  _AddImm, regTemp
2060: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , -1);.      sql
2070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2080: 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20 69 4d 65  , OP_Divide, iMe
2090: 6d 2b 69 2b 31 2c 20 72 65 67 54 65 6d 70 2c 20  m+i+1, regTemp, 
20a0: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
20b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20c0: 31 28 76 2c 20 4f 50 5f 54 6f 49 6e 74 2c 20 72  1(v, OP_ToInt, r
20d0: 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  egTemp);.      s
20e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20f0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 72  (v, OP_Concat, r
2100: 65 67 54 65 6d 70 2c 20 72 65 67 46 32 2c 20 72  egTemp, regF2, r
2110: 65 67 46 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  egF2);.    }.   
2120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2130: 70 34 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65  p4(v, OP_RegMake
2140: 52 65 63 2c 20 72 65 67 46 69 65 6c 64 73 2c 20  Rec, regFields, 
2150: 33 2c 20 72 65 67 52 65 63 2c 20 22 61 61 61 22  3, regRec, "aaa"
2160: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2170: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2180: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
2190: 74 43 75 72 2c 20 72 65 67 52 6f 77 69 64 29 3b  tCur, regRowid);
21a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
21c0: 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72  ert, iStatCur, r
21d0: 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29  egRec, regRowid)
21e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
21f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2200: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
2210: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2220: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
2230: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
2240: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
2250: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 6f  ill cause the mo
2260: 73 74 20 72 65 63 65 6e 74 20 69 6e 64 65 78 20  st recent index 
2270: 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62  analysis to.** b
2280: 65 20 6c 61 6f 64 65 64 20 69 6e 74 6f 20 69 6e  e laoded into in
2290: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
22a0: 65 73 20 77 68 65 72 65 20 69 73 20 63 61 6e 20  es where is can 
22b0: 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  be used..*/.stat
22c0: 69 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c  ic void loadAnal
22d0: 79 73 69 73 28 50 61 72 73 65 20 2a 70 50 61 72  ysis(Parse *pPar
22e0: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
22f0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
2300: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2310: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
2320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2330: 70 31 28 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61  p1(v, OP_LoadAna
2340: 6c 79 73 69 73 2c 20 69 44 62 29 3b 0a 20 20 7d  lysis, iDb);.  }
2350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
2360: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
2370: 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73  l do an analysis
2380: 20 6f 66 20 61 6e 20 65 6e 74 69 72 65 20 64 61   of an entire da
2390: 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63  tabase.*/.static
23a0: 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44 61 74   void analyzeDat
23b0: 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
23c0: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
23d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53 63 68  Parse->db;.  Sch
23f0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
2400: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
2410: 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d  ema;    /* Schem
2420: 61 20 6f 66 20 64 61 74 61 62 61 73 65 20 69 44  a of database iD
2430: 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  b */.  HashElem 
2440: 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43  *k;.  int iStatC
2450: 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  ur;.  int iMem;.
2460: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
2470: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
2480: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
2490: 20 69 53 74 61 74 43 75 72 20 3d 20 70 50 61 72   iStatCur = pPar
24a0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 6f 70  se->nTab++;.  op
24b0: 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72  enStatTable(pPar
24c0: 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75  se, iDb, iStatCu
24d0: 72 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20  r, 0);.  iMem = 
24e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
24f0: 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
2500: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
2510: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b  ->tblHash); k; k
2520: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
2530: 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  k)){.    Table *
2540: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
2550: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
2560: 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f 6e 65  ;.    analyzeOne
2570: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2580: 61 62 2c 20 69 53 74 61 74 43 75 72 2c 20 69 4d  ab, iStatCur, iM
2590: 65 6d 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41  em);.  }.  loadA
25a0: 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20  nalysis(pParse, 
25b0: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iDb);.}../*.** G
25c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
25d0: 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61  t will do an ana
25e0: 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c  lysis of a singl
25f0: 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20  e table in.** a 
2600: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
2610: 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
2620: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
2630: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
2640: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  ){.  int iDb;.  
2650: 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 0a 20  int iStatCur;.. 
2660: 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2670: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2680: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2690: 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65  llMutexes(pParse
26a0: 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44 62 20 3d  ->db) );.  iDb =
26b0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
26c0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
26d0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
26e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
26f0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
2700: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
2710: 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50 61    iStatCur = pPa
2720: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 6f  rse->nTab++;.  o
2730: 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61  penStatTable(pPa
2740: 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43  rse, iDb, iStatC
2750: 75 72 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ur, pTab->zName)
2760: 3b 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61  ;.  analyzeOneTa
2770: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
2780: 2c 20 69 53 74 61 74 43 75 72 2c 20 70 50 61 72  , iStatCur, pPar
2790: 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 6c  se->nMem+1);.  l
27a0: 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72  oadAnalysis(pPar
27b0: 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  se, iDb);.}../*.
27c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
27d0: 20 66 6f 72 20 74 68 65 20 41 4e 41 4c 59 5a 45   for the ANALYZE
27e0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 70   command.  The p
27f0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
2800: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 68 65 6e   routine.** when
2810: 20 69 74 20 72 65 63 6f 67 6e 69 7a 65 73 20 61   it recognizes a
2820: 6e 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  n ANALYZE comman
2830: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
2840: 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20  ANALYZE         
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
2870: 20 20 41 4e 41 4c 59 5a 45 20 20 3c 64 61 74 61    ANALYZE  <data
2880: 62 61 73 65 3e 20 20 20 20 20 20 20 20 20 20 20  base>           
2890: 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
28a0: 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3f 3c 64      ANALYZE  ?<d
28b0: 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
28c0: 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 0a 2a  name>  -- 3.**.*
28d0: 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
28e0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
28f0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
2900: 62 61 73 65 73 20 74 6f 20 62 65 20 61 6e 61 6c  bases to be anal
2910: 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  yzed..** Form 2 
2920: 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64  analyzes all ind
2930: 69 63 65 73 20 74 68 65 20 73 69 6e 67 6c 65 20  ices the single 
2940: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 2e 0a  database named..
2950: 2a 2a 20 46 6f 72 6d 20 33 20 61 6e 61 6c 79 7a  ** Form 3 analyz
2960: 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  es all indices a
2970: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2980: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
2990: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
29a0: 6e 61 6c 79 7a 65 28 50 61 72 73 65 20 2a 70 50  nalyze(Parse *pP
29b0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
29c0: 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
29d0: 65 32 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  e2){.  sqlite3 *
29e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
29f0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
2a00: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  t i;.  char *z, 
2a10: 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  *zDb;.  Table *p
2a20: 54 61 62 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  Tab;.  Token *pT
2a30: 61 62 6c 65 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  ableName;..  /* 
2a40: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
2a50: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
2a60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
2a70: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
2a80: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
2a90: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
2aa0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
2ab0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ac0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
2ad0: 75 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64  utexes(pParse->d
2ae0: 62 29 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  b) );.  if( SQLI
2af0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2b00: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2b10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
2b20: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
2b30: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  1==0 ){.    /* F
2b40: 6f 72 6d 20 31 3a 20 20 41 6e 61 6c 79 7a 65 20  orm 1:  Analyze 
2b50: 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20  everything */.  
2b60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
2b70: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2b80: 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e    if( i==1 ) con
2b90: 74 69 6e 75 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f  tinue;  /* Do no
2ba0: 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 54 45  t analyze the TE
2bb0: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
2bc0: 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61       analyzeData
2bd0: 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 29 3b  base(pParse, i);
2be0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2bf0: 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
2c00: 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b 0a  pName2->n==0 ){.
2c10: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a 20 20      /* Form 2:  
2c20: 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61 74 61  Analyze the data
2c30: 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20 6e 61  base or table na
2c40: 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  med */.    iDb =
2c50: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
2c60: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
2c70: 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
2c80: 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62      analyzeDatab
2c90: 61 73 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ase(pParse, iDb)
2ca0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cb0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61     z = sqlite3Na
2cc0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
2cd0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 69  pName1);.      i
2ce0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
2cf0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
2d00: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
2d10: 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , z, 0);.       
2d20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
2d30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
2d40: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
2d50: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61  analyzeTable(pPa
2d60: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
2d70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d80: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2d90: 20 2f 2a 20 46 6f 72 6d 20 33 3a 20 41 6e 61 6c   /* Form 3: Anal
2da0: 79 7a 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75  yze the fully qu
2db0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
2dc0: 6d 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  me */.    iDb = 
2dd0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
2de0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
2df0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 54 61 62  1, pName2, &pTab
2e00: 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  leName);.    if(
2e10: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20   iDb>=0 ){.     
2e20: 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
2e30: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
2e40: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
2e50: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
2e60: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ableName);.     
2e70: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
2e80: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
2e90: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
2ea0: 73 65 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 20  se, z, zDb);.   
2eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ec0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e(z);.        if
2ed0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
2ee0: 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65      analyzeTable
2ef0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
2f00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f10: 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 0a 7d  }.    }   .  }.}
2f20: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20  ../*.** Used to 
2f30: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
2f40: 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a   from the analyz
2f50: 65 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67  er reader throug
2f60: 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  h to the.** call
2f70: 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  back routine..*/
2f80: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2f90: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61  analysisInfo ana
2fa0: 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63  lysisInfo;.struc
2fb0: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b  t analysisInfo {
2fc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2fd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2fe0: 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  atabase;.};../*.
2ff0: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
3000: 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
3010: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
3020: 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65  when reading the
3030: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31  .** sqlite_stat1
3040: 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20   table.  .**.** 
3050: 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61      argv[0] = na
3060: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  me of the index.
3070: 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d  **     argv[1] =
3080: 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c   results of anal
3090: 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65  ysis - on intege
30a0: 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  r for each colum
30b0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
30c0: 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 28 76  analysisLoader(v
30d0: 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
30e0: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
30f0: 76 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55  v, char **azNotU
3100: 73 65 64 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73  sed){.  analysis
3110: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 28 61  Info *pInfo = (a
3120: 6e 61 6c 79 73 69 73 49 6e 66 6f 2a 29 70 44 61  nalysisInfo*)pDa
3130: 74 61 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  ta;.  Index *pIn
3140: 64 65 78 3b 0a 20 20 69 6e 74 20 69 2c 20 63 3b  dex;.  int i, c;
3150: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
3160: 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  v;.  const char 
3170: 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  *z;..  assert( a
3180: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20  rgc==2 );.  if( 
3190: 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67 76 5b  argv==0 || argv[
31a0: 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 31 5d  0]==0 || argv[1]
31b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
31c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  n 0;.  }.  pInde
31d0: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
31e0: 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62 2c 20  ndex(pInfo->db, 
31f0: 61 72 67 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e  argv[0], pInfo->
3200: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
3210: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
3220: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3230: 0a 20 20 7a 20 3d 20 61 72 67 76 5b 31 5d 3b 0a  .  z = argv[1];.
3240: 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26    for(i=0; *z &&
3250: 20 69 3c 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   i<=pIndex->nCol
3260: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76  umn; i++){.    v
3270: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
3280: 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20 26   (c=z[0])>='0' &
3290: 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20  & c<='9' ){.    
32a0: 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 63 20 2d    v = v*10 + c -
32b0: 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b   '0';.      z++;
32c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
32d0: 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 3d  x->aiRowEst[i] =
32e0: 20 76 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d   v;.    if( *z==
32f0: 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ' ' ) z++;.  }. 
3300: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3310: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e  .** Load the con
3320: 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71 6c 69  tent of the sqli
3330: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69  te_stat1 table i
3340: 6e 74 6f 20 74 68 65 20 69 6e 64 65 78 20 68 61  nto the index ha
3350: 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 69 6e  sh tables..*/.in
3360: 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69  t sqlite3Analysi
3370: 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a 64  sLoad(sqlite3 *d
3380: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 61  b, int iDb){.  a
3390: 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e 66  nalysisInfo sInf
33a0: 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  o;.  HashElem *i
33b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
33c0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
33d0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
33e0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
33f0: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
3400: 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20  iDb].pBt!=0 );. 
3410: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3420: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
3430: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
3440: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  ) );..  /* Clear
3450: 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74 69   any prior stati
3460: 73 74 69 63 73 20 2a 2f 0a 20 20 66 6f 72 28 69  stics */.  for(i
3470: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
3480: 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  (&db->aDb[iDb].p
3490: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29  Schema->idxHash)
34a0: 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  ;i;i=sqliteHashN
34b0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e 64  ext(i)){.    Ind
34c0: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
34d0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
34e0: 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
34f0: 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20 20  RowEst(pIdx);.  
3500: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
3510: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
3520: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
3530: 65 20 65 78 69 73 74 73 73 20 2a 2f 0a 20 20 73  e existss */.  s
3540: 49 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  Info.db = db;.  
3550: 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 20  sInfo.zDatabase 
3560: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
3570: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69  Name;.  if( sqli
3580: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
3590: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
35a0: 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
35b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )==0 ){.     ret
35c0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
35d0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c 6f 61  ;.  }...  /* Loa
35e0: 64 20 6e 65 77 20 73 74 61 74 69 73 74 69 63 73  d new statistics
35f0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 71 6c 69   out of the sqli
3600: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a  te_stat1 table *
3610: 2f 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  /.  zSql = sqlit
3620: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 53  e3MPrintf(db, "S
3630: 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 74 20  ELECT idx, stat 
3640: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
3650: 74 61 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20  tat1",.         
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3670: 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b  Info.zDatabase);
3680: 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  .  sqlite3Safety
3690: 4f 66 66 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  Off(db);.  rc = 
36a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
36b0: 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c   zSql, analysisL
36c0: 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30  oader, &sInfo, 0
36d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65  );.  sqlite3Safe
36e0: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69  tyOn(db);.  sqli
36f0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
3700: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3710: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3720: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a  E_OMIT_ANALYZE *
3730: 2f 0a                                            /.