/ Hex Artifact Content
Login

Artifact 3457a2af126eb78f20ad239c225a2c8ed61b78b6:


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 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
01c0: 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a  TE_OMIT_ANALYZE.
01d0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
01e0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  Int.h"../*.** Th
01f0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
0200: 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6f  ates code that o
0210: 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65 5f  pens the sqlite_
0220: 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72 0a  stat1 table for.
0230: 2a 2a 20 77 72 69 74 69 6e 67 20 77 69 74 68 20  ** writing with 
0240: 63 75 72 73 6f 72 20 69 53 74 61 74 43 75 72 2e  cursor iStatCur.
0250: 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   If the library 
0260: 77 61 73 20 62 75 69 6c 74 20 77 69 74 68 20 74  was built with t
0270: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41  he.** SQLITE_ENA
0280: 42 4c 45 5f 53 54 41 54 32 20 6d 61 63 72 6f 20  BLE_STAT2 macro 
0290: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
02a0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74  e sqlite_stat2 t
02b0: 61 62 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65  able is.** opene
02c0: 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 75 73  d for writing us
02d0: 69 6e 67 20 63 75 72 73 6f 72 20 28 69 53 74 61  ing cursor (iSta
02e0: 74 43 75 72 2b 31 29 0a 2a 2a 0a 2a 2a 20 49 66  tCur+1).**.** If
02f0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0300: 31 20 74 61 62 6c 65 73 20 64 6f 65 73 20 6e 6f  1 tables does no
0310: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69  t previously exi
0320: 73 74 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  st, it is create
0330: 64 2e 0a 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c  d..** Similarly,
0340: 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   if the sqlite_s
0350: 74 61 74 32 20 74 61 62 6c 65 20 64 6f 65 73 20  tat2 table does 
0360: 6e 6f 74 20 65 78 69 73 74 20 61 6e 64 20 74 68  not exist and th
0370: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 73 20  e library.** is 
0380: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
0390: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
03a0: 32 20 64 65 66 69 6e 65 64 2c 20 69 74 20 69 73  2 defined, it is
03b0: 20 63 72 65 61 74 65 64 2e 20 0a 2a 2a 0a 2a 2a   created. .**.**
03c0: 20 41 72 67 75 6d 65 6e 74 20 7a 57 68 65 72 65   Argument zWhere
03d0: 20 6d 61 79 20 62 65 20 61 20 70 6f 69 6e 74 65   may be a pointe
03e0: 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
03f0: 6e 74 61 69 6e 69 6e 67 20 61 20 74 61 62 6c 65  ntaining a table
0400: 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20 69 74 20   name,.** or it 
0410: 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c 20 70 6f  may be a NULL po
0420: 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20  inter. If it is 
0430: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61  not NULL, then a
0440: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  ll entries in.**
0450: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0460: 31 20 61 6e 64 20 28 69 66 20 61 70 70 6c 69 63  1 and (if applic
0470: 61 62 6c 65 29 20 73 71 6c 69 74 65 5f 73 74 61  able) sqlite_sta
0480: 74 32 20 74 61 62 6c 65 73 20 61 73 73 6f 63 69  t2 tables associ
0490: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
04a0: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65   named table are
04b0: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 7a 57 68   deleted. If zWh
04c0: 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63 6f 64  ere==0, then cod
04d0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 0a 2a  e is generated.*
04e0: 2a 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  * to delete all 
04f0: 73 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69  stat table entri
0500: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
0510: 69 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65  id openStatTable
0520: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0530: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
0540: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0550: 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
0560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0570: 68 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61  he database we a
0580: 72 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f  re looking in */
0590: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c  .  int iStatCur,
05a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
05b0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  en the sqlite_st
05c0: 61 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69  at1 table on thi
05d0: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
05e0: 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65  nst char *zWhere
05f0: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
0600: 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
0610: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
0620: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69  le */.){.  stati
0630: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
0640: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0650: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  *zName;.    cons
0660: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b 0a 20  t char *zCols;. 
0670: 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a   } aTable[] = {.
0680: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
0690: 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78 2c 73  at1", "tbl,idx,s
06a0: 74 61 74 22 20 7d 2c 0a 23 69 66 64 65 66 20 53  tat" },.#ifdef S
06b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
06c0: 54 32 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  T2.    { "sqlite
06d0: 5f 73 74 61 74 32 22 2c 20 22 74 62 6c 2c 69 64  _stat2", "tbl,id
06e0: 78 2c 73 61 6d 70 6c 65 6e 6f 2c 73 61 6d 70 6c  x,sampleno,sampl
06f0: 65 22 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  e" },.#endif.  }
0700: 3b 0a 0a 20 20 69 6e 74 20 61 52 6f 6f 74 5b 5d  ;..  int aRoot[]
0710: 20 3d 20 7b 30 2c 20 30 7d 3b 0a 20 20 75 38 20   = {0, 0};.  u8 
0720: 61 43 72 65 61 74 65 54 62 6c 5b 5d 20 3d 20 7b  aCreateTbl[] = {
0730: 30 2c 20 30 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b  0, 0};..  int i;
0740: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0750: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
0760: 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65 20 2a  b *pDb;.  Vdbe *
0770: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
0780: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
0790: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
07a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
07b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
07c0: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
07d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
07e0: 64 62 65 44 62 28 76 29 3d 3d 64 62 20 29 3b 0a  dbeDb(v)==db );.
07f0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
0800: 5b 69 44 62 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d  [iDb];..  for(i=
0810: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
0820: 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  Table); i++){.  
0830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
0840: 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  ab = aTable[i].z
0850: 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  Name;.    Table 
0860: 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20  *pStat;.    if( 
0870: 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33  (pStat = sqlite3
0880: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
0890: 61 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29  ab, pDb->zName))
08a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
08b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 5b  The sqlite_stat[
08c0: 31 32 5d 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  12] table does n
08d0: 6f 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65  ot exist. Create
08e0: 20 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61   it. Note that a
08f0: 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 64 65 2d   .      ** side-
0900: 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43 52  effect of the CR
0910: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
0920: 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76 65  ment is to leave
0930: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a 20   the rootpage . 
0940: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e       ** of the n
0950: 65 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67 69  ew table in regi
0960: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
0970: 52 6f 6f 74 2e 20 54 68 69 73 20 69 73 20 69 6d  Root. This is im
0980: 70 6f 72 74 61 6e 74 20 0a 20 20 20 20 20 20 2a  portant .      *
0990: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 4f 70  * because the Op
09a0: 65 6e 57 72 69 74 65 20 6f 70 63 6f 64 65 20 62  enWrite opcode b
09b0: 65 6c 6f 77 20 77 69 6c 6c 20 62 65 20 6e 65 65  elow will be nee
09c0: 64 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20  ding it. */.    
09d0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
09e0: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
09f0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
0a00: 41 42 4c 45 20 25 51 2e 25 73 28 25 73 29 22 2c  ABLE %Q.%s(%s)",
0a10: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61   pDb->zName, zTa
0a20: 62 2c 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f  b, aTable[i].zCo
0a30: 6c 73 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ls.      );.    
0a40: 20 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61    aRoot[i] = pPa
0a50: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20  rse->regRoot;.  
0a60: 20 20 20 20 61 43 72 65 61 74 65 54 62 6c 5b 69      aCreateTbl[i
0a70: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 1;.    }else
0a80: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  {.      /* The t
0a90: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
0aa0: 73 74 73 2e 20 49 66 20 7a 57 68 65 72 65 20 69  sts. If zWhere i
0ab0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65  s not NULL, dele
0ac0: 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 0a  te all entries .
0ad0: 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61        ** associa
0ae0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
0af0: 6c 65 20 7a 57 68 65 72 65 2e 20 49 66 20 7a 57  le zWhere. If zW
0b00: 68 65 72 65 20 69 73 20 4e 55 4c 4c 2c 20 64 65  here is NULL, de
0b10: 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
0b20: 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
0b30: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  s of the table. 
0b40: 2a 2f 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 69  */.      aRoot[i
0b50: 5d 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75 6d 3b  ] = pStat->tnum;
0b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
0b70: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
0b80: 69 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31  iDb, aRoot[i], 1
0b90: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , zTab);.      i
0ba0: 66 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20  f( zWhere ){.   
0bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
0bc0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
0bd0: 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
0be0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
0bf0: 45 52 45 20 74 62 6c 3d 25 51 22 2c 20 70 44 62  ERE tbl=%Q", pDb
0c00: 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a  ->zName, zTab, z
0c10: 57 68 65 72 65 0a 20 20 20 20 20 20 20 20 29 3b  Where.        );
0c20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
0c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c        /* The sql
0c40: 69 74 65 5f 73 74 61 74 5b 31 32 5d 20 74 61 62  ite_stat[12] tab
0c50: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
0c60: 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20 72  s.  Delete all r
0c70: 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ows. */.        
0c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0c90: 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61  2(v, OP_Clear, a
0ca0: 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20  Root[i], iDb);. 
0cb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
0cc0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
0cd0: 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 32 5d 20  sqlite_stat[12] 
0ce0: 74 61 62 6c 65 73 20 66 6f 72 20 77 72 69 74 69  tables for writi
0cf0: 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ng. */.  for(i=0
0d00: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
0d10: 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  able); i++){.   
0d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0d30: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
0d40: 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69 2c 20  te, iStatCur+i, 
0d50: 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b 0a  aRoot[i], iDb);.
0d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
0d70: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
0d80: 63 68 61 72 20 2a 29 33 2c 20 50 34 5f 49 4e 54  char *)3, P4_INT
0d90: 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  32);.    sqlite3
0da0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
0db0: 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b 0a  aCreateTbl[i]);.
0dc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
0dd0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
0de0: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
0df0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
0e00: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  ciated with.** a
0e10: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a   single table..*
0e20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  /.static void an
0e30: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 0a 20  alyzeOneTable(. 
0e40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0e50: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
0e60: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
0e70: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61 62  pTab,     /* Tab
0e80: 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63 65 73  le whose indices
0e90: 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61 6c 79   are to be analy
0ea0: 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  zed */.  int iSt
0eb0: 61 74 43 75 72 2c 20 20 20 20 2f 2a 20 49 6e 64  atCur,    /* Ind
0ec0: 65 78 20 6f 66 20 56 64 62 65 43 75 72 73 6f 72  ex of VdbeCursor
0ed0: 20 74 68 61 74 20 77 72 69 74 65 73 20 74 68 65   that writes the
0ee0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
0ef0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  ble */.  int iMe
0f00: 6d 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61  m         /* Ava
0f10: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f  ilable memory lo
0f20: 63 61 74 69 6f 6e 73 20 62 65 67 69 6e 20 68 65  cations begin he
0f30: 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
0f40: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0f50: 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61 74 61 62  >db;    /* Datab
0f60: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
0f70: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f90: 41 6e 20 69 6e 64 65 78 20 74 6f 20 62 65 69 6e  An index to bein
0fa0: 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  g analyzed */.  
0fb0: 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fd0: 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 69  Cursor open on i
0fe0: 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c 79  ndex being analy
0ff0: 7a 65 64 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  zed */.  Vdbe *v
1000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1010: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1020: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
1030: 6e 67 20 62 75 69 6c 74 20 75 70 20 2a 2f 0a 20  ng built up */. 
1040: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1060: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1070: 0a 20 20 69 6e 74 20 74 6f 70 4f 66 4c 6f 6f 70  .  int topOfLoop
1080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1090: 2f 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68  /* The top of th
10a0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
10b0: 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  endOfLoop;      
10c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10d0: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
10e0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20  */.  int addr;  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 2f 2a 20 54 68 65 20 61 64 64 72 65 73 73    /* The address
1110: 20 6f 66 20 61 6e 20 69 6e 73 74 72 75 63 74 69   of an instructi
1120: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  on */.  int iDb;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1150: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1160: 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 69  ning pTab */.  i
1170: 6e 74 20 72 65 67 54 61 62 6e 61 6d 65 20 3d 20  nt regTabname = 
1180: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52  iMem++;     /* R
1190: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
11a0: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ng table name */
11b0: 0a 20 20 69 6e 74 20 72 65 67 49 64 78 6e 61 6d  .  int regIdxnam
11c0: 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  e = iMem++;     
11d0: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
11e0: 61 69 6e 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d  aining index nam
11f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 61  e */.  int regSa
1200: 6d 70 6c 65 6e 6f 20 3d 20 69 4d 65 6d 2b 2b 3b  mpleno = iMem++;
1210: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1220: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74 20  containing next 
1230: 73 61 6d 70 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  sample number */
1240: 0a 20 20 69 6e 74 20 72 65 67 43 6f 6c 20 3d 20  .  int regCol = 
1250: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20  iMem++;         
1260: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 61 20  /* Content of a 
1270: 63 6f 6c 75 6d 6e 20 61 6e 61 6c 79 7a 65 64 20  column analyzed 
1280: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
1290: 65 67 52 65 63 20 3d 20 69 4d 65 6d 2b 2b 3b 20  egRec = iMem++; 
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12b0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6d 70  ter holding comp
12c0: 6c 65 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a  leted record */.
12d0: 20 20 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20    int regTemp = 
12e0: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f  iMem++;        /
12f0: 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
1300: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1310: 74 20 72 65 67 52 6f 77 69 64 20 3d 20 69 4d 65  t regRowid = iMe
1320: 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  m++;       /* Ro
1330: 77 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65  wid for the inse
1340: 72 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 0a  rted record */..
1350: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1360: 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 69 6e 74  ABLE_STAT2.  int
1370: 20 72 65 67 54 65 6d 70 32 20 3d 20 69 4d 65 6d   regTemp2 = iMem
1380: 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ++;       /* Tem
1390: 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
13a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
13b0: 53 61 6d 70 6c 65 72 65 63 6e 6f 20 3d 20 69 4d  Samplerecno = iM
13c0: 65 6d 2b 2b 3b 20 2f 2a 20 49 6e 64 65 78 20 6f  em++; /* Index o
13d0: 66 20 6e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  f next sample to
13e0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
13f0: 20 72 65 67 52 65 63 6e 6f 20 3d 20 69 4d 65 6d   regRecno = iMem
1400: 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ++;       /* Cur
1410: 72 65 6e 74 20 73 61 6d 70 6c 65 20 69 6e 64 65  rent sample inde
1420: 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 61  x */.  int regLa
1430: 73 74 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  st = iMem++;    
1440: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1450: 6c 61 73 74 20 73 61 6d 70 6c 65 20 74 6f 20 72  last sample to r
1460: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72  ecord */.  int r
1470: 65 67 46 69 72 73 74 20 3d 20 69 4d 65 6d 2b 2b  egFirst = iMem++
1480: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ;       /* Index
1490: 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65   of first sample
14a0: 20 74 6f 20 72 65 63 6f 72 64 20 2a 2f 0a 23 65   to record */.#e
14b0: 6e 64 69 66 0a 0a 20 20 76 20 3d 20 73 71 6c 69  ndif..  v = sqli
14c0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14d0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c  e);.  if( v==0 |
14e0: 7c 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  | NEVER(pTab==0)
14f0: 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1500: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ==0 ){.    /* Do
1510: 20 6e 6f 20 61 6e 61 6c 79 73 69 73 20 66 6f 72   no analysis for
1520: 20 74 61 62 6c 65 73 20 74 68 61 74 20 68 61 76   tables that hav
1530: 65 20 6e 6f 20 69 6e 64 69 63 65 73 20 2a 2f 0a  e no indices */.
1540: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1550: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1560: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
1570: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69  texes(db) );.  i
1580: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1590: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
15a0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
15b0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29  assert( iDb>=0 )
15c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15d0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
15e0: 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
15f0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1600: 65 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a  e, SQLITE_ANALYZ
1610: 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
1620: 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
1630: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
1640: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1650: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 73  .#endif..  /* Es
1660: 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 2d 6c  tablish a read-l
1670: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
1680: 20 61 74 20 74 68 65 20 73 68 61 72 65 64 2d 63   at the shared-c
1690: 61 63 68 65 20 6c 65 76 65 6c 2e 20 2a 2f 0a 20  ache level. */. 
16a0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
16b0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
16c0: 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
16d0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 69  ab->zName);..  i
16e0: 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
16f0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 66 6f 72 28 70  >nTab++;.  for(p
1700: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1710: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1720: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
1730: 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
1740: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 4b 65 79  nColumn;.    Key
1750: 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c  Info *pKey = sql
1760: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
1770: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
1780: 0a 20 20 20 20 69 66 28 20 69 4d 65 6d 2b 31 2b  .    if( iMem+1+
1790: 28 6e 43 6f 6c 2a 32 29 3e 70 50 61 72 73 65 2d  (nCol*2)>pParse-
17a0: 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70  >nMem ){.      p
17b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 69 4d  Parse->nMem = iM
17c0: 65 6d 2b 31 2b 28 6e 43 6f 6c 2a 32 29 3b 0a 20  em+1+(nCol*2);. 
17d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65     }..    /* Ope
17e0: 6e 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68  n a cursor to th
17f0: 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 61 6e  e index to be an
1800: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61  alyzed. */.    a
1810: 73 73 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69  ssert( iDb==sqli
1820: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1830: 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65  (db, pIdx->pSche
1840: 6d 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ma) );.    sqlit
1850: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1860: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
1870: 78 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  xCur, pIdx->tnum
1880: 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 28  , iDb,.        (
1890: 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
18a0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
18b0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
18c0: 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
18d0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  ->zName));..    
18e0: 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
18f0: 72 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61 69  registers contai
1900: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 61  ning the table a
1910: 6e 64 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 20  nd index names. 
1920: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
1930: 3e 70 49 6e 64 65 78 3d 3d 70 49 64 78 20 29 7b  >pIndex==pIdx ){
1940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1950: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
1960: 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 54 61  tring8, 0, regTa
1970: 62 6e 61 6d 65 2c 20 30 2c 20 70 54 61 62 2d 3e  bname, 0, pTab->
1980: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
1990: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
19b0: 69 6e 67 38 2c 20 30 2c 20 72 65 67 49 64 78 6e  ing8, 0, regIdxn
19c0: 61 6d 65 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e  ame, 0, pIdx->zN
19d0: 61 6d 65 2c 20 30 29 3b 0a 0a 23 69 66 64 65 66  ame, 0);..#ifdef
19e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
19f0: 54 41 54 32 0a 0a 20 20 20 20 2f 2a 20 49 66 20  TAT2..    /* If 
1a00: 74 68 69 73 20 69 74 65 72 61 74 69 6f 6e 20 6f  this iteration o
1a10: 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 67 65  f the loop is ge
1a20: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f  nerating code to
1a30: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 20 20 20   analyze the.   
1a40: 20 2a 2a 20 66 69 72 73 74 20 69 6e 64 65 78 20   ** first index 
1a50: 69 6e 20 74 68 65 20 70 54 61 62 2d 3e 70 49 6e  in the pTab->pIn
1a60: 64 65 78 20 6c 69 73 74 2c 20 74 68 65 6e 20 72  dex list, then r
1a70: 65 67 69 73 74 65 72 20 72 65 67 4c 61 73 74 20  egister regLast 
1a80: 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 62  has.    ** not b
1a90: 65 65 6e 20 70 6f 70 75 6c 61 74 65 64 2e 20 49  een populated. I
1aa0: 6e 20 74 68 69 73 20 63 61 73 65 20 70 6f 70 75  n this case popu
1ab0: 6c 61 74 65 20 69 74 20 6e 6f 77 2e 20 20 2a 2f  late it now.  */
1ac0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
1ad0: 49 6e 64 65 78 3d 3d 70 49 64 78 20 29 7b 0a 20  Index==pIdx ){. 
1ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1af0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1b00: 65 67 65 72 2c 20 53 51 4c 49 54 45 5f 49 4e 44  eger, SQLITE_IND
1b10: 45 58 5f 53 41 4d 50 4c 45 53 2c 20 72 65 67 53  EX_SAMPLES, regS
1b20: 61 6d 70 6c 65 72 65 63 6e 6f 29 3b 0a 20 20 20  amplerecno);.   
1b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b40: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1b50: 65 72 2c 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  er, SQLITE_INDEX
1b60: 5f 53 41 4d 50 4c 45 53 2a 32 2d 31 2c 20 72 65  _SAMPLES*2-1, re
1b70: 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  gTemp);.      sq
1b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 53  v, OP_Integer, S
1ba0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
1bb0: 4c 45 53 2a 32 2c 20 72 65 67 54 65 6d 70 32 29  LES*2, regTemp2)
1bc0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
1bd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1be0: 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2c  _Count, iIdxCur,
1bf0: 20 72 65 67 4c 61 73 74 29 3b 0a 20 20 20 20 20   regLast);.     
1c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c10: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1c20: 2c 20 72 65 67 46 69 72 73 74 29 3b 0a 20 20 20  , regFirst);.   
1c30: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
1c40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1c50: 50 5f 4c 74 2c 20 72 65 67 53 61 6d 70 6c 65 72  P_Lt, regSampler
1c60: 65 63 6e 6f 2c 20 30 2c 20 72 65 67 4c 61 73 74  ecno, 0, regLast
1c70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1c90: 5f 44 69 76 69 64 65 2c 20 72 65 67 54 65 6d 70  _Divide, regTemp
1ca0: 32 2c 20 72 65 67 4c 61 73 74 2c 20 72 65 67 46  2, regLast, regF
1cb0: 69 72 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  irst);.      sql
1cc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1cd0: 2c 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 2c 20 72  , OP_Multiply, r
1ce0: 65 67 4c 61 73 74 2c 20 72 65 67 54 65 6d 70 2c  egLast, regTemp,
1cf0: 20 72 65 67 4c 61 73 74 29 3b 0a 20 20 20 20 20   regLast);.     
1d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d10: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
1d20: 20 72 65 67 4c 61 73 74 2c 20 53 51 4c 49 54 45   regLast, SQLITE
1d30: 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2a 32  _INDEX_SAMPLES*2
1d40: 2d 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -2);.      sqlit
1d50: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1d60: 4f 50 5f 44 69 76 69 64 65 2c 20 20 72 65 67 54  OP_Divide,  regT
1d70: 65 6d 70 32 2c 20 72 65 67 4c 61 73 74 2c 20 72  emp2, regLast, r
1d80: 65 67 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 73  egLast);.      s
1d90: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1da0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
1db0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20   }..    /* Zero 
1dc0: 74 68 65 20 72 65 67 53 61 6d 70 6c 65 6e 6f 20  the regSampleno 
1dd0: 61 6e 64 20 72 65 67 52 65 63 6e 6f 20 72 65 67  and regRecno reg
1de0: 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 73  isters. */.    s
1df0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e00: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1e10: 30 2c 20 72 65 67 53 61 6d 70 6c 65 6e 6f 29 3b  0, regSampleno);
1e20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1e40: 65 67 65 72 2c 20 30 2c 20 72 65 67 52 65 63 6e  eger, 0, regRecn
1e50: 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  o);.    sqlite3V
1e60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e70: 43 6f 70 79 2c 20 72 65 67 46 69 72 73 74 2c 20  Copy, regFirst, 
1e80: 72 65 67 53 61 6d 70 6c 65 72 65 63 6e 6f 29 3b  regSamplerecno);
1e90: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1ea0: 54 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  The block of mem
1eb0: 6f 72 79 20 63 65 6c 6c 73 20 69 6e 69 74 69 61  ory cells initia
1ec0: 6c 69 7a 65 64 20 68 65 72 65 20 69 73 20 75 73  lized here is us
1ed0: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 0a 20  ed as follows.. 
1ee0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ef0: 69 4d 65 6d 3a 20 20 20 20 20 20 20 20 20 20 20  iMem:           
1f00: 20 20 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 20       .    **    
1f10: 20 20 20 20 54 68 65 20 74 6f 74 61 6c 20 6e 75      The total nu
1f20: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1f30: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
1f40: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 4d 65 6d  *.    **    iMem
1f50: 2b 31 20 2e 2e 20 69 4d 65 6d 2b 6e 43 6f 6c 3a  +1 .. iMem+nCol:
1f60: 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
1f70: 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e  Number of distin
1f80: 63 74 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e  ct entries in in
1f90: 64 65 78 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  dex considering 
1fa0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1fb0: 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 4e 20 63     left-most N c
1fc0: 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 2c 20 77 68 65  olumns only, whe
1fd0: 72 65 20 4e 20 69 73 20 62 65 74 77 65 65 6e 20  re N is between 
1fe0: 31 20 61 6e 64 20 6e 43 6f 6c 2c 20 0a 20 20 20  1 and nCol, .   
1ff0: 20 2a 2a 20 20 20 20 20 20 20 20 69 6e 63 6c 75   **        inclu
2000: 73 69 76 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  sive..    **.   
2010: 20 2a 2a 20 20 20 20 69 4d 65 6d 2b 6e 43 6f 6c   **    iMem+nCol
2020: 2b 31 20 2e 2e 20 4d 65 6d 2b 32 2a 6e 43 6f 6c  +1 .. Mem+2*nCol
2030: 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  :  .    **      
2040: 20 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65    Previous value
2050: 20 6f 66 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   of indexed colu
2060: 6d 6e 73 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  mns, from left t
2070: 6f 20 72 69 67 68 74 2e 0a 20 20 20 20 2a 2a 0a  o right..    **.
2080: 20 20 20 20 2a 2a 20 43 65 6c 6c 73 20 69 4d 65      ** Cells iMe
2090: 6d 20 74 68 72 6f 75 67 68 20 69 4d 65 6d 2b 6e  m through iMem+n
20a0: 43 6f 6c 20 61 72 65 20 69 6e 69 74 69 61 6c 69  Col are initiali
20b0: 7a 65 64 20 74 6f 20 30 2e 20 54 68 65 20 6f 74  zed to 0. The ot
20c0: 68 65 72 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  hers are .    **
20d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
20e0: 63 6f 6e 74 61 69 6e 20 61 6e 20 53 51 4c 20 4e  contain an SQL N
20f0: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
2100: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6e 43 6f 6c  for(i=0; i<=nCol
2110: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
2120: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2130: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2140: 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 7d  , iMem+i);.    }
2150: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2160: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2180: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
2190: 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31  0, iMem+nCol+i+1
21a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
21b0: 20 53 74 61 72 74 20 74 68 65 20 61 6e 61 6c 79   Start the analy
21c0: 73 69 73 20 6c 6f 6f 70 2e 20 54 68 69 73 20 6c  sis loop. This l
21d0: 6f 6f 70 20 72 75 6e 73 20 74 68 72 6f 75 67 68  oop runs through
21e0: 20 61 6c 6c 20 74 68 65 20 65 6e 74 72 69 65 73   all the entries
21f0: 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 69   in.    ** the i
2200: 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 20 2a 2f  ndex b-tree.  */
2210: 0a 20 20 20 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d  .    endOfLoop =
2220: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2230: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71  Label(v);.    sq
2240: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2250: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49  v, OP_Rewind, iI
2260: 64 78 43 75 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70  dxCur, endOfLoop
2270: 29 3b 0a 20 20 20 20 74 6f 70 4f 66 4c 6f 6f 70  );.    topOfLoop
2280: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2290: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
22a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22b0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
22c0: 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 0a 20 20 20  , iMem, 1);..   
22d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
22e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
22f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2300: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
2310: 64 78 43 75 72 2c 20 69 2c 20 72 65 67 43 6f 6c  dxCur, i, regCol
2320: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2330: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20  _ENABLE_STAT2.  
2340: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
2350: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2360: 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 74   if the record t
2370: 68 61 74 20 63 75 72 73 6f 72 20 69 49 64 78 43  hat cursor iIdxC
2380: 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 63 6f 6e  ur points to con
2390: 74 61 69 6e 73 20 61 0a 20 20 20 20 20 20 20 20  tains a.        
23a0: 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20 73 68  ** value that sh
23b0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
23c0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
23d0: 74 32 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  t2 table. If so,
23e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
23f0: 65 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  e it.  */.      
2400: 20 20 69 6e 74 20 6e 65 20 3d 20 73 71 6c 69 74    int ne = sqlit
2410: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2420: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 63 6e 6f 2c  OP_Ne, regRecno,
2430: 20 30 2c 20 72 65 67 53 61 6d 70 6c 65 72 65 63   0, regSamplerec
2440: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  no);.        ass
2450: 65 72 74 28 20 72 65 67 54 61 62 6e 61 6d 65 2b  ert( regTabname+
2460: 31 3d 3d 72 65 67 49 64 78 6e 61 6d 65 20 0a 20  1==regIdxname . 
2470: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72              && r
2480: 65 67 54 61 62 6e 61 6d 65 2b 32 3d 3d 72 65 67  egTabname+2==reg
2490: 53 61 6d 70 6c 65 6e 6f 0a 20 20 20 20 20 20 20  Sampleno.       
24a0: 20 20 20 20 20 20 26 26 20 72 65 67 54 61 62 6e        && regTabn
24b0: 61 6d 65 2b 33 3d 3d 72 65 67 43 6f 6c 0a 20 20  ame+3==regCol.  
24c0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
24e0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a  geP5(v, SQLITE_J
24f0: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2510: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
2520: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
2530: 6d 65 2c 20 34 2c 20 72 65 67 52 65 63 2c 20 22  me, 4, regRec, "
2540: 61 61 61 62 22 2c 20 30 29 3b 0a 20 20 20 20 20  aaab", 0);.     
2550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2560: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
2570: 77 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31 2c  wid, iStatCur+1,
2580: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
2590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
25b0: 72 74 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20  rt, iStatCur+1, 
25c0: 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64  regRec, regRowid
25d0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  );..        /* C
25e0: 61 6c 63 75 6c 61 74 65 20 6e 65 77 20 76 61 6c  alculate new val
25f0: 75 65 73 20 66 6f 72 20 72 65 67 53 61 6d 70 6c  ues for regSampl
2600: 65 72 65 63 6e 6f 20 61 6e 64 20 72 65 67 53 61  erecno and regSa
2610: 6d 70 6c 65 6e 6f 2e 0a 20 20 20 20 20 20 20 20  mpleno..        
2620: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2630: 73 61 6d 70 6c 65 6e 6f 20 3d 20 73 61 6d 70 6c  sampleno = sampl
2640: 65 6e 6f 20 2b 20 31 0a 20 20 20 20 20 20 20 20  eno + 1.        
2650: 2a 2a 20 20 20 73 61 6d 70 6c 65 72 65 63 6e 6f  **   samplerecno
2660: 20 3d 20 73 61 6d 70 6c 65 72 65 63 6e 6f 2b 28   = samplerecno+(
2670: 72 65 6d 61 69 6e 69 6e 67 20 72 65 63 6f 72 64  remaining record
2680: 73 29 2f 28 72 65 6d 61 69 6e 69 6e 67 20 73 61  s)/(remaining sa
2690: 6d 70 6c 65 73 29 0a 20 20 20 20 20 20 20 20 2a  mples).        *
26a0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
26b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26c0: 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 53 61 6d  P_AddImm, regSam
26d0: 70 6c 65 6e 6f 2c 20 31 29 3b 0a 20 20 20 20 20  pleno, 1);.     
26e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
2700: 61 63 74 2c 20 72 65 67 52 65 63 6e 6f 2c 20 72  act, regRecno, r
2710: 65 67 4c 61 73 74 2c 20 72 65 67 54 65 6d 70 29  egLast, regTemp)
2720: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2730: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2740: 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 54 65 6d  P_AddImm, regTem
2750: 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  p, -1);.        
2760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2770: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2780: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
2790: 4d 50 4c 45 53 2c 20 72 65 67 54 65 6d 70 32 29  MPLES, regTemp2)
27a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27c0: 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65 67 53  P_Subtract, regS
27d0: 61 6d 70 6c 65 6e 6f 2c 20 72 65 67 54 65 6d 70  ampleno, regTemp
27e0: 32 2c 20 72 65 67 54 65 6d 70 32 29 3b 0a 20 20  2, regTemp2);.  
27f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2800: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 69  eAddOp3(v, OP_Di
2810: 76 69 64 65 2c 20 72 65 67 54 65 6d 70 32 2c 20  vide, regTemp2, 
2820: 72 65 67 54 65 6d 70 2c 20 72 65 67 54 65 6d 70  regTemp, regTemp
2830: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2840: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2850: 4f 50 5f 41 64 64 2c 20 72 65 67 53 61 6d 70 6c  OP_Add, regSampl
2860: 65 72 65 63 6e 6f 2c 20 72 65 67 54 65 6d 70 2c  erecno, regTemp,
2870: 20 72 65 67 53 61 6d 70 6c 65 72 65 63 6e 6f 29   regSamplerecno)
2880: 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
2890: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28a0: 2c 20 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 73  , ne);.        s
28b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28c0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72  (v, OP_AddImm, r
28d0: 65 67 52 65 63 6e 6f 2c 20 31 29 3b 0a 20 20 20  egRecno, 1);.   
28e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
28f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2900: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp3(v, OP_Ne, r
2910: 65 67 43 6f 6c 2c 20 30 2c 20 69 4d 65 6d 2b 6e  egCol, 0, iMem+n
2920: 43 6f 6c 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20  Col+i+1);.      
2930: 2f 2a 2a 2a 2a 20 54 4f 44 4f 3a 20 20 61 64 64  /**** TODO:  add
2940: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2950: 6e 63 65 20 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 20  nce *****/.     
2960: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2970: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a  geP5(v, SQLITE_J
2980: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2990: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
29a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
29b0: 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
29c0: 6f 63 20 66 61 69 6c 75 72 65 20 68 61 73 20 6f  oc failure has o
29d0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
29e0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
29f0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
2a00: 20 20 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74    ** passed as t
2a10: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a20: 6e 74 20 74 6f 20 74 68 65 20 63 61 6c 6c 20 74  nt to the call t
2a30: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  o sqlite3VdbeJum
2a40: 70 48 65 72 65 28 29 20 0a 20 20 20 20 20 20 2a  pHere() .      *
2a50: 2a 20 62 65 6c 6f 77 20 6d 61 79 20 62 65 20 6e  * below may be n
2a60: 65 67 61 74 69 76 65 2e 20 57 68 69 63 68 20 63  egative. Which c
2a70: 61 75 73 65 73 20 61 6e 20 61 73 73 65 72 74 28  auses an assert(
2a80: 29 20 74 6f 20 66 61 69 6c 20 28 6f 72 20 61 6e  ) to fail (or an
2a90: 0a 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66  .      ** out-of
2aa0: 2d 62 6f 75 6e 64 73 20 77 72 69 74 65 20 69 66  -bounds write if
2ab0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
2ac0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2e 20 20   not defined).  
2ad0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
2ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b00: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4f  OP_Goto, 0, endO
2b10: 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 66 6f 72 28  fLoop);.    for(
2b20: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
2b30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2b50: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2b60: 6e 74 41 64 64 72 28 76 29 2d 28 6e 43 6f 6c 2a  ntAddr(v)-(nCol*
2b70: 32 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  2));.      sqlit
2b80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b90: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4d 65 6d 2b  OP_AddImm, iMem+
2ba0: 69 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  i+1, 1);.      s
2bb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2bc0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
2bd0: 49 64 78 43 75 72 2c 20 69 2c 20 69 4d 65 6d 2b  IdxCur, i, iMem+
2be0: 6e 43 6f 6c 2b 69 2b 31 29 3b 0a 20 20 20 20 7d  nCol+i+1);.    }
2bf0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ..    /* End of 
2c00: 74 68 65 20 61 6e 61 6c 79 73 69 73 20 6c 6f 6f  the analysis loo
2c10: 70 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  p. */.    sqlite
2c20: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2c30: 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b  l(v, endOfLoop);
2c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2c50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
2c60: 74 2c 20 69 49 64 78 43 75 72 2c 20 74 6f 70 4f  t, iIdxCur, topO
2c70: 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  fLoop);.    sqli
2c80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2c90: 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 43   OP_Close, iIdxC
2ca0: 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ur);..    /* Sto
2cb0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
2cc0: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 0a  n sqlite_stat1..
2cd0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2ce0: 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 69  e result is a si
2cf0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2d00: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
2d10: 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 0a 20  le.  The first. 
2d20: 20 20 20 2a 2a 20 74 77 6f 20 63 6f 6c 75 6d 6e     ** two column
2d30: 73 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20  s are the names 
2d40: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
2d50: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74 68 69   index.  The thi
2d60: 72 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a  rd column.    **
2d70: 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6d   is a string com
2d80: 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74 20  posed of a list 
2d90: 6f 66 20 69 6e 74 65 67 65 72 20 73 74 61 74 69  of integer stati
2da0: 73 74 69 63 73 20 61 62 6f 75 74 20 74 68 65 0a  stics about the.
2db0: 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 54      ** index.  T
2dc0: 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
2dd0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   in the list is 
2de0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2df0: 20 6f 66 20 65 6e 74 72 69 65 73 0a 20 20 20 20   of entries.    
2e00: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ** in the index.
2e10: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 61    There is one a
2e20: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65  dditional intege
2e30: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 66 6f  r in the list fo
2e40: 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 63 6f  r each.    ** co
2e50: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
2e60: 65 2e 20 20 54 68 69 73 20 61 64 64 69 74 69 6f  e.  This additio
2e70: 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 73 20 61  nal integer is a
2e80: 20 67 75 65 73 73 20 6f 66 20 68 6f 77 20 6d 61   guess of how ma
2e90: 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 73 20 6f  ny.    ** rows o
2ea0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  f the table the 
2eb0: 69 6e 64 65 78 20 77 69 6c 6c 20 73 65 6c 65 63  index will selec
2ec0: 74 2e 20 20 49 66 20 44 20 69 73 20 74 68 65 20  t.  If D is the 
2ed0: 63 6f 75 6e 74 20 6f 66 20 64 69 73 74 69 6e 63  count of distinc
2ee0: 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  t.    ** values 
2ef0: 61 6e 64 20 4b 20 69 73 20 74 68 65 20 74 6f 74  and K is the tot
2f00: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
2f10: 73 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  s, then the inte
2f20: 67 65 72 20 69 73 20 63 6f 6d 70 75 74 65 64 0a  ger is computed.
2f30: 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20 20 20 2a      ** as:.    *
2f40: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
2f50: 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20  I = (K+D-1)/D.  
2f60: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 4b    **.    ** If K
2f70: 3d 3d 30 20 74 68 65 6e 20 6e 6f 20 65 6e 74 72  ==0 then no entr
2f80: 79 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 74  y is made into t
2f90: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
2fa0: 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2a 20  table.  .    ** 
2fb0: 49 66 20 4b 3e 30 20 74 68 65 6e 20 69 74 20 69  If K>0 then it i
2fc0: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
2fd0: 65 20 74 68 65 20 44 3e 30 20 73 6f 20 64 69 76  e the D>0 so div
2fe0: 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f 0a 20 20  ision by zero.  
2ff0: 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20 70 6f    ** is never po
3000: 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  ssible..    */. 
3010: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3020: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3030: 50 5f 49 66 4e 6f 74 2c 20 69 4d 65 6d 29 3b 0a  P_IfNot, iMem);.
3040: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3050: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
3060: 79 2c 20 69 4d 65 6d 2c 20 72 65 67 53 61 6d 70  y, iMem, regSamp
3070: 6c 65 6e 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69  leno);.    for(i
3080: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
3090: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
30a0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
30b0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 54  String8, 0, regT
30c0: 65 6d 70 2c 20 30 2c 20 22 20 22 2c 20 30 29 3b  emp, 0, " ", 0);
30d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
30f0: 6f 6e 63 61 74 2c 20 72 65 67 54 65 6d 70 2c 20  oncat, regTemp, 
3100: 72 65 67 53 61 6d 70 6c 65 6e 6f 2c 20 72 65 67  regSampleno, reg
3110: 53 61 6d 70 6c 65 6e 6f 29 3b 0a 20 20 20 20 20  Sampleno);.     
3120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3130: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4d  p3(v, OP_Add, iM
3140: 65 6d 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 72 65  em, iMem+i+1, re
3150: 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  gTemp);.      sq
3160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3170: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
3180: 67 54 65 6d 70 2c 20 2d 31 29 3b 0a 20 20 20 20  gTemp, -1);.    
3190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31a0: 4f 70 33 28 76 2c 20 4f 50 5f 44 69 76 69 64 65  Op3(v, OP_Divide
31b0: 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20 72 65 67 54  , iMem+i+1, regT
31c0: 65 6d 70 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20  emp, regTemp);. 
31d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31e0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 54 6f 49  AddOp1(v, OP_ToI
31f0: 6e 74 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20  nt, regTemp);.  
3200: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3210: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63  ddOp3(v, OP_Conc
3220: 61 74 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67  at, regTemp, reg
3230: 53 61 6d 70 6c 65 6e 6f 2c 20 72 65 67 53 61 6d  Sampleno, regSam
3240: 70 6c 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  pleno);.    }.  
3250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3260: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
3270: 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65  cord, regTabname
3280: 2c 20 33 2c 20 72 65 67 52 65 63 2c 20 22 61 61  , 3, regRec, "aa
3290: 61 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  a", 0);.    sqli
32a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32b0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53   OP_NewRowid, iS
32c0: 74 61 74 43 75 72 2c 20 72 65 67 52 6f 77 69 64  tatCur, regRowid
32d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
32e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
32f0: 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c  nsert, iStatCur,
3300: 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69   regRec, regRowi
3310: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
3320: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
3330: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
3340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3350: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3360: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
3370: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
3380: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
3390: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 64 65  most recent inde
33a0: 78 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a 2a  x analysis to.**
33b0: 20 62 65 20 6c 61 6f 64 65 64 20 69 6e 74 6f 20   be laoded into 
33c0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
33d0: 62 6c 65 73 20 77 68 65 72 65 20 69 73 20 63 61  bles where is ca
33e0: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73 74  n be used..*/.st
33f0: 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 41 6e  atic void loadAn
3400: 61 6c 79 73 69 73 28 50 61 72 73 65 20 2a 70 50  alysis(Parse *pP
3410: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
3420: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
3430: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
3440: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
3450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3460: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 6f 61 64 41  dOp1(v, OP_LoadA
3470: 6e 61 6c 79 73 69 73 2c 20 69 44 62 29 3b 0a 20  nalysis, iDb);. 
3480: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
3490: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
34a0: 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73  ill do an analys
34b0: 69 73 20 6f 66 20 61 6e 20 65 6e 74 69 72 65 20  is of an entire 
34c0: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74  database.*/.stat
34d0: 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 44  ic void analyzeD
34e0: 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
34f0: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
3500: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3510: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 53   pParse->db;.  S
3520: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
3530: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
3540: 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63 68  chema;    /* Sch
3550: 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65 20  ema of database 
3560: 69 44 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  iDb */.  HashEle
3570: 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61  m *k;.  int iSta
3580: 74 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65 6d  tCur;.  int iMem
3590: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  ;..  sqlite3Begi
35a0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
35b0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
35c0: 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50  .  iStatCur = pP
35d0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50  arse->nTab;.  pP
35e0: 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 32 3b  arse->nTab += 2;
35f0: 0a 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65  .  openStatTable
3600: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53  (pParse, iDb, iS
3610: 74 61 74 43 75 72 2c 20 30 29 3b 0a 20 20 69 4d  tatCur, 0);.  iM
3620: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
3630: 6d 2b 31 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c  m+1;.  for(k=sql
3640: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
3650: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
3660: 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
3670: 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 54 61  Next(k)){.    Ta
3680: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62  ble *pTab = (Tab
3690: 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
36a0: 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79  ta(k);.    analy
36b0: 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73  zeOneTable(pPars
36c0: 65 2c 20 70 54 61 62 2c 20 69 53 74 61 74 43 75  e, pTab, iStatCu
36d0: 72 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  r, iMem);.  }.  
36e0: 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61  loadAnalysis(pPa
36f0: 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  rse, iDb);.}../*
3700: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3710: 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61  e that will do a
3720: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 20  n analysis of a 
3730: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a  single table in.
3740: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a  ** a database..*
3750: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  /.static void an
3760: 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73 65  alyzeTable(Parse
3770: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
3780: 2a 70 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 44  *pTab){.  int iD
3790: 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75  b;.  int iStatCu
37a0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  r;..  assert( pT
37b0: 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
37c0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
37d0: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70  oldsAllMutexes(p
37e0: 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20  Parse->db) );.  
37f0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3800: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
3810: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
3820: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
3830: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
3840: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
3850: 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20  Db);.  iStatCur 
3860: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
3870: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b    pParse->nTab +
3880: 3d 20 32 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54  = 2;.  openStatT
3890: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
38a0: 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54 61 62  , iStatCur, pTab
38b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 61 6e 61 6c  ->zName);.  anal
38c0: 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72  yzeOneTable(pPar
38d0: 73 65 2c 20 70 54 61 62 2c 20 69 53 74 61 74 43  se, pTab, iStatC
38e0: 75 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ur, pParse->nMem
38f0: 2b 31 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79  +1);.  loadAnaly
3900: 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29  sis(pParse, iDb)
3910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
3920: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
3930: 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
3940: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61  .  The parser ca
3950: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3960: 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f  .** when it reco
3970: 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a  gnizes an ANALYZ
3980: 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
3990: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
39c0: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
39d0: 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20  E  <database>   
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
39f0: 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  2.**        ANAL
3a00: 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  YZE  ?<database>
3a10: 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
3a20: 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 3.**.** Form 1
3a30: 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
3a40: 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
3a50: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
3a60: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a   be analyzed..**
3a70: 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73   Form 2 analyzes
3a80: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65   all indices the
3a90: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
3aa0: 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20   named..** Form 
3ab0: 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69  3 analyzes all i
3ac0: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
3ad0: 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
3ae0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
3af0: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50  sqlite3Analyze(P
3b00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
3b10: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
3b20: 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73  en *pName2){.  s
3b30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3b40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
3b50: 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  Db;.  int i;.  c
3b60: 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20  har *z, *zDb;.  
3b70: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 54  Table *pTab;.  T
3b80: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
3b90: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
3ba0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
3bb0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
3bc0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
3bd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
3be0: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
3bf0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
3c00: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
3c10: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3c20: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70  oldsAllMutexes(p
3c30: 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20  Parse->db) );.  
3c40: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
3c50: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
3c60: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
3c70: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61  return;.  }..  a
3c80: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
3c90: 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20 29 3b   || pName1==0 );
3ca0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
3cb0: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20   ){.    /* Form 
3cc0: 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76 65 72  1:  Analyze ever
3cd0: 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 66 6f  ything */.    fo
3ce0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
3cf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
3d00: 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  ( i==1 ) continu
3d10: 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e  e;  /* Do not an
3d20: 61 6c 79 7a 65 20 74 68 65 20 54 45 4d 50 20 64  alyze the TEMP d
3d30: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
3d40: 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65   analyzeDatabase
3d50: 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20  (pParse, i);.   
3d60: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
3d70: 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b 0a 20  Name2->n==0 ){. 
3d80: 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a 20 20 41     /* Form 2:  A
3d90: 6e 61 6c 79 7a 65 20 74 68 65 20 64 61 74 61 62  nalyze the datab
3da0: 61 73 65 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  ase or table nam
3db0: 65 64 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  ed */.    iDb = 
3dc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
3dd0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
3de0: 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
3df0: 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61     analyzeDataba
3e00: 73 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  se(pParse, iDb);
3e10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3e20: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
3e30: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
3e40: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 69 66  Name1);.      if
3e50: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ( z ){.        p
3e60: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
3e70: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
3e80: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20   0, z, 0);.     
3e90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3ea0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  (db, z);.       
3eb0: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
3ec0: 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61         analyzeTa
3ed0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
3ee0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3ef0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
3f00: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20  se{.    /* Form 
3f10: 33 3a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 66  3: Analyze the f
3f20: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 74  ully qualified t
3f30: 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  able name */.   
3f40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
3f50: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
3f60: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
3f70: 2c 20 26 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  , &pTableName);.
3f80: 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29      if( iDb>=0 )
3f90: 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 64 62  {.      zDb = db
3fa0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
3fb0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
3fc0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
3fd0: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  (db, pTableName)
3fe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
3ff0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
4000: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
4010: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c  le(pParse, 0, z,
4020: 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   zDb);.        s
4030: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4040: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
4050: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20   pTab ){.       
4060: 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28     analyzeTable(
4070: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
4080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4090: 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 0a 7d 0a  .    }   .  }.}.
40a0: 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70  ./*.** Used to p
40b0: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
40c0: 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a 65  from the analyze
40d0: 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67 68  r reader through
40e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 62   to the.** callb
40f0: 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  ack routine..*/.
4100: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
4110: 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61 6c  nalysisInfo anal
4120: 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63 74  ysisInfo;.struct
4130: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b 0a   analysisInfo {.
4140: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
4150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
4160: 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  tabase;.};../*.*
4170: 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  * This callback 
4180: 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
4190: 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 77  for each index w
41a0: 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65 0a  hen reading the.
41b0: 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  ** sqlite_stat1 
41c0: 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20  table.  .**.**  
41d0: 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d     argv[0] = nam
41e0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 2a  e of the index.*
41f0: 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20  *     argv[1] = 
4200: 72 65 73 75 6c 74 73 20 6f 66 20 61 6e 61 6c 79  results of analy
4210: 73 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67 65 72  sis - on integer
4220: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4230: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
4240: 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 28 76 6f  nalysisLoader(vo
4250: 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61  id *pData, int a
4260: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
4270: 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64  , char **NotUsed
4280: 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66  ){.  analysisInf
4290: 6f 20 2a 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c  o *pInfo = (anal
42a0: 79 73 69 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b  ysisInfo*)pData;
42b0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
42c0: 3b 0a 20 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20  ;.  int i, c;.  
42d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 3b 0a  unsigned int v;.
42e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
42f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ..  assert( argc
4300: 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==2 );.  UNUSED_
4310: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
4320: 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20 69 66  ed, argc);..  if
4330: 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67  ( argv==0 || arg
4340: 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b  v[0]==0 || argv[
4350: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  1]==0 ){.    ret
4360: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e  urn 0;.  }.  pIn
4370: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
4380: 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62  dIndex(pInfo->db
4390: 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e 66 6f  , argv[0], pInfo
43a0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
43b0: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
43c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
43d0: 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76 5b 31 5d   }.  z = argv[1]
43e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20  ;.  for(i=0; *z 
43f0: 26 26 20 69 3c 3d 70 49 6e 64 65 78 2d 3e 6e 43  && i<=pIndex->nC
4400: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
4410: 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   v = 0;.    whil
4420: 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27  e( (c=z[0])>='0'
4430: 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20   && c<='9' ){.  
4440: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 63      v = v*10 + c
4450: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b   - '0';.      z+
4460: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  +;.    }.    pIn
4470: 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d  dex->aiRowEst[i]
4480: 20 3d 20 76 3b 0a 20 20 20 20 69 66 28 20 2a 7a   = v;.    if( *z
4490: 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 7d  ==' ' ) z++;.  }
44a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
44b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 6e 64  /*.** If the Ind
44c0: 65 78 2e 61 53 61 6d 70 6c 65 20 76 61 72 69 61  ex.aSample varia
44d0: 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ble is not NULL,
44e0: 20 64 65 6c 65 74 65 20 74 68 65 20 61 53 61 6d   delete the aSam
44f0: 70 6c 65 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  ple[] array.** a
4500: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
4510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4520: 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c  DeleteIndexSampl
4530: 65 73 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  es(Index *pIdx){
4540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4550: 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 69 66  NABLE_STAT2.  if
4560: 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20  ( pIdx->aSample 
4570: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
4580: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4d 65 6d    sqlite3 *dbMem
4590: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
45a0: 3e 64 62 4d 65 6d 3b 0a 20 20 20 20 66 6f 72 28  >dbMem;.    for(
45b0: 6a 3d 30 3b 20 6a 3c 53 51 4c 49 54 45 5f 49 4e  j=0; j<SQLITE_IN
45c0: 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 6a 2b 2b  DEX_SAMPLES; j++
45d0: 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 53 61  ){.      IndexSa
45e0: 6d 70 6c 65 20 2a 70 20 3d 20 26 70 49 64 78 2d  mple *p = &pIdx-
45f0: 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20 20  >aSample[j];.   
4600: 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d     if( p->eType=
4610: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20  =SQLITE_TEXT || 
4620: 70 2d 3e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  p->eType==SQLITE
4630: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20  _BLOB ){.       
4640: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
4650: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 4d  Idx->pTable->dbM
4660: 65 6d 2c 20 70 2d 3e 75 2e 7a 29 3b 0a 20 20 20  em, p->u.z);.   
4670: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
4680: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 4d  qlite3DbFree(dbM
4690: 65 6d 2c 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  em, pIdx->aSampl
46a0: 65 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53  e);.    pIdx->aS
46b0: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 23  ample = 0;.  }.#
46c0: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
46d0: 52 41 4d 45 54 45 52 28 70 49 64 78 29 3b 0a 23  RAMETER(pIdx);.#
46e0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  endif.}../*.** L
46f0: 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  oad the content 
4700: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
4710: 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  at1 and sqlite_s
4720: 74 61 74 32 20 74 61 62 6c 65 73 2e 20 54 68 65  tat2 tables. The
4730: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
4740: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 72 65  sqlite_stat1 are
4750: 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74   used to populat
4760: 65 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  e the Index.aiRo
4770: 77 45 73 74 5b 5d 0a 2a 2a 20 61 72 72 61 79 73  wEst[].** arrays
4780: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
4790: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 61  f sqlite_stat2 a
47a0: 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c  re used to popul
47b0: 61 74 65 20 74 68 65 0a 2a 2a 20 49 6e 64 65 78  ate the.** Index
47c0: 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79  .aSample[] array
47d0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
47e0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
47f0: 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  le is not presen
4800: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
4810: 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 0a  e, SQLITE_ERROR.
4820: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
4830: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 76  In this case, ev
4840: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  en if SQLITE_ENA
4850: 42 4c 45 5f 53 54 41 54 32 20 77 61 73 20 64 65  BLE_STAT2 was de
4860: 66 69 6e 65 64 20 0a 2a 2a 20 64 75 72 69 6e 67  fined .** during
4870: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64   compilation and
4880: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
4890: 32 20 74 61 62 6c 65 20 69 73 20 70 72 65 73 65  2 table is prese
48a0: 6e 74 2c 20 6e 6f 20 64 61 74 61 20 69 73 20 0a  nt, no data is .
48b0: 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2e  ** read from it.
48c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
48d0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 77 61  _ENABLE_STAT2 wa
48e0: 73 20 64 65 66 69 6e 65 64 20 64 75 72 69 6e 67  s defined during
48f0: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64   compilation and
4900: 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f   the .** sqlite_
4910: 73 74 61 74 32 20 74 61 62 6c 65 20 69 73 20 6e  stat2 table is n
4920: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
4930: 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49  e database, SQLI
4940: 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72  TE_ERROR is.** r
4950: 65 74 75 72 6e 65 64 2e 20 48 6f 77 65 76 65 72  eturned. However
4960: 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20  , in this case, 
4970: 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f  data is read fro
4980: 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
4990: 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66 20  t1.** table (if 
49a0: 69 74 20 69 73 20 70 72 65 73 65 6e 74 29 20 62  it is present) b
49b0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
49c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
49d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
49e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
49f0: 61 79 73 20 73 65 74 73 20 64 62 2d 3e 6d 61 6c  ays sets db->mal
4a00: 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54 68  locFailed..** Th
4a10: 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
4a20: 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20  caller does not 
4a30: 63 61 72 65 20 61 62 6f 75 74 20 6f 74 68 65 72  care about other
4a40: 20 65 72 72 6f 72 73 2c 20 74 68 65 20 72 65 74   errors, the ret
4a50: 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79 20  urn.** code may 
4a60: 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  be ignored..*/.i
4a70: 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73  nt sqlite3Analys
4a80: 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20 2a  isLoad(sqlite3 *
4a90: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
4aa0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e  analysisInfo sIn
4ab0: 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  fo;.  HashElem *
4ac0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  i;.  char *zSql;
4ad0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4ae0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
4af0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
4b00: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
4b10: 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a  [iDb].pBt!=0 );.
4b20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4b30: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
4b40: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
4b50: 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61  t) );..  /* Clea
4b60: 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61 74  r any prior stat
4b70: 69 73 74 69 63 73 20 2a 2f 0a 20 20 66 6f 72 28  istics */.  for(
4b80: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
4b90: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
4ba0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
4bb0: 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  );i;i=sqliteHash
4bc0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e  Next(i)){.    In
4bd0: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
4be0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
4bf0: 20 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c     sqlite3Defaul
4c00: 74 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20  tRowEst(pIdx);. 
4c10: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
4c20: 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 70 49 64  IndexSamples(pId
4c30: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  x);.  }..  /* Ch
4c40: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
4c50: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
4c60: 31 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 2a  1 table exists *
4c70: 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20 64  /.  sInfo.db = d
4c80: 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61  b;.  sInfo.zData
4c90: 62 61 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69  base = db->aDb[i
4ca0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  Db].zName;.  if(
4cb0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
4cc0: 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
4cd0: 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74  at1", sInfo.zDat
4ce0: 61 62 61 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20  abase)==0 ){.   
4cf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
4d00: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
4d10: 4c 6f 61 64 20 6e 65 77 20 73 74 61 74 69 73 74  Load new statist
4d20: 69 63 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ics out of the s
4d30: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
4d40: 65 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73 71  e */.  zSql = sq
4d50: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
4d60: 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
4d70: 69 64 78 2c 20 73 74 61 74 20 46 52 4f 4d 20 25  idx, stat FROM %
4d80: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  Q.sqlite_stat1",
4d90: 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
4da0: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
4db0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
4dc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
4dd0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
4de0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
4df0: 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64  ql, analysisLoad
4e00: 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30 29 3b 0a  er, &sInfo, 0);.
4e10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4e20: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d  e(db, zSql);.  }
4e30: 0a 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ...  /* Load the
4e40: 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d   statistics from
4e50: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
4e60: 32 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64  2 table. */.#ifd
4e70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4e80: 5f 53 54 41 54 32 0a 20 20 69 66 28 20 72 63 3d  _STAT2.  if( rc=
4e90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 73  =SQLITE_OK && !s
4ea0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
4eb0: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
4ec0: 32 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62  2", sInfo.zDatab
4ed0: 61 73 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ase) ){.    rc =
4ee0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4ef0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4f00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
4f10: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
4f20: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 7a 53 71 6c  t = 0;..    zSql
4f30: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
4f40: 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22  f(db, .        "
4f50: 53 45 4c 45 43 54 20 69 64 78 2c 73 61 6d 70 6c  SELECT idx,sampl
4f60: 65 6e 6f 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20  eno,sample FROM 
4f70: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 32 22  %Q.sqlite_stat2"
4f80: 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73  , sInfo.zDatabas
4f90: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71  e);.    if( !zSq
4fa0: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
4fb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
4fd0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
4fe0: 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  are(db, zSql, -1
4ff0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
5000: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5010: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  e(db, zSql);.   
5020: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
5030: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5040: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
5050: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
5060: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
5070: 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65       char *zInde
5080: 78 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  x = (char *)sqli
5090: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
50a0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
50b0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
50c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
50d0: 78 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20 73 49  x(db, zIndex, sI
50e0: 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  nfo.zDatabase);.
50f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
5100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
5110: 74 20 69 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69  t iSample = sqli
5120: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
5130: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
5140: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4d      sqlite3 *dbM
5150: 65 6d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  em = pIdx->pTabl
5160: 65 2d 3e 64 62 4d 65 6d 3b 0a 20 20 20 20 20 20  e->dbMem;.      
5170: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 4d 65      assert( dbMe
5180: 6d 3d 3d 64 62 20 7c 7c 20 64 62 4d 65 6d 3d 3d  m==db || dbMem==
5190: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
51a0: 66 28 20 69 53 61 6d 70 6c 65 3c 53 51 4c 49 54  f( iSample<SQLIT
51b0: 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20  E_INDEX_SAMPLES 
51c0: 26 26 20 69 53 61 6d 70 6c 65 3e 3d 30 20 29 7b  && iSample>=0 ){
51d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
51e0: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
51f0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
5200: 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 2);..       
5210: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
5220: 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  Sample==0 ){.   
5230: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69             stati
5240: 63 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 20 3d  c const int sz =
5250: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d   sizeof(IndexSam
5260: 70 6c 65 29 2a 53 51 4c 49 54 45 5f 49 4e 44 45  ple)*SQLITE_INDE
5270: 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 20  X_SAMPLES;.     
5280: 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61           pIdx->a
5290: 53 61 6d 70 6c 65 20 3d 20 28 49 6e 64 65 78 53  Sample = (IndexS
52a0: 61 6d 70 6c 65 20 2a 29 73 71 6c 69 74 65 33 44  ample *)sqlite3D
52b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 4d 65  bMallocZero(dbMe
52c0: 6d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  m, sz);.        
52d0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
52e0: 61 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20  aSample==0 ){.  
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
5300: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
5310: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
5320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5330: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5340: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
5350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
5360: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 29 3b 0a 20  dx->aSample );. 
5370: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
5380: 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
5390: 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 20  Sample *pSample 
53a0: 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  = &pIdx->aSample
53b0: 5b 69 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 20  [iSample];.     
53c0: 20 20 20 20 20 20 20 20 20 70 53 61 6d 70 6c 65           pSample
53d0: 2d 3e 65 54 79 70 65 20 3d 20 28 75 38 29 65 54  ->eType = (u8)eT
53e0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ype;.           
53f0: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
5400: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20  LITE_INTEGER || 
5410: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c  eType==SQLITE_FL
5420: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
5430: 20 20 20 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e         pSample->
5440: 75 2e 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  u.r = sqlite3_co
5450: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
5460: 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 2);.         
5470: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
5480: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
5490: 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  T || eType==SQLI
54a0: 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  TE_BLOB ){.     
54b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
54c0: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
54d0: 74 20 63 68 61 72 20 2a 29 28 0a 20 20 20 20 20  t char *)(.     
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
54f0: 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c  eType==SQLITE_BL
5500: 4f 42 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20  OB) ?.          
5510: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5520: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
5530: 74 6d 74 2c 20 32 29 3a 0a 20 20 20 20 20 20 20  tmt, 2):.       
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5550: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5560: 28 70 53 74 6d 74 2c 20 32 29 0a 20 20 20 20 20  (pStmt, 2).     
5570: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
5590: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  t n = sqlite3_co
55a0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
55b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
55c0: 20 20 20 20 20 20 69 66 28 20 6e 3e 32 34 20 29        if( n>24 )
55d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
55e0: 20 20 20 20 6e 20 3d 20 32 34 3b 0a 20 20 20 20      n = 24;.    
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
5610: 61 6d 70 6c 65 2d 3e 6e 42 79 74 65 20 3d 20 28  ample->nByte = (
5620: 75 38 29 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  u8)n;.          
5630: 20 20 20 20 20 20 69 66 28 20 6e 20 3c 20 31 29        if( n < 1)
5640: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5650: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 75 2e 7a      pSample->u.z
5660: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
5670: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5690: 53 61 6d 70 6c 65 2d 3e 75 2e 7a 20 3d 20 73 71  Sample->u.z = sq
56a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
56b0: 28 64 62 4d 65 6d 2c 20 6e 29 3b 0a 20 20 20 20  (dbMem, n);.    
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
56d0: 28 20 70 53 61 6d 70 6c 65 2d 3e 75 2e 7a 20 29  ( pSample->u.z )
56e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
56f0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53 61        memcpy(pSa
5700: 6d 70 6c 65 2d 3e 75 2e 7a 2c 20 7a 2c 20 6e 29  mple->u.z, z, n)
5710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5740: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5750: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
5760: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
57a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
57b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
57c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
57d0: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
57e0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
57f0: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tmt);.    }.  }.
5800: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
5810: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
5820: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
5830: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
5840: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5850: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5860: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a  E_OMIT_ANALYZE *
5870: 2f 0a                                            /.