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

Artifact fc6056826fe67aa0856d4e01591be8f9266ac415:


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 34   analyze.c,v 1.4
01d0: 38 20 32 30 30 39 2f 30 32 2f 31 33 20 31 36 3a  8 2009/02/13 16:
01e0: 35 39 3a 35 33 20 64 72 68 20 45 78 70 20 24 0a  59:53 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 32 28 76 2c  te3VdbeAddOp2(v,
0af0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
0b00: 73 2c 20 30 2c 20 33 29 3b 0a 20 20 73 71 6c 69  s, 0, 3);.  sqli
0b10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
0b20: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
0b30: 53 74 61 74 43 75 72 2c 20 69 52 6f 6f 74 50 61  StatCur, iRootPa
0b40: 67 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  ge, iDb);.  sqli
0b50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
0b60: 76 2c 20 63 72 65 61 74 65 53 74 61 74 31 29 3b  v, createStat1);
0b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
0b80: 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 61 6e  te code to do an
0b90: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 6c 6c   analysis of all
0ba0: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
0bb0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69  ted with.** a si
0bc0: 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  ngle table..*/.s
0bd0: 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
0be0: 7a 65 4f 6e 65 54 61 62 6c 65 28 0a 20 20 50 61  zeOneTable(.  Pa
0bf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
0c00: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
0c10: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
0c20: 62 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b,     /* Table 
0c30: 77 68 6f 73 65 20 69 6e 64 69 63 65 73 20 61 72  whose indices ar
0c40: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
0c50: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 43   */.  int iStatC
0c60: 75 72 2c 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  ur,    /* Index 
0c70: 6f 66 20 56 64 62 65 43 75 72 73 6f 72 20 74 68  of VdbeCursor th
0c80: 61 74 20 77 72 69 74 65 73 20 74 68 65 20 73 71  at writes the sq
0c90: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
0ca0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
0cb0: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
0cc0: 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ble memory locat
0cd0: 69 6f 6e 73 20 62 65 67 69 6e 20 68 65 72 65 20  ions begin here 
0ce0: 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
0cf0: 49 64 78 3b 20 20 20 20 20 2f 2a 20 41 6e 20 69  Idx;     /* An i
0d00: 6e 64 65 78 20 74 6f 20 62 65 69 6e 67 20 61 6e  ndex to being an
0d10: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alyzed */.  int 
0d20: 69 49 64 78 43 75 72 3b 20 20 20 20 20 2f 2a 20  iIdxCur;     /* 
0d30: 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75 72  Index of VdbeCur
0d40: 73 6f 72 20 66 6f 72 20 69 6e 64 65 78 20 62 65  sor for index be
0d50: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
0d60: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
0d70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0d80: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
0d90: 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
0da0: 76 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  v;         /* Th
0db0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
0dc0: 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70  e being built up
0dd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
0de0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
0df0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
0e00: 74 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 2f 2a 20  topOfLoop;   /* 
0e10: 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
0e20: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  oop */.  int end
0e30: 4f 66 4c 6f 6f 70 3b 20 20 20 2f 2a 20 54 68 65  OfLoop;   /* The
0e40: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
0e50: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
0e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 64         /* The ad
0e70: 64 72 65 73 73 20 6f 66 20 61 6e 20 69 6e 73 74  dress of an inst
0e80: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
0e90: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
0ea0: 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
0eb0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54  se containing pT
0ec0: 61 62 20 2a 2f 0a 0a 20 20 76 20 3d 20 73 71 6c  ab */..  v = sql
0ed0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
0ee0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
0ef0: 7c 7c 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 54  || pTab==0 || pT
0f00: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 7b  ab->pIndex==0 ){
0f10: 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 61 6e  .    /* Do no an
0f20: 61 6c 79 73 69 73 20 66 6f 72 20 74 61 62 6c 65  alysis for table
0f30: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 20 69  s that have no i
0f40: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 20 20 72 65  ndices */.    re
0f50: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
0f60: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
0f70: 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
0f80: 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20  pParse->db) );. 
0f90: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
0fa0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
0fb0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
0fc0: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
0fd0: 28 20 69 44 62 3e 3d 30 20 29 3b 0a 23 69 66 6e  ( iDb>=0 );.#ifn
0fe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0ff0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1000: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1010: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1020: 49 54 45 5f 41 4e 41 4c 59 5a 45 2c 20 70 54 61  ITE_ANALYZE, pTa
1030: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  b->zName, 0,.   
1040: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
1050: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
1060: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1070: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1080: 45 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64  Establish a read
1090: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
10a0: 6c 65 20 61 74 20 74 68 65 20 73 68 61 72 65 64  le at the shared
10b0: 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e 20 2a 2f  -cache level. */
10c0: 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
10d0: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
10e0: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
10f0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
1100: 20 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73   iIdxCur = pPars
1110: 65 2d 3e 6e 54 61 62 3b 0a 20 20 66 6f 72 28 70  e->nTab;.  for(p
1120: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1130: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1140: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 4b  x->pNext){.    K
1150: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
1160: 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
1170: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
1180: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 46 69 65  ;.    int regFie
1190: 6c 64 73 3b 20 20 20 20 2f 2a 20 52 65 67 69 73  lds;    /* Regis
11a0: 74 65 72 20 62 6c 6f 63 6b 20 66 6f 72 20 62 75  ter block for bu
11b0: 69 6c 64 69 6e 67 20 72 65 63 6f 72 64 73 20 2a  ilding records *
11c0: 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 63  /.    int regRec
11d0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
11e0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6d 70  ter holding comp
11f0: 6c 65 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a  leted record */.
1200: 20 20 20 20 69 6e 74 20 72 65 67 54 65 6d 70 3b      int regTemp;
1210: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
1220: 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
1230: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6f  */.    int regCo
1240: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  l;       /* Cont
1250: 65 6e 74 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ent of a column 
1260: 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 62  from the table b
1270: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  eing analyzed */
1280: 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69  .    int regRowi
1290: 64 3b 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  d;     /* Rowid 
12a0: 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 65 64  for the inserted
12b0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20 69   record */.    i
12c0: 6e 74 20 72 65 67 46 32 3b 0a 0a 20 20 20 20 2f  nt regF2;..    /
12d0: 2a 20 4f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  * Open a cursor 
12e0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  to the index to 
12f0: 62 65 20 61 6e 61 6c 79 7a 65 64 0a 20 20 20 20  be analyzed.    
1300: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
1310: 44 62 3d 3d 73 71 6c 69 74 65 33 53 63 68 65 6d  Db==sqlite3Schem
1320: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
1330: 3e 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65  >db, pIdx->pSche
1340: 6d 61 29 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ma) );.    nCol 
1350: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
1360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1370: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
1380: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e  NumColumns, 0, n
1390: 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Col+1);.    sqli
13a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13b0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
13c0: 64 78 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75  dxCur, pIdx->tnu
13d0: 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
13e0: 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
13f0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1400: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1410: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
1420: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1430: 72 65 67 46 69 65 6c 64 73 20 3d 20 69 4d 65 6d  regFields = iMem
1440: 2b 6e 43 6f 6c 2a 32 3b 0a 20 20 20 20 72 65 67  +nCol*2;.    reg
1450: 54 65 6d 70 20 3d 20 72 65 67 52 6f 77 69 64 20  Temp = regRowid 
1460: 3d 20 72 65 67 43 6f 6c 20 3d 20 72 65 67 46 69  = regCol = regFi
1470: 65 6c 64 73 2b 33 3b 0a 20 20 20 20 72 65 67 52  elds+3;.    regR
1480: 65 63 20 3d 20 72 65 67 43 6f 6c 2b 31 3b 0a 20  ec = regCol+1;. 
1490: 20 20 20 69 66 28 20 72 65 67 52 65 63 3e 70 50     if( regRec>pP
14a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20  arse->nMem ){.  
14b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
14c0: 20 3d 20 72 65 67 52 65 63 3b 0a 20 20 20 20 7d   = regRec;.    }
14d0: 0a 0a 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  ..    /* Memory 
14e0: 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 61  cells are used a
14f0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
1500: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6d 65 6d 5b  *.    **    mem[
1510: 69 4d 65 6d 5d 3a 20 20 20 20 20 20 20 20 20 20  iMem]:          
1520: 20 20 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d     The total num
1530: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1540: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
1550: 20 20 20 20 6d 65 6d 5b 69 4d 65 6d 2b 31 5d 3a      mem[iMem+1]:
1560: 20 20 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65             Numbe
1570: 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61  r of distinct va
1580: 6c 75 65 73 20 69 6e 20 63 6f 6c 75 6d 6e 20 31  lues in column 1
1590: 0a 20 20 20 20 2a 2a 20 20 20 20 2e 2e 2e 0a 20  .    **    .... 
15a0: 20 20 20 2a 2a 20 20 20 20 6d 65 6d 5b 69 4d 65     **    mem[iMe
15b0: 6d 2b 6e 43 6f 6c 5d 3a 20 20 20 20 20 20 20 20  m+nCol]:        
15c0: 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
15d0: 63 74 20 76 61 6c 75 65 73 20 69 6e 20 63 6f 6c  ct values in col
15e0: 75 6d 6e 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  umn N.    **    
15f0: 6d 65 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 2b 31 5d  mem[iMem+nCol+1]
1600: 20 20 20 20 20 20 20 4c 61 73 74 20 6f 62 73 65         Last obse
1610: 72 76 65 64 20 76 61 6c 75 65 20 6f 66 20 63 6f  rved value of co
1620: 6c 75 6d 6e 20 31 0a 20 20 20 20 2a 2a 20 20 20  lumn 1.    **   
1630: 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 6d   ....    **    m
1640: 65 6d 5b 69 4d 65 6d 2b 6e 43 6f 6c 2b 6e 43 6f  em[iMem+nCol+nCo
1650: 6c 5d 3a 20 20 20 4c 61 73 74 20 6f 62 73 65 72  l]:   Last obser
1660: 76 65 64 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ved value of col
1670: 75 6d 6e 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  umn N.    **.   
1680: 20 2a 2a 20 43 65 6c 6c 73 20 69 4d 65 6d 20 74   ** Cells iMem t
1690: 68 72 6f 75 67 68 20 69 4d 65 6d 2b 6e 43 6f 6c  hrough iMem+nCol
16a0: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
16b0: 20 74 6f 20 30 2e 20 20 54 68 65 20 6f 74 68 65   to 0.  The othe
16c0: 72 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 69 6e  rs.    ** are in
16d0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4e 55 4c  itialized to NUL
16e0: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  L..    */.    fo
16f0: 72 28 69 3d 30 3b 20 69 3c 3d 6e 43 6f 6c 3b 20  r(i=0; i<=nCol; 
1700: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1710: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1720: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1730: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  iMem+i);.    }. 
1740: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1750: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
1760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1770: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1780: 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 29 3b   iMem+nCol+i+1);
1790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
17a0: 6f 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a  o the analysis..
17b0: 20 20 20 20 2a 2f 0a 20 20 20 20 65 6e 64 4f 66      */.    endOf
17c0: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
17d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
1800: 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 65 6e 64  nd, iIdxCur, end
1810: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 74 6f 70  OfLoop);.    top
1820: 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
1830: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1840: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1850: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1860: 41 64 64 49 6d 6d 2c 20 69 4d 65 6d 2c 20 31 29  AddImm, iMem, 1)
1870: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1880: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
1890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
18b0: 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 72  n, iIdxCur, i, r
18c0: 65 67 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71  egCol);.      sq
18d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18e0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 43 6f 6c  v, OP_Ne, regCol
18f0: 2c 20 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69  , 0, iMem+nCol+i
1900: 2b 31 29 3b 0a 20 20 20 20 20 20 2f 2a 2a 2a 2a  +1);.      /****
1910: 20 54 4f 44 4f 3a 20 20 61 64 64 20 63 6f 6c 6c   TODO:  add coll
1920: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a  ating sequence *
1930: 2a 2a 2a 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ****/.      sqli
1940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1950: 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  v, SQLITE_JUMPIF
1960: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NULL);.    }.   
1970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1980: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1990: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20  , endOfLoop);.  
19a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
19b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
19c0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
19d0: 72 65 28 76 2c 20 74 6f 70 4f 66 4c 6f 6f 70 20  re(v, topOfLoop 
19e0: 2b 20 32 2a 28 69 20 2b 20 31 29 29 3b 0a 20 20  + 2*(i + 1));.  
19f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
1a10: 6d 6d 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 31 29  mm, iMem+i+1, 1)
1a20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a40: 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
1a50: 20 69 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b   i, iMem+nCol+i+
1a60: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
1a70: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a80: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f  Label(v, endOfLo
1a90: 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  op);.    sqlite3
1aa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ab0: 5f 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2c 20  _Next, iIdxCur, 
1ac0: 74 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  topOfLoop);.    
1ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae0: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
1af0: 49 64 78 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a  IdxCur);..    /*
1b00: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
1b10: 74 73 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ts.  .    **.   
1b20: 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69   ** The result i
1b30: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
1b40: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  f the sqlite_sta
1b50: 74 31 20 74 61 62 6c 65 2e 20 20 54 68 65 20 66  t1 table.  The f
1b60: 69 72 73 74 0a 20 20 20 20 2a 2a 20 74 77 6f 20  irst.    ** two 
1b70: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 74 68 65 20  columns are the 
1b80: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 74 61 62  names of the tab
1b90: 6c 65 20 61 6e 64 20 69 6e 64 65 78 2e 20 20 54  le and index.  T
1ba0: 68 65 20 74 68 69 72 64 20 63 6f 6c 75 6d 6e 0a  he third column.
1bb0: 20 20 20 20 2a 2a 20 69 73 20 61 20 73 74 72 69      ** is a stri
1bc0: 6e 67 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61  ng composed of a
1bd0: 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72   list of integer
1be0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
1bf0: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64  t the.    ** ind
1c00: 65 78 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ex.  The first i
1c10: 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69  nteger in the li
1c20: 73 74 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  st is the total 
1c30: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 69 72 65  number of entire
1c40: 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  s.    ** in the 
1c50: 69 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69 73  index.  There is
1c60: 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   one additional 
1c70: 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c  integer in the l
1c80: 69 73 74 20 66 6f 72 20 65 61 63 68 0a 20 20 20  ist for each.   
1c90: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68   ** column of th
1ca0: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 61  e table.  This a
1cb0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65  dditional intege
1cc0: 72 20 69 73 20 61 20 67 75 65 73 73 20 6f 66 20  r is a guess of 
1cd0: 68 6f 77 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20  how many.    ** 
1ce0: 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
1cf0: 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
1d00: 20 73 65 6c 65 63 74 2e 20 20 49 66 20 44 20 69   select.  If D i
1d10: 73 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 64  s the count of d
1d20: 69 73 74 69 6e 63 74 0a 20 20 20 20 2a 2a 20 76  istinct.    ** v
1d30: 61 6c 75 65 73 20 61 6e 64 20 4b 20 69 73 20 74  alues and K is t
1d40: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1d50: 6f 66 20 72 6f 77 73 2c 20 74 68 65 6e 20 74 68  of rows, then th
1d60: 65 20 69 6e 74 65 67 65 72 20 69 73 20 63 6f 6d  e integer is com
1d70: 70 75 74 65 64 0a 20 20 20 20 2a 2a 20 61 73 3a  puted.    ** as:
1d80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d90: 20 20 20 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31        I = (K+D-1
1da0: 29 2f 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  )/D.    **.    *
1db0: 2a 20 49 66 20 4b 3d 3d 30 20 74 68 65 6e 20 6e  * If K==0 then n
1dc0: 6f 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  o entry is made 
1dd0: 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65 5f  into the sqlite_
1de0: 73 74 61 74 31 20 74 61 62 6c 65 2e 20 20 0a 20  stat1 table.  . 
1df0: 20 20 20 2a 2a 20 49 66 20 4b 3e 30 20 74 68 65     ** If K>0 the
1e00: 6e 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 74  n it is always t
1e10: 68 65 20 63 61 73 65 20 74 68 65 20 44 3e 30 20  he case the D>0 
1e20: 73 6f 20 64 69 76 69 73 69 6f 6e 20 62 79 20 7a  so division by z
1e30: 65 72 6f 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  ero.    ** is ne
1e40: 76 65 72 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ver possible..  
1e50: 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20    */.    addr = 
1e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e70: 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  1(v, OP_IfNot, i
1e80: 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Mem);.    sqlite
1e90: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1ea0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65  P_String8, 0, re
1eb0: 67 46 69 65 6c 64 73 2c 20 30 2c 20 70 54 61 62  gFields, 0, pTab
1ec0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
1ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ee0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
1ef0: 2c 20 30 2c 20 72 65 67 46 69 65 6c 64 73 2b 31  , 0, regFields+1
1f00: 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  , 0, pIdx->zName
1f10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 67 46 32 20  , 0);.    regF2 
1f20: 3d 20 72 65 67 46 69 65 6c 64 73 2b 32 3b 0a 20  = regFields+2;. 
1f30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f40: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
1f50: 2c 20 69 4d 65 6d 2c 20 72 65 67 46 32 29 3b 0a  , iMem, regF2);.
1f60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1f70: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f90: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
1fa0: 2c 20 30 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c  , 0, regTemp, 0,
1fb0: 20 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   " ", 0);.      
1fc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fd0: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
1fe0: 72 65 67 54 65 6d 70 2c 20 72 65 67 46 32 2c 20  regTemp, regF2, 
1ff0: 72 65 67 46 32 29 3b 0a 20 20 20 20 20 20 73 71  regF2);.      sq
2000: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2010: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4d 65 6d 2c  v, OP_Add, iMem,
2020: 20 69 4d 65 6d 2b 69 2b 31 2c 20 72 65 67 54 65   iMem+i+1, regTe
2030: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
2040: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2050: 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 54 65  OP_AddImm, regTe
2060: 6d 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  mp, -1);.      s
2070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2080: 28 76 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20 69  (v, OP_Divide, i
2090: 4d 65 6d 2b 69 2b 31 2c 20 72 65 67 54 65 6d 70  Mem+i+1, regTemp
20a0: 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20  , regTemp);.    
20b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20c0: 4f 70 31 28 76 2c 20 4f 50 5f 54 6f 49 6e 74 2c  Op1(v, OP_ToInt,
20d0: 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20   regTemp);.     
20e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
2100: 20 72 65 67 54 65 6d 70 2c 20 72 65 67 46 32 2c   regTemp, regF2,
2110: 20 72 65 67 46 32 29 3b 0a 20 20 20 20 7d 0a 20   regF2);.    }. 
2120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2130: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
2140: 65 63 6f 72 64 2c 20 72 65 67 46 69 65 6c 64 73  ecord, regFields
2150: 2c 20 33 2c 20 72 65 67 52 65 63 2c 20 22 61 61  , 3, regRec, "aa
2160: 61 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  a", 0);.    sqli
2170: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2180: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53   OP_NewRowid, iS
2190: 74 61 74 43 75 72 2c 20 72 65 67 52 6f 77 69 64  tatCur, regRowid
21a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
21b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
21c0: 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c  nsert, iStatCur,
21d0: 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69   regRec, regRowi
21e0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
21f0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
2200: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
2210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2220: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
2230: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
2240: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2250: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
2260: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 64 65  most recent inde
2270: 78 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a  x analysis to.**
2280: 20 62 65 20 6c 61 6f 64 65 64 20 69 6e 74 6f 20   be laoded into 
2290: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
22a0: 62 6c 65 73 20 77 68 65 72 65 20 69 73 20 63 61  bles where is ca
22b0: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74  n be used..*/.st
22c0: 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e  atic void loadAn
22d0: 61 6c 79 73 69 73 28 50 61 72 73 65 20 2a 70 50  alysis(Parse *pP
22e0: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
22f0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
2300: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
2310: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
2320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2330: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 6f 61 64 41  dOp1(v, OP_LoadA
2340: 6e 61 6c 79 73 69 73 2c 20 69 44 62 29 3b 0a 20  nalysis, iDb);. 
2350: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
2360: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
2370: 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73  ill do an analys
2380: 69 73 20 6f 66 20 61 6e 20 65 6e 74 69 72 65 20  is of an entire 
2390: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74  database.*/.stat
23a0: 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44  ic void analyzeD
23b0: 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
23c0: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
23d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
23e0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53   pParse->db;.  S
23f0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
2400: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
2410: 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68  chema;    /* Sch
2420: 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65 20  ema of database 
2430: 69 44 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  iDb */.  HashEle
2440: 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61  m *k;.  int iSta
2450: 74 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  tCur;.  int iMem
2460: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  ;..  sqlite3Begi
2470: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
2480: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
2490: 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50  .  iStatCur = pP
24a0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
24b0: 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50  openStatTable(pP
24c0: 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74  arse, iDb, iStat
24d0: 43 75 72 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20  Cur, 0);.  iMem 
24e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
24f0: 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65  ;.  for(k=sqlite
2500: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
2510: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b  ma->tblHash); k;
2520: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
2530: 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(k)){.    Table
2540: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a   *pTab = (Table*
2550: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
2560: 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f  k);.    analyzeO
2570: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
2580: 70 54 61 62 2c 20 69 53 74 61 74 43 75 72 2c 20  pTab, iStatCur, 
2590: 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61  iMem);.  }.  loa
25a0: 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65  dAnalysis(pParse
25b0: 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
25c0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
25d0: 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61  hat will do an a
25e0: 6e 61 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e  nalysis of a sin
25f0: 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  gle table in.** 
2600: 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  a database..*/.s
2610: 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79  tatic void analy
2620: 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  zeTable(Parse *p
2630: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
2640: 61 62 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ab){.  int iDb;.
2650: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a    int iStatCur;.
2660: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
2670: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2680: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2690: 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72  sAllMutexes(pPar
26a0: 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44 62  se->db) );.  iDb
26b0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
26c0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
26d0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
26e0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  a);.  sqlite3Beg
26f0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
2700: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
2710: 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70  ;.  iStatCur = p
2720: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2730: 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70   openStatTable(p
2740: 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61  Parse, iDb, iSta
2750: 74 43 75 72 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tCur, pTab->zNam
2760: 65 29 3b 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65  e);.  analyzeOne
2770: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
2780: 61 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 50  ab, iStatCur, pP
2790: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20  arse->nMem+1);. 
27a0: 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50   loadAnalysis(pP
27b0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f  arse, iDb);.}../
27c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
27d0: 64 65 20 66 6f 72 20 74 68 65 20 41 4e 41 4c 59  de for the ANALY
27e0: 5a 45 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65  ZE command.  The
27f0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
2800: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 68  is routine.** wh
2810: 65 6e 20 69 74 20 72 65 63 6f 67 6e 69 7a 65 73  en it recognizes
2820: 20 61 6e 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d   an ANALYZE comm
2830: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
2840: 20 20 41 4e 41 4c 59 5a 45 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 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
2870: 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3c 64 61      ANALYZE  <da
2880: 74 61 62 61 73 65 3e 20 20 20 20 20 20 20 20 20  tabase>         
2890: 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
28a0: 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3f        ANALYZE  ?
28b0: 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
28c0: 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
28d0: 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
28e0: 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
28f0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
2900: 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 61 6e  tabases to be an
2910: 61 6c 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20  alyzed..** Form 
2920: 32 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69  2 analyzes all i
2930: 6e 64 69 63 65 73 20 74 68 65 20 73 69 6e 67 6c  ndices the singl
2940: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
2950: 2e 0a 2a 2a 20 46 6f 72 6d 20 33 20 61 6e 61 6c  ..** Form 3 anal
2960: 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  yzes all indices
2970: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2980: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
2990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
29a0: 33 41 6e 61 6c 79 7a 65 28 50 61 72 73 65 20 2a  3Analyze(Parse *
29b0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
29c0: 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
29d0: 61 6d 65 32 29 7b 0a 20 20 73 71 6c 69 74 65 33  ame2){.  sqlite3
29e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
29f0: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  b;.  int iDb;.  
2a00: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
2a10: 2c 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20  , *zDb;.  Table 
2a20: 2a 70 54 61 62 3b 0a 20 20 54 6f 6b 65 6e 20 2a  *pTab;.  Token *
2a30: 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 0a 20 20 2f  pTableName;..  /
2a40: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2a50: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2a60: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2a70: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2a80: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2a90: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2aa0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2ab0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
2ac0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
2ad0: 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65 2d  lMutexes(pParse-
2ae0: 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53 51  >db) );.  if( SQ
2af0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
2b00: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
2b10: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
2b20: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
2b30: 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  me1==0 ){.    /*
2b40: 20 46 6f 72 6d 20 31 3a 20 20 41 6e 61 6c 79 7a   Form 1:  Analyz
2b50: 65 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a  e everything */.
2b60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
2b70: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2b80: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
2b90: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 44 6f 20  ontinue;  /* Do 
2ba0: 6e 6f 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20  not analyze the 
2bb0: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
2bc0: 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61  .      analyzeDa
2bd0: 74 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69  tabase(pParse, i
2be0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2bf0: 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c   if( pName2==0 |
2c00: 7c 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29  | pName2->n==0 )
2c10: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a  {.    /* Form 2:
2c20: 20 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61    Analyze the da
2c30: 74 61 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20  tabase or table 
2c40: 6e 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62  named */.    iDb
2c50: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
2c60: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
2c70: 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
2c80: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74        analyzeDat
2c90: 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 44  abase(pParse, iD
2ca0: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  b);.    }else{. 
2cb0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
2cc0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
2cd0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
2ce0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
2cf0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
2d00: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
2d10: 73 65 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20  se, 0, z, 0);.  
2d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2d30: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
2d40: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
2d50: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
2d60: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
2d70: 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Tab);.        }.
2d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d90: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f  }else{.    /* Fo
2da0: 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20 74 68  rm 3: Analyze th
2db0: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2dc0: 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  d table name */.
2dd0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
2de0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
2df0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
2e00: 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61 6d 65  me2, &pTableName
2e10: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d  );.    if( iDb>=
2e20: 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d  0 ){.      zDb =
2e30: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
2e40: 61 6d 65 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73  ame;.      z = s
2e50: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
2e60: 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 4e 61  ken(db, pTableNa
2e70: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
2e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
2e90: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
2ea0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
2eb0: 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20   z, zDb);.      
2ec0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ed0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  db, z);.        
2ee0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
2ef0: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62        analyzeTab
2f00: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
2f10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f20: 20 20 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d    }.    }   .  }
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74  .}../*.** Used t
2f40: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
2f50: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c  on from the anal
2f60: 79 7a 65 72 20 72 65 61 64 65 72 20 74 68 72 6f  yzer reader thro
2f70: 75 67 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61  ugh to the.** ca
2f80: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a  llback routine..
2f90: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2fa0: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61  t analysisInfo a
2fb0: 6e 61 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72  nalysisInfo;.str
2fc0: 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  uct analysisInfo
2fd0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   {.  sqlite3 *db
2fe0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2ff0: 7a 44 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f  zDatabase;.};../
3000: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61  *.** This callba
3010: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ck is invoked on
3020: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  ce for each inde
3030: 78 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74  x when reading t
3040: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61  he.** sqlite_sta
3050: 74 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  t1 table.  .**.*
3060: 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20  *     argv[0] = 
3070: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
3080: 78 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d  x.**     argv[1]
3090: 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6e   = results of an
30a0: 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74 65  alysis - on inte
30b0: 67 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ger for each col
30c0: 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
30d0: 74 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72  t analysisLoader
30e0: 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e  (void *pData, in
30f0: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
3100: 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55  rgv, char **NotU
3110: 73 65 64 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73  sed){.  analysis
3120: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 28 61  Info *pInfo = (a
3130: 6e 61 6c 79 73 69 73 49 6e 66 6f 2a 29 70 44 61  nalysisInfo*)pDa
3140: 74 61 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  ta;.  Index *pIn
3150: 64 65 78 3b 0a 20 20 69 6e 74 20 69 2c 20 63 3b  dex;.  int i, c;
3160: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
3170: 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  v;.  const char 
3180: 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  *z;..  assert( a
3190: 72 67 63 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53  rgc==2 );.  UNUS
31a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
31b0: 74 55 73 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20  tUsed, argc);.. 
31c0: 20 69 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20   if( argv==0 || 
31d0: 61 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72  argv[0]==0 || ar
31e0: 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  gv[1]==0 ){.    
31f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3200: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
3210: 46 69 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d  FindIndex(pInfo-
3220: 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49  >db, argv[0], pI
3230: 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  nfo->zDatabase);
3240: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
3250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3260: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76  ;.  }.  z = argv
3270: 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [1];.  for(i=0; 
3280: 2a 7a 20 26 26 20 69 3c 3d 70 49 6e 64 65 78 2d  *z && i<=pIndex-
3290: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
32a0: 20 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20 77      v = 0;.    w
32b0: 68 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d  hile( (c=z[0])>=
32c0: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b  '0' && c<='9' ){
32d0: 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20  .      v = v*10 
32e0: 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  + c - '0';.     
32f0: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   z++;.    }.    
3300: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
3310: 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66 28  [i] = v;.    if(
3320: 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a   *z==' ' ) z++;.
3330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3340: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  }../*.** Load th
3350: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
3360: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
3370: 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ble into the ind
3380: 65 78 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a  ex hash tables..
3390: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 6e  */.int sqlite3An
33a0: 61 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c 69 74  alysisLoad(sqlit
33b0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
33c0: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
33d0: 20 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c   sInfo;.  HashEl
33e0: 65 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a  em *i;.  char *z
33f0: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Sql;.  int rc;..
3400: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
3410: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
3420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
3430: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
3440: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
3450: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
3460: 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62  utex(db->aDb[iDb
3470: 5d 2e 70 42 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  ].pBt) );..  /* 
3480: 43 6c 65 61 72 20 61 6e 79 20 70 72 69 6f 72 20  Clear any prior 
3490: 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20  statistics */.  
34a0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
34b0: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
34c0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
34d0: 48 61 73 68 29 3b 69 3b 69 3d 73 71 6c 69 74 65  Hash);i;i=sqlite
34e0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
34f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
3500: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
3510: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
3520: 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 64 78  faultRowEst(pIdx
3530: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
3540: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
3550: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
3560: 20 74 61 62 6c 65 20 65 78 69 73 74 73 73 20 2a   table existss *
3570: 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20 64  /.  sInfo.db = d
3580: 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61  b;.  sInfo.zData
3590: 62 61 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69  base = db->aDb[i
35a0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  Db].zName;.  if(
35b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
35c0: 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
35d0: 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74  at1", sInfo.zDat
35e0: 61 62 61 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20  abase)==0 ){.   
35f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3600: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ERROR;.  }...  /
3610: 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61 74 69  * Load new stati
3620: 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74 68 65  stics out of the
3630: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
3640: 62 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20  ble */.  zSql = 
3650: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
3660: 62 2c 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  b, "SELECT idx, 
3670: 73 74 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c  stat FROM %Q.sql
3680: 69 74 65 5f 73 74 61 74 31 22 2c 0a 20 20 20 20  ite_stat1",.    
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62      sInfo.zDatab
36b0: 61 73 65 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  ase);.  if( zSql
36c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
36d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 28 76 6f 69 64  }else{.    (void
36f0: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
3700: 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  f(db);.    rc = 
3710: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
3720: 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c   zSql, analysisL
3730: 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30  oader, &sInfo, 0
3740: 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  );.    (void)sql
3750: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
3760: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
3770: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
3780: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
3790: 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61  E_NOMEM ) db->ma
37a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
37b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37c0: 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}...#endif /* S
37d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
37e0: 5a 45 20 2a 2f 0a                                ZE */.