/ Hex Artifact Content
Login

Artifact a038162344265ac21dfb24b3fcc06c666ebb9c07:


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 20 3d 20  */.  int addr = 
10f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
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 6a 5a 65 72  on */.  int jZer
1130: 6f 52 6f 77 73 20 3d 20 30 3b 20 20 20 20 20 20  oRows = 0;      
1140: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f       /* Jump fro
1150: 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72  m here if number
1160: 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f   of rows is zero
1170: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
11a0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
11b0: 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  ng pTab */.  int
11c0: 20 72 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d   regTabname = iM
11d0: 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67  em++;     /* Reg
11e0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
11f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1200: 20 69 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20   int regIdxname 
1210: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a  = iMem++;     /*
1220: 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   Register contai
1230: 6e 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20  ning index name 
1240: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 61 6d 70  */.  int regSamp
1250: 6c 65 6e 6f 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  leno = iMem++;  
1260: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
1270: 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74 20 73 61  ntaining next sa
1280: 6d 70 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  mple number */. 
1290: 20 69 6e 74 20 72 65 67 43 6f 6c 20 3d 20 69 4d   int regCol = iM
12a0: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 2f 2a  em++;         /*
12b0: 20 43 6f 6e 74 65 6e 74 20 6f 66 20 61 20 63 6f   Content of a co
12c0: 6c 75 6d 6e 20 61 6e 61 6c 79 7a 65 64 20 74 61  lumn analyzed ta
12d0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
12e0: 52 65 63 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  Rec = iMem++;   
12f0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1300: 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6d 70 6c 65  r holding comple
1310: 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ted record */.  
1320: 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 69 4d  int regTemp = iM
1330: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20  em++;        /* 
1340: 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
1350: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1360: 72 65 67 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b  regRowid = iMem+
1370: 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  +;       /* Rowi
1380: 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74  d for the insert
1390: 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 23 69  ed record */..#i
13a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
13b0: 4c 45 5f 53 54 41 54 32 0a 20 20 69 6e 74 20 72  LE_STAT2.  int r
13c0: 65 67 54 65 6d 70 32 20 3d 20 69 4d 65 6d 2b 2b  egTemp2 = iMem++
13d0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f  ;       /* Tempo
13e0: 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
13f0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 61  r */.  int regSa
1400: 6d 70 6c 65 72 65 63 6e 6f 20 3d 20 69 4d 65 6d  mplerecno = iMem
1410: 2b 2b 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  ++; /* Index of 
1420: 6e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 72  next sample to r
1430: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72  ecord */.  int r
1440: 65 67 52 65 63 6e 6f 20 3d 20 69 4d 65 6d 2b 2b  egRecno = iMem++
1450: 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  ;       /* Curre
1460: 6e 74 20 73 61 6d 70 6c 65 20 69 6e 64 65 78 20  nt sample index 
1470: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 61 73 74  */.  int regLast
1480: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
1490: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 61    /* Index of la
14a0: 73 74 20 73 61 6d 70 6c 65 20 74 6f 20 72 65 63  st sample to rec
14b0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ord */.  int reg
14c0: 46 69 72 73 74 20 3d 20 69 4d 65 6d 2b 2b 3b 20  First = iMem++; 
14d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
14e0: 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74  f first sample t
14f0: 6f 20 72 65 63 6f 72 64 20 2a 2f 0a 23 65 6e 64  o record */.#end
1500: 69 66 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  if..  v = sqlite
1510: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1520: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
1530: 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29  NEVER(pTab==0) )
1540: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1550: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e  }.  if( pTab->tn
1560: 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  um==0 ){.    /* 
1570: 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73 74  Do not gather st
1580: 61 74 69 73 74 69 63 73 20 6f 6e 20 76 69 65 77  atistics on view
1590: 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
15a0: 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  les */.    retur
15b0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d  n;.  }.  if( mem
15c0: 63 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  cmp(pTab->zName,
15d0: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
15e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  0 ){.    /* Do n
15f0: 6f 74 20 67 61 74 68 65 72 20 73 74 61 74 69 73  ot gather statis
1600: 74 69 63 73 20 6f 6e 20 73 79 73 74 65 6d 20 74  tics on system t
1610: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  ables */.    ret
1620: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
1630: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1640: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
1650: 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  b) );.  iDb = sq
1660: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1670: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
1680: 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
1690: 20 69 44 62 3e 3d 30 20 29 3b 0a 23 69 66 6e 64   iDb>=0 );.#ifnd
16a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16b0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
16c0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16d0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16e0: 54 45 5f 41 4e 41 4c 59 5a 45 2c 20 70 54 61 62  TE_ANALYZE, pTab
16f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
1700: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1710: 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
1720: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
1730: 0a 0a 20 20 2f 2a 20 45 73 74 61 62 6c 69 73 68  ..  /* Establish
1740: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
1750: 74 68 65 20 74 61 62 6c 65 20 61 74 20 74 68 65  the table at the
1760: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6c 65   shared-cache le
1770: 76 65 6c 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  vel. */.  sqlite
1780: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
1790: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
17a0: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
17b0: 6d 65 29 3b 0a 0a 20 20 69 49 64 78 43 75 72 20  me);..  iIdxCur 
17c0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
17d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
17f0: 6e 67 38 2c 20 30 2c 20 72 65 67 54 61 62 6e 61  ng8, 0, regTabna
1800: 6d 65 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  me, 0, pTab->zNa
1810: 6d 65 2c 20 30 29 3b 0a 20 20 66 6f 72 28 70 49  me, 0);.  for(pI
1820: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1830: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
1840: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1850: 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e  t nCol = pIdx->n
1860: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 4b 65 79 49  Column;.    KeyI
1870: 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  nfo *pKey = sqli
1880: 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
1890: 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 0a  pParse, pIdx);..
18a0: 20 20 20 20 69 66 28 20 69 4d 65 6d 2b 31 2b 28      if( iMem+1+(
18b0: 6e 43 6f 6c 2a 32 29 3e 70 50 61 72 73 65 2d 3e  nCol*2)>pParse->
18c0: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 50  nMem ){.      pP
18d0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 69 4d 65  arse->nMem = iMe
18e0: 6d 2b 31 2b 28 6e 43 6f 6c 2a 32 29 3b 0a 20 20  m+1+(nCol*2);.  
18f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e    }..    /* Open
1900: 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65   a cursor to the
1910: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 61 6e 61   index to be ana
1920: 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73  lyzed. */.    as
1930: 73 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69 74  sert( iDb==sqlit
1940: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1950: 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  db, pIdx->pSchem
1960: 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a) );.    sqlite
1970: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1980: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
1990: 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Cur, pIdx->tnum,
19a0: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 28 63   iDb,.        (c
19b0: 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  har *)pKey, P4_K
19c0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
19d0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
19e0: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
19f0: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
1a00: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 72  * Populate the r
1a10: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
1a20: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  ng the index nam
1a30: 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1a40: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1a50: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65  P_String8, 0, re
1a60: 67 49 64 78 6e 61 6d 65 2c 20 30 2c 20 70 49 64  gIdxname, 0, pId
1a70: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 23  x->zName, 0);..#
1a80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a90: 42 4c 45 5f 53 54 41 54 32 0a 0a 20 20 20 20 2f  BLE_STAT2..    /
1aa0: 2a 20 49 66 20 74 68 69 73 20 69 74 65 72 61 74  * If this iterat
1ab0: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
1ac0: 69 73 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  is generating co
1ad0: 64 65 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  de to analyze th
1ae0: 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69  e.    ** first i
1af0: 6e 64 65 78 20 69 6e 20 74 68 65 20 70 54 61 62  ndex in the pTab
1b00: 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74 2c 20 74  ->pIndex list, t
1b10: 68 65 6e 20 72 65 67 69 73 74 65 72 20 72 65 67  hen register reg
1b20: 4c 61 73 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  Last has.    ** 
1b30: 6e 6f 74 20 62 65 65 6e 20 70 6f 70 75 6c 61 74  not been populat
1b40: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
1b50: 20 70 6f 70 75 6c 61 74 65 20 69 74 20 6e 6f 77   populate it now
1b60: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  .  */.    if( pT
1b70: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 64 78  ab->pIndex==pIdx
1b80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ba0: 50 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c 49 54  P_Integer, SQLIT
1bb0: 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2c  E_INDEX_SAMPLES,
1bc0: 20 72 65 67 53 61 6d 70 6c 65 72 65 63 6e 6f 29   regSamplerecno)
1bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1be0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1bf0: 49 6e 74 65 67 65 72 2c 20 53 51 4c 49 54 45 5f  Integer, SQLITE_
1c00: 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2a 32 2d  INDEX_SAMPLES*2-
1c10: 31 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20  1, regTemp);.   
1c20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1c40: 65 72 2c 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  er, SQLITE_INDEX
1c50: 5f 53 41 4d 50 4c 45 53 2a 32 2c 20 72 65 67 54  _SAMPLES*2, regT
1c60: 65 6d 70 32 29 3b 0a 0a 20 20 20 20 20 20 73 71  emp2);..      sq
1c70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c80: 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64  v, OP_Count, iId
1c90: 78 43 75 72 2c 20 72 65 67 4c 61 73 74 29 3b 0a  xCur, regLast);.
1ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1cb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1cc0: 6c 6c 2c 20 30 2c 20 72 65 67 46 69 72 73 74 29  ll, 0, regFirst)
1cd0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
1ce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cf0: 28 76 2c 20 4f 50 5f 4c 74 2c 20 72 65 67 53 61  (v, OP_Lt, regSa
1d00: 6d 70 6c 65 72 65 63 6e 6f 2c 20 30 2c 20 72 65  mplerecno, 0, re
1d10: 67 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 73 71  gLast);.      sq
1d20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d30: 76 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20 72 65  v, OP_Divide, re
1d40: 67 54 65 6d 70 32 2c 20 72 65 67 4c 61 73 74 2c  gTemp2, regLast,
1d50: 20 72 65 67 46 69 72 73 74 29 3b 0a 20 20 20 20   regFirst);.    
1d60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d70: 4f 70 33 28 76 2c 20 4f 50 5f 4d 75 6c 74 69 70  Op3(v, OP_Multip
1d80: 6c 79 2c 20 72 65 67 4c 61 73 74 2c 20 72 65 67  ly, regLast, reg
1d90: 54 65 6d 70 2c 20 72 65 67 4c 61 73 74 29 3b 0a  Temp, regLast);.
1da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1db0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
1dc0: 64 49 6d 6d 2c 20 72 65 67 4c 61 73 74 2c 20 53  dImm, regLast, S
1dd0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
1de0: 4c 45 53 2a 32 2d 32 29 3b 0a 20 20 20 20 20 20  LES*2-2);.      
1df0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e00: 33 28 76 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20  3(v, OP_Divide, 
1e10: 20 72 65 67 54 65 6d 70 32 2c 20 72 65 67 4c 61   regTemp2, regLa
1e20: 73 74 2c 20 72 65 67 4c 61 73 74 29 3b 0a 20 20  st, regLast);.  
1e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1e40: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
1e50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e60: 5a 65 72 6f 20 74 68 65 20 72 65 67 53 61 6d 70  Zero the regSamp
1e70: 6c 65 6e 6f 20 61 6e 64 20 72 65 67 52 65 63 6e  leno and regRecn
1e80: 6f 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  o registers. */.
1e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ea0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1eb0: 67 65 72 2c 20 30 2c 20 72 65 67 53 61 6d 70 6c  ger, 0, regSampl
1ec0: 65 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eno);.    sqlite
1ed0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ee0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1ef0: 67 52 65 63 6e 6f 29 3b 0a 20 20 20 20 73 71 6c  gRecno);.    sql
1f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f10: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 46 69  , OP_Copy, regFi
1f20: 72 73 74 2c 20 72 65 67 53 61 6d 70 6c 65 72 65  rst, regSamplere
1f30: 63 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  cno);.#endif..  
1f40: 20 20 2f 2a 20 54 68 65 20 62 6c 6f 63 6b 20 6f    /* The block o
1f50: 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69  f memory cells i
1f60: 6e 69 74 69 61 6c 69 7a 65 64 20 68 65 72 65 20  nitialized here 
1f70: 69 73 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  is used as follo
1f80: 77 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws..    **.    *
1f90: 2a 20 20 20 20 69 4d 65 6d 3a 20 20 20 20 20 20  *    iMem:      
1fa0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 2a            .    *
1fb0: 2a 20 20 20 20 20 20 20 20 54 68 65 20 74 6f 74  *        The tot
1fc0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
1fd0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
1fe0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1ff0: 20 69 4d 65 6d 2b 31 20 2e 2e 20 69 4d 65 6d 2b   iMem+1 .. iMem+
2000: 6e 43 6f 6c 3a 20 0a 20 20 20 20 2a 2a 20 20 20  nCol: .    **   
2010: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 64       Number of d
2020: 69 73 74 69 6e 63 74 20 65 6e 74 72 69 65 73 20  istinct entries 
2030: 69 6e 20 69 6e 64 65 78 20 63 6f 6e 73 69 64 65  in index conside
2040: 72 69 6e 67 20 74 68 65 20 0a 20 20 20 20 2a 2a  ring the .    **
2050: 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73          left-mos
2060: 74 20 4e 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79  t N columns only
2070: 2c 20 77 68 65 72 65 20 4e 20 69 73 20 62 65 74  , where N is bet
2080: 77 65 65 6e 20 31 20 61 6e 64 20 6e 43 6f 6c 2c  ween 1 and nCol,
2090: 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
20a0: 69 6e 63 6c 75 73 69 76 65 2e 0a 20 20 20 20 2a  inclusive..    *
20b0: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 4d 65 6d  *.    **    iMem
20c0: 2b 6e 43 6f 6c 2b 31 20 2e 2e 20 4d 65 6d 2b 32  +nCol+1 .. Mem+2
20d0: 2a 6e 43 6f 6c 3a 20 20 0a 20 20 20 20 2a 2a 20  *nCol:  .    ** 
20e0: 20 20 20 20 20 20 20 50 72 65 76 69 6f 75 73 20         Previous 
20f0: 76 61 6c 75 65 20 6f 66 20 69 6e 64 65 78 65 64  value of indexed
2100: 20 63 6f 6c 75 6d 6e 73 2c 20 66 72 6f 6d 20 6c   columns, from l
2110: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 20 20  eft to right..  
2120: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 65 6c 6c    **.    ** Cell
2130: 73 20 69 4d 65 6d 20 74 68 72 6f 75 67 68 20 69  s iMem through i
2140: 4d 65 6d 2b 6e 43 6f 6c 20 61 72 65 20 69 6e 69  Mem+nCol are ini
2150: 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 2e 20 54  tialized to 0. T
2160: 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 0a 20  he others are . 
2170: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
2180: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20  d to contain an 
2190: 53 51 4c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f  SQL NULL..    */
21a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21b0: 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  =nCol; i++){.   
21c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
21e0: 65 72 2c 20 30 2c 20 69 4d 65 6d 2b 69 29 3b 0a  er, 0, iMem+i);.
21f0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
2200: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
2210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2220: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
2230: 75 6c 6c 2c 20 30 2c 20 69 4d 65 6d 2b 6e 43 6f  ull, 0, iMem+nCo
2240: 6c 2b 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  l+i+1);.    }.. 
2250: 20 20 20 2f 2a 20 53 74 61 72 74 20 74 68 65 20     /* Start the 
2260: 61 6e 61 6c 79 73 69 73 20 6c 6f 6f 70 2e 20 54  analysis loop. T
2270: 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 74 68  his loop runs th
2280: 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65 6e  rough all the en
2290: 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
22a0: 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
22b0: 2e 20 20 2a 2f 0a 20 20 20 20 65 6e 64 4f 66 4c  .  */.    endOfL
22c0: 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
22d0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
2300: 64 2c 20 69 49 64 78 43 75 72 2c 20 65 6e 64 4f  d, iIdxCur, endO
2310: 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 74 6f 70 4f  fLoop);.    topO
2320: 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
2330: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2340: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2350: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
2360: 64 64 49 6d 6d 2c 20 69 4d 65 6d 2c 20 31 29 3b  ddImm, iMem, 1);
2370: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
2380: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
2390: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
23a0: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
23b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
23c0: 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72  _Column, iIdxCur
23d0: 2c 20 69 2c 20 72 65 67 43 6f 6c 29 3b 0a 20 20  , i, regCol);.  
23e0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
23f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2400: 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20 20 20  ABLE_STAT2.     
2410: 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
2420: 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 63  he record that c
2430: 75 72 73 6f 72 20 69 49 64 78 43 75 72 20 70 6f  ursor iIdxCur po
2440: 69 6e 74 73 20 74 6f 20 63 6f 6e 74 61 69 6e 73  ints to contains
2450: 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61   a.        ** va
2460: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
2470: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
2480: 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74 61   sqlite_stat2 ta
2490: 62 6c 65 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20  ble. If so,.    
24a0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 2e      ** store it.
24b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
24c0: 20 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62   ne = sqlite3Vdb
24d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
24e0: 2c 20 72 65 67 52 65 63 6e 6f 2c 20 30 2c 20 72  , regRecno, 0, r
24f0: 65 67 53 61 6d 70 6c 65 72 65 63 6e 6f 29 3b 0a  egSamplerecno);.
2500: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2510: 72 65 67 54 61 62 6e 61 6d 65 2b 31 3d 3d 72 65  regTabname+1==re
2520: 67 49 64 78 6e 61 6d 65 20 0a 20 20 20 20 20 20  gIdxname .      
2530: 20 20 20 20 20 20 20 26 26 20 72 65 67 54 61 62         && regTab
2540: 6e 61 6d 65 2b 32 3d 3d 72 65 67 53 61 6d 70 6c  name+2==regSampl
2550: 65 6e 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20  eno.            
2560: 20 26 26 20 72 65 67 54 61 62 6e 61 6d 65 2b 33   && regTabname+3
2570: 3d 3d 72 65 67 43 6f 6c 0a 20 20 20 20 20 20 20  ==regCol.       
2580: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
2590: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
25a0: 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  v, SQLITE_JUMPIF
25b0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 73  NULL);.        s
25c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25d0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
25e0: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 34  d, regTabname, 4
25f0: 2c 20 72 65 67 52 65 63 2c 20 22 61 61 61 62 22  , regRec, "aaab"
2600: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2620: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
2630: 69 53 74 61 74 43 75 72 2b 31 2c 20 72 65 67 52  iStatCur+1, regR
2640: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 73  owid);.        s
2650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2660: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
2670: 53 74 61 74 43 75 72 2b 31 2c 20 72 65 67 52 65  StatCur+1, regRe
2680: 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  c, regRowid);.. 
2690: 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c         /* Calcul
26a0: 61 74 65 20 6e 65 77 20 76 61 6c 75 65 73 20 66  ate new values f
26b0: 6f 72 20 72 65 67 53 61 6d 70 6c 65 72 65 63 6e  or regSamplerecn
26c0: 6f 20 61 6e 64 20 72 65 67 53 61 6d 70 6c 65 6e  o and regSamplen
26d0: 6f 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  o..        **.  
26e0: 20 20 20 20 20 20 2a 2a 20 20 20 73 61 6d 70 6c        **   sampl
26f0: 65 6e 6f 20 3d 20 73 61 6d 70 6c 65 6e 6f 20 2b  eno = sampleno +
2700: 20 31 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20   1.        **   
2710: 73 61 6d 70 6c 65 72 65 63 6e 6f 20 3d 20 73 61  samplerecno = sa
2720: 6d 70 6c 65 72 65 63 6e 6f 2b 28 72 65 6d 61 69  mplerecno+(remai
2730: 6e 69 6e 67 20 72 65 63 6f 72 64 73 29 2f 28 72  ning records)/(r
2740: 65 6d 61 69 6e 69 6e 67 20 73 61 6d 70 6c 65 73  emaining samples
2750: 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ).        */.   
2760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2770: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
2780: 49 6d 6d 2c 20 72 65 67 53 61 6d 70 6c 65 6e 6f  Imm, regSampleno
2790: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
27a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
27b0: 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
27c0: 72 65 67 52 65 63 6e 6f 2c 20 72 65 67 4c 61 73  regRecno, regLas
27d0: 74 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20  t, regTemp);.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
2800: 49 6d 6d 2c 20 72 65 67 54 65 6d 70 2c 20 2d 31  Imm, regTemp, -1
2810: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2820: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2830: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c 49  OP_Integer, SQLI
2840: 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
2850: 2c 20 72 65 67 54 65 6d 70 32 29 3b 0a 20 20 20  , regTemp2);.   
2860: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2870: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
2880: 74 72 61 63 74 2c 20 72 65 67 53 61 6d 70 6c 65  tract, regSample
2890: 6e 6f 2c 20 72 65 67 54 65 6d 70 32 2c 20 72 65  no, regTemp2, re
28a0: 67 54 65 6d 70 32 29 3b 0a 20 20 20 20 20 20 20  gTemp2);.       
28b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28c0: 70 33 28 76 2c 20 4f 50 5f 44 69 76 69 64 65 2c  p3(v, OP_Divide,
28d0: 20 72 65 67 54 65 6d 70 32 2c 20 72 65 67 54 65   regTemp2, regTe
28e0: 6d 70 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20  mp, regTemp);.  
28f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2900: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
2910: 64 2c 20 72 65 67 53 61 6d 70 6c 65 72 65 63 6e  d, regSamplerecn
2920: 6f 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 53  o, regTemp, regS
2930: 61 6d 70 6c 65 72 65 63 6e 6f 29 3b 0a 0a 20 20  amplerecno);..  
2940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2950: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6e 65 29  eJumpHere(v, ne)
2960: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2970: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2980: 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 52 65 63  P_AddImm, regRec
2990: 6e 6f 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a  no, 1);.#endif..
29a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79          /* Alway
29b0: 73 20 72 65 63 6f 72 64 20 74 68 65 20 76 65 72  s record the ver
29c0: 79 20 66 69 72 73 74 20 72 6f 77 20 2a 2f 0a 20  y first row */. 
29d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
29e0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
29f0: 66 4e 6f 74 2c 20 69 4d 65 6d 2b 31 29 3b 0a 20  fNot, iMem+1);. 
2a00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2a10: 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
2a20: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
2a30: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f  sert( pIdx->azCo
2a40: 6c 6c 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 20 20  ll[i]!=0 );.    
2a50: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2a60: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
2a70: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 7a 43  Parse, pIdx->azC
2a80: 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  oll[i]);.      s
2a90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2aa0: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 43 6f  (v, OP_Ne, regCo
2ab0: 6c 2c 20 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b  l, 0, iMem+nCol+
2ac0: 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  i+1,.           
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2ae0: 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  r*)pColl, P4_COL
2af0: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 73 71 6c  LSEQ);.      sql
2b00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2b10: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
2b20: 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Q);.    }.    if
2b30: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2b40: 65 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ed ){.      /* I
2b50: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
2b60: 72 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  re has occurred,
2b70: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
2b80: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
2b90: 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 73  on .      ** pas
2ba0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2bb0: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
2bc0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
2bd0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 29 20  3VdbeJumpHere() 
2be0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20  .      ** below 
2bf0: 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  may be negative.
2c00: 20 57 68 69 63 68 20 63 61 75 73 65 73 20 61 6e   Which causes an
2c10: 20 61 73 73 65 72 74 28 29 20 74 6f 20 66 61 69   assert() to fai
2c20: 6c 20 28 6f 72 20 61 6e 0a 20 20 20 20 20 20 2a  l (or an.      *
2c30: 2a 20 6f 75 74 2d 6f 66 2d 62 6f 75 6e 64 73 20  * out-of-bounds 
2c40: 77 72 69 74 65 20 69 66 20 53 51 4c 49 54 45 5f  write if SQLITE_
2c50: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
2c60: 69 6e 65 64 29 2e 20 20 2a 2f 0a 20 20 20 20 20  ined).  */.     
2c70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c90: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2ca0: 20 30 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a   0, endOfLoop);.
2cb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2cc0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2cd0: 20 69 6e 74 20 61 64 64 72 32 20 3d 20 73 71 6c   int addr2 = sql
2ce0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2cf0: 64 64 72 28 76 29 20 2d 20 28 6e 43 6f 6c 2a 32  ddr(v) - (nCol*2
2d00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  );.      if( i==
2d10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2d20: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2d30: 28 76 2c 20 61 64 64 72 32 2d 31 29 3b 20 20 2f  (v, addr2-1);  /
2d40: 2a 20 53 65 74 20 6a 75 6d 70 20 64 65 73 74 20  * Set jump dest 
2d50: 66 6f 72 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74  for the OP_IfNot
2d60: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2d80: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
2d90: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6a 75 6d        /* Set jum
2da0: 70 20 64 65 73 74 20 66 6f 72 20 74 68 65 20 4f  p dest for the O
2db0: 50 5f 4e 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  P_Ne */.      sq
2dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2dd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4d  v, OP_AddImm, iM
2de0: 65 6d 2b 69 2b 31 2c 20 31 29 3b 0a 20 20 20 20  em+i+1, 1);.    
2df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e00: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2e10: 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20 69 4d  , iIdxCur, i, iM
2e20: 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 29 3b 0a 20 20  em+nCol+i+1);.  
2e30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20    }..    /* End 
2e40: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  of the analysis 
2e50: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  loop. */.    sql
2e60: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2e70: 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f  abel(v, endOfLoo
2e80: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
2e90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ea0: 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2c 20 74  Next, iIdxCur, t
2eb0: 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73  opOfLoop);.    s
2ec0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2ed0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
2ee0: 64 78 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  dxCur);..    /* 
2ef0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
2f00: 73 20 69 6e 20 73 71 6c 69 74 65 5f 73 74 61 74  s in sqlite_stat
2f10: 31 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  1..    **.    **
2f20: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
2f30: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
2f40: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
2f50: 74 61 62 6c 65 2e 20 20 54 68 65 20 66 69 72 73  table.  The firs
2f60: 74 0a 20 20 20 20 2a 2a 20 74 77 6f 20 63 6f 6c  t.    ** two col
2f70: 75 6d 6e 73 20 61 72 65 20 74 68 65 20 6e 61 6d  umns are the nam
2f80: 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  es of the table 
2f90: 61 6e 64 20 69 6e 64 65 78 2e 20 20 54 68 65 20  and index.  The 
2fa0: 74 68 69 72 64 20 63 6f 6c 75 6d 6e 0a 20 20 20  third column.   
2fb0: 20 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20   ** is a string 
2fc0: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c 69  composed of a li
2fd0: 73 74 20 6f 66 20 69 6e 74 65 67 65 72 20 73 74  st of integer st
2fe0: 61 74 69 73 74 69 63 73 20 61 62 6f 75 74 20 74  atistics about t
2ff0: 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  he.    ** index.
3000: 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65    The first inte
3010: 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ger in the list 
3020: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
3030: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 0a 20  ber of entries. 
3040: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64     ** in the ind
3050: 65 78 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  ex.  There is on
3060: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74  e additional int
3070: 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74  eger in the list
3080: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
3090: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
30a0: 61 62 6c 65 2e 20 20 54 68 69 73 20 61 64 64 69  able.  This addi
30b0: 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69  tional integer i
30c0: 73 20 61 20 67 75 65 73 73 20 6f 66 20 68 6f 77  s a guess of how
30d0: 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77   many.    ** row
30e0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
30f0: 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 65  he index will se
3100: 6c 65 63 74 2e 20 20 49 66 20 44 20 69 73 20 74  lect.  If D is t
3110: 68 65 20 63 6f 75 6e 74 20 6f 66 20 64 69 73 74  he count of dist
3120: 69 6e 63 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75  inct.    ** valu
3130: 65 73 20 61 6e 64 20 4b 20 69 73 20 74 68 65 20  es and K is the 
3140: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
3150: 72 6f 77 73 2c 20 74 68 65 6e 20 74 68 65 20 69  rows, then the i
3160: 6e 74 65 67 65 72 20 69 73 20 63 6f 6d 70 75 74  nteger is comput
3170: 65 64 0a 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20  ed.    ** as:.  
3180: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
3190: 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44     I = (K+D-1)/D
31a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
31b0: 66 20 4b 3d 3d 30 20 74 68 65 6e 20 6e 6f 20 65  f K==0 then no e
31c0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 74  ntry is made int
31d0: 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  o the sqlite_sta
31e0: 74 31 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20  t1 table.  .    
31f0: 2a 2a 20 49 66 20 4b 3e 30 20 74 68 65 6e 20 69  ** If K>0 then i
3200: 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  t is always the 
3210: 63 61 73 65 20 74 68 65 20 44 3e 30 20 73 6f 20  case the D>0 so 
3220: 64 69 76 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f  division by zero
3230: 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 76 65 72  .    ** is never
3240: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a   possible..    *
3250: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
3260: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
3270: 6f 70 79 2c 20 69 4d 65 6d 2c 20 72 65 67 53 61  opy, iMem, regSa
3280: 6d 70 6c 65 6e 6f 29 3b 0a 20 20 20 20 69 66 28  mpleno);.    if(
3290: 20 6a 5a 65 72 6f 52 6f 77 73 3d 3d 30 20 29 7b   jZeroRows==0 ){
32a0: 0a 20 20 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73  .      jZeroRows
32b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
32c0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
32d0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  , iMem);.    }. 
32e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
32f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
3300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3310: 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
3320: 20 30 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c 20   0, regTemp, 0, 
3330: 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  " ", 0);.      s
3340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3350: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 72  (v, OP_Concat, r
3360: 65 67 54 65 6d 70 2c 20 72 65 67 53 61 6d 70 6c  egTemp, regSampl
3370: 65 6e 6f 2c 20 72 65 67 53 61 6d 70 6c 65 6e 6f  eno, regSampleno
3380: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3390: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
33a0: 5f 41 64 64 2c 20 69 4d 65 6d 2c 20 69 4d 65 6d  _Add, iMem, iMem
33b0: 2b 69 2b 31 2c 20 72 65 67 54 65 6d 70 29 3b 0a  +i+1, regTemp);.
33c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
33e0: 64 49 6d 6d 2c 20 72 65 67 54 65 6d 70 2c 20 2d  dImm, regTemp, -
33f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
3400: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3410: 50 5f 44 69 76 69 64 65 2c 20 69 4d 65 6d 2b 69  P_Divide, iMem+i
3420: 2b 31 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67  +1, regTemp, reg
3430: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
3440: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3450: 2c 20 4f 50 5f 54 6f 49 6e 74 2c 20 72 65 67 54  , OP_ToInt, regT
3460: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
3470: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3480: 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 72 65 67 54   OP_Concat, regT
3490: 65 6d 70 2c 20 72 65 67 53 61 6d 70 6c 65 6e 6f  emp, regSampleno
34a0: 2c 20 72 65 67 53 61 6d 70 6c 65 6e 6f 29 3b 0a  , regSampleno);.
34b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
34c0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
34d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
34e0: 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67  gTabname, 3, reg
34f0: 52 65 63 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a  Rec, "aaa", 0);.
3500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3510: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
3520: 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20  owid, iStatCur, 
3530: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  regRowid);.    s
3540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3550: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
3560: 53 74 61 74 43 75 72 2c 20 72 65 67 52 65 63 2c  StatCur, regRec,
3570: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
3580: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3590: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
35a0: 50 45 4e 44 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  PEND);.  }..  /*
35b0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
35c0: 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 63 72  s no indices, cr
35d0: 65 61 74 65 20 61 20 73 69 6e 67 6c 65 20 73 71  eate a single sq
35e0: 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79  lite_stat1 entry
35f0: 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  .  ** containing
3600: 20 4e 55 4c 4c 20 61 73 20 74 68 65 20 69 6e 64   NULL as the ind
3610: 65 78 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  ex name and the 
3620: 72 6f 77 20 63 6f 75 6e 74 20 61 73 20 74 68 65  row count as the
3630: 20 63 6f 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20   content..  */. 
3640: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
3650: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
3660: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3670: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
3680: 64 78 43 75 72 2c 20 70 54 61 62 2d 3e 74 6e 75  dxCur, pTab->tnu
3690: 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 56 64 62  m, iDb);.    Vdb
36a0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
36b0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
36c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
36d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
36e0: 75 6e 74 2c 20 69 49 64 78 43 75 72 2c 20 72 65  unt, iIdxCur, re
36f0: 67 53 61 6d 70 6c 65 6e 6f 29 3b 0a 20 20 20 20  gSampleno);.    
3700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3710: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
3720: 49 64 78 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  IdxCur);.  }else
3730: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 5a  {.    assert( jZ
3740: 65 72 6f 52 6f 77 73 3e 30 20 29 3b 0a 20 20 20  eroRows>0 );.   
3750: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3760: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
3770: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
3780: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3790: 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20  , jZeroRows);.  
37a0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
37b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
37c0: 2c 20 30 2c 20 72 65 67 49 64 78 6e 61 6d 65 29  , 0, regIdxname)
37d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
37e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
37f0: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
3800: 6d 65 2c 20 33 2c 20 72 65 67 52 65 63 2c 20 22  me, 3, regRec, "
3810: 61 61 61 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69  aaa", 0);.  sqli
3820: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3830: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53   OP_NewRowid, iS
3840: 74 61 74 43 75 72 2c 20 72 65 67 52 6f 77 69 64  tatCur, regRowid
3850: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3860: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
3870: 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72  ert, iStatCur, r
3880: 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29  egRec, regRowid)
3890: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
38a0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
38b0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 69 66 28  G_APPEND);.  if(
38c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 72 65   pParse->nMem<re
38d0: 67 52 65 63 20 29 20 70 50 61 72 73 65 2d 3e 6e  gRec ) pParse->n
38e0: 4d 65 6d 20 3d 20 72 65 67 52 65 63 3b 0a 20 20  Mem = regRec;.  
38f0: 69 66 28 20 6a 5a 65 72 6f 52 6f 77 73 20 29 7b  if( jZeroRows ){
3900: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3910: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3920: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3930: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
3940: 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  at will cause th
3950: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
3960: 64 65 78 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a  dex analysis to.
3970: 2a 2a 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  ** be loaded int
3980: 6f 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  o internal hash 
3990: 74 61 62 6c 65 73 20 77 68 65 72 65 20 69 73 20  tables where is 
39a0: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  can be used..*/.
39b0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64  static void load
39c0: 41 6e 61 6c 79 73 69 73 28 50 61 72 73 65 20 2a  Analysis(Parse *
39d0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
39e0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
39f0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
3a00: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
3a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3a20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 6f 61  AddOp1(v, OP_Loa
3a30: 64 41 6e 61 6c 79 73 69 73 2c 20 69 44 62 29 3b  dAnalysis, iDb);
3a40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
3a50: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
3a60: 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c   will do an anal
3a70: 79 73 69 73 20 6f 66 20 61 6e 20 65 6e 74 69 72  ysis of an entir
3a80: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  e database.*/.st
3a90: 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a  atic void analyz
3aa0: 65 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  eDatabase(Parse 
3ab0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
3ac0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
3ad0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
3ae0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
3af0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
3b00: 70 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53  pSchema;    /* S
3b10: 63 68 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73  chema of databas
3b20: 65 20 69 44 62 20 2a 2f 0a 20 20 48 61 73 68 45  e iDb */.  HashE
3b30: 6c 65 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53  lem *k;.  int iS
3b40: 74 61 74 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d  tatCur;.  int iM
3b50: 65 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65  em;..  sqlite3Be
3b60: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
3b70: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
3b80: 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20  );.  iStatCur = 
3b90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
3ba0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20  pParse->nTab += 
3bb0: 32 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54 61 62  2;.  openStatTab
3bc0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  le(pParse, iDb, 
3bd0: 69 53 74 61 74 43 75 72 2c 20 30 29 3b 0a 20 20  iStatCur, 0);.  
3be0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
3bf0: 4d 65 6d 2b 31 3b 0a 20 20 66 6f 72 28 6b 3d 73  Mem+1;.  for(k=s
3c00: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
3c10: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
3c20: 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ); k; k=sqliteHa
3c30: 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
3c40: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
3c50: 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
3c60: 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61  Data(k);.    ana
3c70: 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61  lyzeOneTable(pPa
3c80: 72 73 65 2c 20 70 54 61 62 2c 20 69 53 74 61 74  rse, pTab, iStat
3c90: 43 75 72 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 0a  Cur, iMem);.  }.
3ca0: 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70    loadAnalysis(p
3cb0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a  Parse, iDb);.}..
3cc0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3cd0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f  ode that will do
3ce0: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
3cf0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
3d00: 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 2e  n.** a database.
3d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3d20: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72  analyzeTable(Par
3d30: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
3d40: 65 20 2a 70 54 61 62 29 7b 0a 20 20 69 6e 74 20  e *pTab){.  int 
3d50: 69 44 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74  iDb;.  int iStat
3d60: 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cur;..  assert( 
3d70: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
3d80: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
3d90: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
3da0: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
3db0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
3dc0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
3dd0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
3de0: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
3df0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
3e00: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
3e10: 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75   iDb);.  iStatCu
3e20: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
3e30: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
3e40: 20 2b 3d 20 32 3b 0a 20 20 6f 70 65 6e 53 74 61   += 2;.  openSta
3e50: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  tTable(pParse, i
3e60: 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54  Db, iStatCur, pT
3e70: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 61 6e  ab->zName);.  an
3e80: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50  alyzeOneTable(pP
3e90: 61 72 73 65 2c 20 70 54 61 62 2c 20 69 53 74 61  arse, pTab, iSta
3ea0: 74 43 75 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  tCur, pParse->nM
3eb0: 65 6d 2b 31 29 3b 0a 20 20 6c 6f 61 64 41 6e 61  em+1);.  loadAna
3ec0: 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44  lysis(pParse, iD
3ed0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
3ee0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
3ef0: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
3f00: 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  nd.  The parser 
3f10: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
3f20: 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65  ne.** when it re
3f30: 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c  cognizes an ANAL
3f40: 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
3f50: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
3f60: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
3f80: 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  1.**        ANAL
3f90: 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20  YZE  <database> 
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
3fb0: 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e  - 2.**        AN
3fc0: 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73  ALYZE  ?<databas
3fd0: 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
3fe0: 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 3.**.** Form
3ff0: 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
4000: 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
4010: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
4020: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a  to be analyzed..
4030: 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a  ** Form 2 analyz
4040: 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74  es all indices t
4050: 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  he single databa
4060: 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72  se named..** For
4070: 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 3 analyzes all
4080: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
4090: 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
40a0: 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  ed table..*/.voi
40b0: 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65  d sqlite3Analyze
40c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
40d0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
40e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
40f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4100: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
4110: 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   iDb;.  int i;. 
4120: 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a   char *z, *zDb;.
4130: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
4140: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
4150: 6d 65 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  me;..  /* Read t
4160: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
4170: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
4180: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
4190: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
41a0: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
41b0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
41c0: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  n NULL. */.  ass
41d0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
41e0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
41f0: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
4200: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
4210: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
4220: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
4230: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
4240: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21   assert( pName2!
4250: 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20  =0 || pName1==0 
4260: 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  );.  if( pName1=
4270: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  =0 ){.    /* For
4280: 6d 20 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76  m 1:  Analyze ev
4290: 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  erything */.    
42a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
42b0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
42c0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
42d0: 6e 75 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  nue;  /* Do not 
42e0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 54 45 4d 50  analyze the TEMP
42f0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
4300: 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61     analyzeDataba
4310: 73 65 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  se(pParse, i);. 
4320: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
4330: 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b   pName2->n==0 ){
4340: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a 20  .    /* Form 2: 
4350: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61 74   Analyze the dat
4360: 61 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20 6e  abase or table n
4370: 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62 20  amed */.    iDb 
4380: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
4390: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
43a0: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
43b0: 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61       analyzeData
43c0: 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 44 62  base(pParse, iDb
43d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
43e0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e      z = sqlite3N
43f0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
4400: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
4410: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
4420: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
4430: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
4440: 65 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20  e, 0, z, 0);.   
4450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4460: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
4470: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
4480: 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65           analyze
4490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
44a0: 61 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ab);.        }. 
44b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
44c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
44d0: 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20 74 68 65  m 3: Analyze the
44e0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
44f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
4500: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
4510: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
4520: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
4530: 65 32 2c 20 26 70 54 61 62 6c 65 4e 61 6d 65 29  e2, &pTableName)
4540: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30  ;.    if( iDb>=0
4550: 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
4560: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
4570: 6d 65 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  me;.      z = sq
4580: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4590: 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d  en(db, pTableNam
45a0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20  e);.      if( z 
45b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
45c0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
45d0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
45e0: 7a 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20  z, zDb);.       
45f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4600: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  b, z);.        i
4610: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
4620: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
4630: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
4640: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4650: 20 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 0a   }.    }   .  }.
4660: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f  }../*.** Used to
4670: 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f   pass informatio
4680: 6e 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79  n from the analy
4690: 7a 65 72 20 72 65 61 64 65 72 20 74 68 72 6f 75  zer reader throu
46a0: 67 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c  gh to the.** cal
46b0: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a  lback routine..*
46c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
46d0: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e   analysisInfo an
46e0: 61 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75  alysisInfo;.stru
46f0: 63 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20  ct analysisInfo 
4700: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
4710: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4720: 44 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a  Database;.};../*
4730: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63  .** This callbac
4740: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  k is invoked onc
4750: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  e for each index
4760: 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68   when reading th
4770: 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  e.** sqlite_stat
4780: 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  1 table.  .**.**
4790: 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e       argv[0] = n
47a0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
47b0: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20  .**     argv[1] 
47c0: 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  = name of the in
47d0: 64 65 78 20 28 6d 69 67 68 74 20 62 65 20 4e 55  dex (might be NU
47e0: 4c 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  LL).**     argv[
47f0: 32 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20  2] = results of 
4800: 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e  analysis - on in
4810: 74 65 67 65 72 20 66 6f 72 20 65 61 63 68 20 63  teger for each c
4820: 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72  olumn.**.** Entr
4830: 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 61 72  ies for which ar
4840: 67 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70  gv[1]==NULL simp
4850: 6c 79 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  ly record the nu
4860: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a  mber of rows in.
4870: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
4880: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
4890: 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69 64 20  ysisLoader(void 
48a0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
48b0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
48c0: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
48d0: 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a    analysisInfo *
48e0: 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69  pInfo = (analysi
48f0: 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20  sInfo*)pData;.  
4900: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
4910: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
4920: 20 20 69 6e 74 20 69 2c 20 63 2c 20 6e 3b 0a 20    int i, c, n;. 
4930: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 3b   unsigned int v;
4940: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4950: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
4960: 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45 44  c==3 );.  UNUSED
4970: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
4980: 73 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20 69  sed, argc);..  i
4990: 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61 72  f( argv==0 || ar
49a0: 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67 76  gv[0]==0 || argv
49b0: 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  [2]==0 ){.    re
49c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
49d0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
49e0: 6e 64 54 61 62 6c 65 28 70 49 6e 66 6f 2d 3e 64  ndTable(pInfo->d
49f0: 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e 66  b, argv[0], pInf
4a00: 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  o->zDatabase);. 
4a10: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
4a20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4a30: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31    }.  if( argv[1
4a40: 5d 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20  ] ){.    pIndex 
4a50: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
4a60: 65 78 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72  ex(pInfo->db, ar
4a70: 67 76 5b 31 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44  gv[1], pInfo->zD
4a80: 61 74 61 62 61 73 65 29 3b 0a 20 20 7d 65 6c 73  atabase);.  }els
4a90: 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  e{.    pIndex = 
4aa0: 30 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 70 49 6e  0;.  }.  n = pIn
4ab0: 64 65 78 20 3f 20 70 49 6e 64 65 78 2d 3e 6e 43  dex ? pIndex->nC
4ac0: 6f 6c 75 6d 6e 20 3a 20 30 3b 0a 20 20 7a 20 3d  olumn : 0;.  z =
4ad0: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28   argv[2];.  for(
4ae0: 69 3d 30 3b 20 2a 7a 20 26 26 20 69 3c 3d 6e 3b  i=0; *z && i<=n;
4af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d 20 30   i++){.    v = 0
4b00: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d  ;.    while( (c=
4b10: 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c  z[0])>='0' && c<
4b20: 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20 76 20  ='9' ){.      v 
4b30: 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20 27 30 27  = v*10 + c - '0'
4b40: 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
4b50: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
4b60: 29 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73  ) pTable->nRowEs
4b70: 74 20 3d 20 76 3b 0a 20 20 20 20 69 66 28 20 70  t = v;.    if( p
4b80: 49 6e 64 65 78 3d 3d 30 20 29 20 62 72 65 61 6b  Index==0 ) break
4b90: 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  ;.    pIndex->ai
4ba0: 52 6f 77 45 73 74 5b 69 5d 20 3d 20 76 3b 0a 20  RowEst[i] = v;. 
4bb0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29     if( *z==' ' )
4bc0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   z++;.  }.  retu
4bd0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
4be0: 66 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d  f the Index.aSam
4bf0: 70 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20  ple variable is 
4c00: 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65  not NULL, delete
4c10: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
4c20: 72 72 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20  rray.** and its 
4c30: 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  contents..*/.voi
4c40: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49  d sqlite3DeleteI
4c50: 6e 64 65 78 53 61 6d 70 6c 65 73 28 73 71 6c 69  ndexSamples(sqli
4c60: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
4c70: 70 49 64 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pIdx){.#ifdef SQ
4c80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
4c90: 32 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53  2.  if( pIdx->aS
4ca0: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  ample ){.    int
4cb0: 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   j;.    for(j=0;
4cc0: 20 6a 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   j<SQLITE_INDEX_
4cd0: 53 41 4d 50 4c 45 53 3b 20 6a 2b 2b 29 7b 0a 20  SAMPLES; j++){. 
4ce0: 20 20 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65       IndexSample
4cf0: 20 2a 70 20 3d 20 26 70 49 64 78 2d 3e 61 53 61   *p = &pIdx->aSa
4d00: 6d 70 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  mple[j];.      i
4d10: 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 53 51 4c  f( p->eType==SQL
4d20: 49 54 45 5f 54 45 58 54 20 7c 7c 20 70 2d 3e 65  ITE_TEXT || p->e
4d30: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
4d40: 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  B ){.        sql
4d50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4d60: 2d 3e 75 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  ->u.z);.      }.
4d70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4d80: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
4d90: 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a  ->aSample);.  }.
4da0: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
4db0: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
4dc0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
4dd0: 28 70 49 64 78 29 3b 0a 23 65 6e 64 69 66 0a 7d  (pIdx);.#endif.}
4de0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
4df0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
4e00: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64  sqlite_stat1 and
4e10: 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74 61   sqlite_stat2 ta
4e20: 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e  bles. The.** con
4e30: 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f  tents of sqlite_
4e40: 73 74 61 74 31 20 61 72 65 20 75 73 65 64 20 74  stat1 are used t
4e50: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 49  o populate the I
4e60: 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a  ndex.aiRowEst[].
4e70: 2a 2a 20 61 72 72 61 79 73 2e 20 54 68 65 20 63  ** arrays. The c
4e80: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74  ontents of sqlit
4e90: 65 5f 73 74 61 74 32 20 61 72 65 20 75 73 65 64  e_stat2 are used
4ea0: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
4eb0: 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c  .** Index.aSampl
4ec0: 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a  e[] arrays..**.*
4ed0: 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * If the sqlite_
4ee0: 73 74 61 74 31 20 74 61 62 6c 65 20 69 73 20 6e  stat1 table is n
4ef0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
4f00: 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49  e database, SQLI
4f10: 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73 20 72  TE_ERROR.** is r
4f20: 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
4f30: 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66 20 53   case, even if S
4f40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
4f50: 54 32 20 77 61 73 20 64 65 66 69 6e 65 64 20 0a  T2 was defined .
4f60: 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c  ** during compil
4f70: 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 71  ation and the sq
4f80: 6c 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65  lite_stat2 table
4f90: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6e 6f 20   is present, no 
4fa0: 64 61 74 61 20 69 73 20 0a 2a 2a 20 72 65 61 64  data is .** read
4fb0: 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20   from it..**.** 
4fc0: 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
4fd0: 5f 53 54 41 54 32 20 77 61 73 20 64 65 66 69 6e  _STAT2 was defin
4fe0: 65 64 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c  ed during compil
4ff0: 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 0a 2a  ation and the .*
5000: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74  * sqlite_stat2 t
5010: 61 62 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73  able is not pres
5020: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
5030: 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  ase, SQLITE_ERRO
5040: 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  R is.** returned
5050: 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e 20 74 68  . However, in th
5060: 69 73 20 63 61 73 65 2c 20 64 61 74 61 20 69 73  is case, data is
5070: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
5080: 71 6c 69 74 65 5f 73 74 61 74 31 0a 2a 2a 20 74  qlite_stat1.** t
5090: 61 62 6c 65 20 28 69 66 20 69 74 20 69 73 20 70  able (if it is p
50a0: 72 65 73 65 6e 74 29 20 62 65 66 6f 72 65 20 72  resent) before r
50b0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
50c0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
50d0: 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e  occurs, this fun
50e0: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 65 74  ction always set
50f0: 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  s db->mallocFail
5100: 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  ed..** This mean
5110: 73 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  s if the caller 
5120: 64 6f 65 73 20 6e 6f 74 20 63 61 72 65 20 61 62  does not care ab
5130: 6f 75 74 20 6f 74 68 65 72 20 65 72 72 6f 72 73  out other errors
5140: 2c 20 74 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  , the return.** 
5150: 63 6f 64 65 20 6d 61 79 20 62 65 20 69 67 6e 6f  code may be igno
5160: 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
5170: 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28  te3AnalysisLoad(
5180: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
5190: 20 69 44 62 29 7b 0a 20 20 61 6e 61 6c 79 73 69   iDb){.  analysi
51a0: 73 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a 20 20 48  sInfo sInfo;.  H
51b0: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 63 68  ashElem *i;.  ch
51c0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
51d0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rc;..  assert( i
51e0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
51f0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
5200: 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
5210: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
5220: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
5230: 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61 44  oldsMutex(db->aD
5240: 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a 0a  b[iDb].pBt) );..
5250: 20 20 2f 2a 20 43 6c 65 61 72 20 61 6e 79 20 70    /* Clear any p
5260: 72 69 6f 72 20 73 74 61 74 69 73 74 69 63 73 20  rior statistics 
5270: 2a 2f 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  */.  for(i=sqlit
5280: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
5290: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
52a0: 2d 3e 69 64 78 48 61 73 68 29 3b 69 3b 69 3d 73  ->idxHash);i;i=s
52b0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
52c0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
52d0: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
52e0: 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71 6c 69  ata(i);.    sqli
52f0: 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
5300: 28 70 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69  (pIdx);.    sqli
5310: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
5320: 6d 70 6c 65 73 28 64 62 2c 20 70 49 64 78 29 3b  mples(db, pIdx);
5330: 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70  .    pIdx->aSamp
5340: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
5350: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
5360: 73 75 72 65 20 74 68 65 20 73 71 6c 69 74 65 5f  sure the sqlite_
5370: 73 74 61 74 31 20 74 61 62 6c 65 20 65 78 69 73  stat1 table exis
5380: 74 73 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62  ts */.  sInfo.db
5390: 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a   = db;.  sInfo.z
53a0: 44 61 74 61 62 61 73 65 20 3d 20 64 62 2d 3e 61  Database = db->a
53b0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
53c0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
53d0: 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
53e0: 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
53f0: 7a 44 61 74 61 62 61 73 65 29 3d 3d 30 20 29 7b  zDatabase)==0 ){
5400: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5410: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
5420: 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61   /* Load new sta
5430: 74 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74  tistics out of t
5440: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
5450: 74 61 62 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20  table */.  zSql 
5460: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
5470: 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  (db, .      "SEL
5480: 45 43 54 20 74 62 6c 2c 20 69 64 78 2c 20 73 74  ECT tbl, idx, st
5490: 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  at FROM %Q.sqlit
54a0: 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
54b0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
54c0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
54d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
54e0: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
54f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
5500: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61 6e 61  ec(db, zSql, ana
5510: 6c 79 73 69 73 4c 6f 61 64 65 72 2c 20 26 73 49  lysisLoader, &sI
5520: 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  nfo, 0);.    sql
5530: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
5540: 53 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  Sql);.  }...  /*
5550: 20 4c 6f 61 64 20 74 68 65 20 73 74 61 74 69 73   Load the statis
5560: 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71  tics from the sq
5570: 6c 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65  lite_stat2 table
5580: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
5590: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a  TE_ENABLE_STAT2.
55a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
55b0: 5f 4f 4b 20 26 26 20 21 73 71 6c 69 74 65 33 46  _OK && !sqlite3F
55c0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
55d0: 6c 69 74 65 5f 73 74 61 74 32 22 2c 20 73 49 6e  lite_stat2", sIn
55e0: 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 20 29 7b  fo.zDatabase) ){
55f0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5600: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
5610: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5620: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
5630: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
5640: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
5650: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
5660: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
5670: 69 64 78 2c 73 61 6d 70 6c 65 6e 6f 2c 73 61 6d  idx,sampleno,sam
5680: 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ple FROM %Q.sqli
5690: 74 65 5f 73 74 61 74 32 22 2c 20 73 49 6e 66 6f  te_stat2", sInfo
56a0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
56b0: 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20   if( !zSql ){.  
56c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
56d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
56e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
56f0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
5700: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
5710: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
5720: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
5730: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Sql);.    }..   
5740: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5750: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  OK ){.      whil
5760: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
5770: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
5780: 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  OW ){.        ch
5790: 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a  ar *zIndex;   /*
57a0: 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20   Index name */. 
57b0: 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
57c0: 64 78 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  dx;    /* Pointe
57d0: 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  r to the index o
57e0: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 20 20 20 20  bject */..      
57f0: 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72    zIndex = (char
5800: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
5810: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
5820: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d  ;.        pIdx =
5830: 20 7a 49 6e 64 65 78 20 3f 20 73 71 6c 69 74 65   zIndex ? sqlite
5840: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
5850: 49 6e 64 65 78 2c 20 73 49 6e 66 6f 2e 7a 44 61  Index, sInfo.zDa
5860: 74 61 62 61 73 65 29 20 3a 20 30 3b 0a 20 20 20  tabase) : 0;.   
5870: 20 20 20 20 20 69 66 28 20 70 49 64 78 20 29 7b       if( pIdx ){
5880: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
5890: 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33  Sample = sqlite3
58a0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
58b0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 1);.         
58c0: 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 53 51 4c   if( iSample<SQL
58d0: 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
58e0: 53 20 26 26 20 69 53 61 6d 70 6c 65 3e 3d 30 20  S && iSample>=0 
58f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
5900: 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74  nt eType = sqlit
5910: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
5920: 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20  Stmt, 2);..     
5930: 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
5940: 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20  >aSample==0 ){. 
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
5960: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a  tic const int sz
5970: 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 53   = sizeof(IndexS
5980: 61 6d 70 6c 65 29 2a 53 51 4c 49 54 45 5f 49 4e  ample)*SQLITE_IN
5990: 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20  DEX_SAMPLES;.   
59a0: 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
59b0: 3e 61 53 61 6d 70 6c 65 20 3d 20 28 49 6e 64 65  >aSample = (Inde
59c0: 78 53 61 6d 70 6c 65 20 2a 29 73 71 6c 69 74 65  xSample *)sqlite
59d0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
59e0: 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sz);.           
59f0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61     if( pIdx->aSa
5a00: 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mple==0 ){.     
5a10: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d             db->m
5a20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
5a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5a50: 20 20 20 20 20 20 7d 0a 09 20 20 20 20 20 20 6d        }..      m
5a60: 65 6d 73 65 74 28 70 49 64 78 2d 3e 61 53 61 6d  emset(pIdx->aSam
5a70: 70 6c 65 2c 20 30 2c 20 73 7a 29 3b 0a 20 20 20  ple, 0, sz);.   
5a80: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
5a90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5aa0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 29 3b  pIdx->aSample );
5ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64               Ind
5ad0: 65 78 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c  exSample *pSampl
5ae0: 65 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70  e = &pIdx->aSamp
5af0: 6c 65 5b 69 53 61 6d 70 6c 65 5d 3b 0a 20 20 20  le[iSample];.   
5b00: 20 20 20 20 20 20 20 20 20 20 20 70 53 61 6d 70             pSamp
5b10: 6c 65 2d 3e 65 54 79 70 65 20 3d 20 28 75 38 29  le->eType = (u8)
5b20: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  eType;.         
5b30: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
5b40: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c  SQLITE_INTEGER |
5b50: 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
5b60: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
5b70: 20 20 20 20 20 20 20 20 20 70 53 61 6d 70 6c 65           pSample
5b80: 2d 3e 75 2e 72 20 3d 20 73 71 6c 69 74 65 33 5f  ->u.r = sqlite3_
5b90: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53  column_double(pS
5ba0: 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  tmt, 2);.       
5bb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
5bc0: 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54   eType==SQLITE_T
5bd0: 45 58 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  EXT || eType==SQ
5be0: 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20  LITE_BLOB ){.   
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
5c00: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
5c10: 6e 73 74 20 63 68 61 72 20 2a 29 28 0a 20 20 20  nst char *)(.   
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 28 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f   (eType==SQLITE_
5c40: 42 4c 4f 42 29 20 3f 0a 20 20 20 20 20 20 20 20  BLOB) ?.        
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5c60: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
5c70: 70 53 74 6d 74 2c 20 32 29 3a 0a 20 20 20 20 20  pStmt, 2):.     
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5c90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5ca0: 78 74 28 70 53 74 6d 74 2c 20 32 29 0a 20 20 20  xt(pStmt, 2).   
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  int n = sqlite3_
5ce0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
5cf0: 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  mt, 2);.        
5d00: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 32 34          if( n>24
5d10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5d20: 20 20 20 20 20 20 6e 20 3d 20 32 34 3b 0a 20 20        n = 24;.  
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 70 53 61 6d 70 6c 65 2d 3e 6e 42 79 74 65 20 3d  pSample->nByte =
5d60: 20 28 75 38 29 6e 3b 0a 20 20 20 20 20 20 20 20   (u8)n;.        
5d70: 20 20 20 20 20 20 20 20 69 66 28 20 6e 20 3c 20          if( n < 
5d80: 31 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1){.            
5d90: 20 20 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 75        pSample->u
5da0: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .z = 0;.        
5db0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 70 53 61 6d 70 6c 65 2d 3e 75 2e 7a 20 3d 20   pSample->u.z = 
5de0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5df0: 28 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  (0, z, n);.     
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
5e10: 20 70 53 61 6d 70 6c 65 2d 3e 75 2e 7a 3d 3d 30   pSample->u.z==0
5e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5e30: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
5e40: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5e70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5ea0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5ec0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5ed0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
5ee0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
5ef0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
5f00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5f10: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 64  E_NOMEM ){.    d
5f20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5f30: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
5f40: 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66  n rc;.}...#endif
5f50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5f60: 41 4e 41 4c 59 5a 45 20 2a 2f 0a                 ANALYZE */.