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

Artifact 002e085428c9b2dda5b25f43539178d31c124525:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 4a 75 6c 79 20  /*.** 2005 July 
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f  .** This file co
0180: 6e 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f  ntains code asso
0190: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
01a0: 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
01b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59  .**.** The ANALY
01c0: 5a 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65  ZE command gathe
01d0: 72 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f  r statistics abo
01e0: 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
01f0: 66 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20  f tables.** and 
0200: 69 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20  indices.  These 
0210: 73 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d  statistics are m
0220: 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ade available to
0230: 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e   the query plann
0240: 65 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74  er.** to help it
0250: 20 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63   make better dec
0260: 69 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77  isions about how
0270: 20 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72   to perform quer
0280: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ies..**.** The f
0290: 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
02a0: 74 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61  tables are or ha
02b0: 76 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65  ve been supporte
02c0: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  d:.**.**    CREA
02d0: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
02e0: 73 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20  stat1(tbl, idx, 
02f0: 73 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45  stat);.**    CRE
0300: 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65  ATE TABLE sqlite
0310: 5f 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c  _stat2(tbl, idx,
0320: 20 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c   sampleno, sampl
0330: 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  e);.**    CREATE
0340: 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74   TABLE sqlite_st
0350: 61 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45  at3(tbl, idx, nE
0360: 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61  q, nLt, nDLt, sa
0370: 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41 64 64  mple);.**.** Add
0380: 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73 20 6d  itional tables m
0390: 69 67 68 74 20 62 65 20 61 64 64 65 64 20 69 6e  ight be added in
03a0: 20 66 75 74 75 72 65 20 72 65 6c 65 61 73 65 73   future releases
03b0: 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 54   of SQLite..** T
03c0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20  he sqlite_stat2 
03d0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63 72 65  table is not cre
03e0: 61 74 65 64 20 6f 72 20 75 73 65 64 20 75 6e 6c  ated or used unl
03f0: 65 73 73 20 74 68 65 20 53 51 4c 69 74 65 20 76  ess the SQLite v
0400: 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62 65 74  ersion.** is bet
0410: 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e 64 20  ween 3.6.18 and 
0420: 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69 76 65  3.7.8, inclusive
0430: 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53 51 4c  , and unless SQL
0440: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 0a  ite is compiled.
0450: 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45  ** with SQLITE_E
0460: 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20 54 68  NABLE_STAT2.  Th
0470: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32 20 74  e sqlite_stat2 t
0480: 61 62 6c 65 20 69 73 20 64 65 70 72 65 63 61 74  able is deprecat
0490: 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ed..** The sqlit
04a0: 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20 69 73  e_stat2 table is
04b0: 20 73 75 70 65 72 63 65 64 65 64 20 62 79 20 73   superceded by s
04c0: 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77 68 69  qlite_stat3, whi
04d0: 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 63 72  ch is only.** cr
04e0: 65 61 74 65 64 20 61 6e 64 20 75 73 65 64 20 62  eated and used b
04f0: 79 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  y SQLite version
0500: 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61 74 65  s 3.7.9 and late
0510: 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20 53 51  r and with.** SQ
0520: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
0530: 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  3 defined.  The 
0540: 66 75 63 6e 74 69 6f 6e 61 6c 69 74 79 20 6f 66  fucntionality of
0550: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a 2a 2a   sqlite_stat3.**
0560: 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f   is a superset o
0570: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32 2e 20  f sqlite_stat2. 
0580: 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 6f   .**.** Format o
0590: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 31 3a 0a  f sqlite_stat1:.
05a0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e  **.** There is n
05b0: 6f 72 6d 61 6c 6c 79 20 6f 6e 65 20 72 6f 77 20  ormally one row 
05c0: 70 65 72 20 69 6e 64 65 78 2c 20 77 69 74 68 20  per index, with 
05d0: 74 68 65 20 69 6e 64 65 78 20 69 64 65 6e 74 69  the index identi
05e0: 66 69 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 6e  fied by the.** n
05f0: 61 6d 65 20 69 6e 20 74 68 65 20 69 64 78 20 63  ame in the idx c
0600: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 74 62 6c 20  olumn.  The tbl 
0610: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 6e 61  column is the na
0620: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
0630: 74 6f 0a 2a 2a 20 77 68 69 63 68 20 74 68 65 20  to.** which the 
0640: 69 6e 64 65 78 20 62 65 6c 6f 6e 67 73 2e 20 20  index belongs.  
0650: 49 6e 20 65 61 63 68 20 73 75 63 68 20 72 6f 77  In each such row
0660: 2c 20 74 68 65 20 73 74 61 74 20 63 6f 6c 75 6d  , the stat colum
0670: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 61 20 73  n will be.** a s
0680: 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67  tring consisting
0690: 20 6f 66 20 61 20 6c 69 73 74 20 6f 66 20 69 6e   of a list of in
06a0: 74 65 67 65 72 73 2e 20 20 54 68 65 20 66 69 72  tegers.  The fir
06b0: 73 74 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68  st integer in th
06c0: 69 73 0a 2a 2a 20 6c 69 73 74 20 69 73 20 74 68  is.** list is th
06d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
06e0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 6e   in the index an
06f0: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  d in the table. 
0700: 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 69   The second.** i
0710: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 61 76  nteger is the av
0720: 65 72 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20  erage number of 
0730: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
0740: 78 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  x that have the 
0750: 73 61 6d 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e  same.** value in
0760: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
0770: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
0780: 20 54 68 65 20 74 68 69 72 64 20 69 6e 74 65 67   The third integ
0790: 65 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67  er is the averag
07a0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
07b0: 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
07c0: 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20 73   that have the s
07d0: 61 6d 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ame value for th
07e0: 65 20 66 69 72 73 74 20 74 77 6f 0a 2a 2a 20 63  e first two.** c
07f0: 6f 6c 75 6d 6e 73 2e 20 20 54 68 65 20 4e 2d 74  olumns.  The N-t
0800: 68 20 69 6e 74 65 67 65 72 20 28 66 6f 72 20 4e  h integer (for N
0810: 3e 31 29 20 69 73 20 74 68 65 20 61 76 65 72 61  >1) is the avera
0820: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ge number of row
0830: 73 20 69 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64  s in .** the ind
0840: 65 78 20 77 68 69 63 68 20 68 61 76 65 20 74 68  ex which have th
0850: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 66 6f 72  e same value for
0860: 20 74 68 65 20 66 69 72 73 74 20 4e 2d 31 20 63   the first N-1 c
0870: 6f 6c 75 6d 6e 73 2e 20 20 46 6f 72 0a 2a 2a 20  olumns.  For.** 
0880: 61 20 4b 2d 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  a K-column index
0890: 2c 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20  , there will be 
08a0: 4b 2b 31 20 69 6e 74 65 67 65 72 73 20 69 6e 20  K+1 integers in 
08b0: 74 68 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e 2e  the stat column.
08c0: 20 20 49 66 0a 2a 2a 20 74 68 65 20 69 6e 64 65    If.** the inde
08d0: 78 20 69 73 20 75 6e 69 71 75 65 2c 20 74 68 65  x is unique, the
08e0: 6e 20 74 68 65 20 6c 61 73 74 20 69 6e 74 65 67  n the last integ
08f0: 65 72 20 77 69 6c 6c 20 62 65 20 31 2e 0a 2a 2a  er will be 1..**
0900: 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
0910: 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20  integers in the 
0920: 73 74 61 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  stat column can 
0930: 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 66 6f  optionally be fo
0940: 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 74 68 65  llowed.** by the
0950: 20 6b 65 79 77 6f 72 64 20 22 75 6e 6f 72 64 65   keyword "unorde
0960: 72 65 64 22 2e 20 20 54 68 65 20 22 75 6e 6f 72  red".  The "unor
0970: 64 65 72 65 64 22 20 6b 65 79 77 6f 72 64 2c 20  dered" keyword, 
0980: 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
0990: 2c 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 65 70  ,.** must be sep
09a0: 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  arated from the 
09b0: 6c 61 73 74 20 69 6e 74 65 67 65 72 20 62 79 20  last integer by 
09c0: 61 20 73 69 6e 67 6c 65 20 73 70 61 63 65 2e 20  a single space. 
09d0: 20 49 66 20 74 68 65 0a 2a 2a 20 22 75 6e 6f 72   If the.** "unor
09e0: 64 65 72 65 64 22 20 6b 65 79 77 6f 72 64 20 69  dered" keyword i
09f0: 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
0a00: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0a10: 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  r assumes that.*
0a20: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 75  * the index is u
0a30: 6e 6f 72 64 65 72 65 64 20 61 6e 64 20 77 69 6c  nordered and wil
0a40: 6c 20 6e 6f 74 20 75 73 65 20 74 68 65 20 69 6e  l not use the in
0a50: 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20  dex for a range 
0a60: 71 75 65 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  query..** .** If
0a70: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
0a80: 31 2e 69 64 78 20 63 6f 6c 75 6d 6e 20 69 73 20  1.idx column is 
0a90: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 73  NULL, then the s
0aa0: 71 6c 69 74 65 5f 73 74 61 74 31 2e 73 74 61 74  qlite_stat1.stat
0ab0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  .** column conta
0ac0: 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  ins a single int
0ad0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
0ae0: 65 20 28 65 73 74 69 6d 61 74 65 64 29 20 6e 75  e (estimated) nu
0af0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20  mber of.** rows 
0b00: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  in the table ide
0b10: 6e 74 69 66 69 65 64 20 62 79 20 73 71 6c 69 74  ntified by sqlit
0b20: 65 5f 73 74 61 74 31 2e 74 62 6c 2e 0a 2a 2a 0a  e_stat1.tbl..**.
0b30: 2a 2a 20 46 6f 72 6d 61 74 20 6f 66 20 73 71 6c  ** Format of sql
0b40: 69 74 65 5f 73 74 61 74 32 3a 0a 2a 2a 0a 2a 2a  ite_stat2:.**.**
0b50: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0b60: 32 20 69 73 20 6f 6e 6c 79 20 63 72 65 61 74 65  2 is only create
0b70: 64 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 75 73  d and is only us
0b80: 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  ed if SQLite is 
0b90: 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
0ba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
0bb0: 54 41 54 32 20 61 6e 64 20 69 66 20 74 68 65 20  TAT2 and if the 
0bc0: 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
0bd0: 75 6d 62 65 72 20 69 73 20 62 65 74 77 65 65 6e  umber is between
0be0: 0a 2a 2a 20 33 2e 36 2e 31 38 20 61 6e 64 20 33  .** 3.6.18 and 3
0bf0: 2e 37 2e 38 2e 20 20 54 68 65 20 22 73 74 61 74  .7.8.  The "stat
0c00: 32 22 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  2" table contain
0c10: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  s additional inf
0c20: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 62 6f 75  ormation.** abou
0c30: 74 20 74 68 65 20 64 69 73 74 72 69 62 75 74 69  t the distributi
0c40: 6f 6e 20 6f 66 20 6b 65 79 73 20 77 69 74 68 69  on of keys withi
0c50: 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65  n an index.  The
0c60: 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
0c70: 66 69 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 22  fied by.** the "
0c80: 69 64 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  idx" column and 
0c90: 74 68 65 20 22 74 62 6c 22 20 63 6f 6c 75 6d 6e  the "tbl" column
0ca0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
0cb0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69  the table to whi
0cc0: 63 68 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ch.** the index 
0cd0: 62 65 6c 6f 6e 67 73 2e 20 20 54 68 65 72 65 20  belongs.  There 
0ce0: 61 72 65 20 75 73 75 61 6c 6c 79 20 31 30 20 72  are usually 10 r
0cf0: 6f 77 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ows in the sqlit
0d00: 65 5f 73 74 61 74 32 0a 2a 2a 20 74 61 62 6c 65  e_stat2.** table
0d10: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2e   for each index.
0d20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
0d30: 65 5f 73 74 61 74 32 20 65 6e 74 72 69 65 73 20  e_stat2 entries 
0d40: 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61  for an index tha
0d50: 74 20 68 61 76 65 20 73 61 6d 70 6c 65 6e 6f 20  t have sampleno 
0d60: 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 39 0a  between 0 and 9.
0d70: 2a 2a 20 69 6e 63 6c 75 73 69 76 65 20 61 72 65  ** inclusive are
0d80: 20 73 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20   samples of the 
0d90: 6c 65 66 74 2d 6d 6f 73 74 20 6b 65 79 20 76 61  left-most key va
0da0: 6c 75 65 20 69 6e 20 74 68 65 20 69 6e 64 65 78  lue in the index
0db0: 20 74 61 6b 65 6e 20 61 74 0a 2a 2a 20 65 76 65   taken at.** eve
0dc0: 6e 6c 79 20 73 70 61 63 65 64 20 70 6f 69 6e 74  nly spaced point
0dd0: 73 20 61 6c 6f 6e 67 20 74 68 65 20 69 6e 64 65  s along the inde
0de0: 78 2e 20 20 4c 65 74 20 74 68 65 20 6e 75 6d 62  x.  Let the numb
0df0: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 62 65  er of samples be
0e00: 20 53 0a 2a 2a 20 28 31 30 20 69 6e 20 74 68 65   S.** (10 in the
0e10: 20 73 74 61 6e 64 61 72 64 20 62 75 69 6c 64 29   standard build)
0e20: 20 61 6e 64 20 6c 65 74 20 43 20 62 65 20 74 68   and let C be th
0e30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
0e40: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
0e50: 2a 20 54 68 65 6e 20 74 68 65 20 73 61 6d 70 6c  * Then the sampl
0e60: 65 64 20 72 6f 77 73 20 61 72 65 20 67 69 76 65  ed rows are give
0e70: 6e 20 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  n by:.**.**     
0e80: 72 6f 77 6e 75 6d 62 65 72 20 3d 20 28 69 2a 43  rownumber = (i*C
0e90: 2a 32 20 2b 20 43 29 2f 28 53 2a 32 29 0a 2a 2a  *2 + C)/(S*2).**
0ea0: 0a 2a 2a 20 46 6f 72 20 69 20 62 65 74 77 65 65  .** For i betwee
0eb0: 6e 20 30 20 61 6e 64 20 53 2d 31 2e 20 20 43 6f  n 0 and S-1.  Co
0ec0: 6e 63 65 70 74 75 61 6c 6c 79 2c 20 74 68 65 20  nceptually, the 
0ed0: 69 6e 64 65 78 20 73 70 61 63 65 20 69 73 20 64  index space is d
0ee0: 69 76 69 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 53  ivided into.** S
0ef0: 20 75 6e 69 66 6f 72 6d 20 62 75 63 6b 65 74 73   uniform buckets
0f00: 20 61 6e 64 20 74 68 65 20 73 61 6d 70 6c 65 73   and the samples
0f10: 20 61 72 65 20 74 68 65 20 6d 69 64 64 6c 65 20   are the middle 
0f20: 72 6f 77 20 66 72 6f 6d 20 65 61 63 68 20 62 75  row from each bu
0f30: 63 6b 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cket..**.** The 
0f40: 66 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74  format for sqlit
0f50: 65 5f 73 74 61 74 32 20 69 73 20 72 65 63 6f 72  e_stat2 is recor
0f60: 64 65 64 20 68 65 72 65 20 66 6f 72 20 6c 65 67  ded here for leg
0f70: 61 63 79 20 72 65 66 65 72 65 6e 63 65 2e 20 20  acy reference.  
0f80: 54 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  This.** version 
0f90: 6f 66 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e  of SQLite does n
0fa0: 6f 74 20 73 75 70 70 6f 72 74 20 73 71 6c 69 74  ot support sqlit
0fb0: 65 5f 73 74 61 74 32 2e 20 20 49 74 20 6e 65 69  e_stat2.  It nei
0fc0: 74 68 65 72 20 72 65 61 64 73 20 6e 6f 72 0a 2a  ther reads nor.*
0fd0: 2a 20 77 72 69 74 65 73 20 74 68 65 20 73 71 6c  * writes the sql
0fe0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 2e  ite_stat2 table.
0ff0: 20 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f    This version o
1000: 66 20 53 51 4c 69 74 65 20 6f 6e 6c 79 20 73 75  f SQLite only su
1010: 70 70 6f 72 74 73 0a 2a 2a 20 73 71 6c 69 74 65  pports.** sqlite
1020: 5f 73 74 61 74 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f  _stat3..**.** Fo
1030: 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74 65 5f  rmat for sqlite_
1040: 73 74 61 74 33 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  stat3:.**.** The
1050: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 69 73   sqlite_stat3 is
1060: 20 61 6e 20 65 6e 68 61 6e 63 65 6d 65 6e 74 20   an enhancement 
1070: 74 6f 20 73 71 6c 69 74 65 5f 73 74 61 74 32 2e  to sqlite_stat2.
1080: 20 20 41 20 6e 65 77 20 6e 61 6d 65 20 69 73 0a    A new name is.
1090: 2a 2a 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  ** used to avoid
10a0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 70   compatibility p
10b0: 72 6f 62 6c 65 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a  roblems.  .**.**
10c0: 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74   The format of t
10d0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  he sqlite_stat3 
10e0: 74 61 62 6c 65 20 69 73 20 73 69 6d 69 6c 61 72  table is similar
10f0: 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 6f   to the format o
1100: 66 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  f.** the sqlite_
1110: 73 74 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68  stat2 table.  Th
1120: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
1130: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
1140: 68 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 20  h index..** The 
1150: 69 64 78 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  idx column names
1160: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74   the index and t
1170: 68 65 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73  he tbl column is
1180: 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68   the table of th
1190: 65 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 49 66 20  e.** index.  If 
11a0: 74 68 65 20 69 64 78 20 61 6e 64 20 74 62 6c 20  the idx and tbl 
11b0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 74 68 65 20  columns are the 
11c0: 73 61 6d 65 2c 20 74 68 65 6e 20 74 68 65 20 73  same, then the s
11d0: 61 6d 70 6c 65 20 69 73 0a 2a 2a 20 6f 66 20 74  ample is.** of t
11e0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
11f0: 52 59 20 4b 45 59 2e 20 20 54 68 65 20 73 61 6d  RY KEY.  The sam
1200: 70 6c 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20  ple column is a 
1210: 76 61 6c 75 65 20 74 61 6b 65 6e 20 66 72 6f 6d  value taken from
1220: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  .** the left-mos
1230: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1240: 69 6e 64 65 78 2e 20 20 54 68 65 20 6e 45 71 20  index.  The nEq 
1250: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 61 70  column is the ap
1260: 70 72 6f 78 69 6d 61 74 65 0a 2a 2a 20 6e 75 6d  proximate.** num
1270: 62 65 72 20 6f 66 20 65 6e 74 69 72 65 73 20 69  ber of entires i
1280: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1290: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
12a0: 6d 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  mn exactly match
12b0: 65 73 0a 2a 2a 20 74 68 65 20 73 61 6d 70 6c 65  es.** the sample
12c0: 2e 20 20 6e 4c 74 20 69 73 20 74 68 65 20 61 70  .  nLt is the ap
12d0: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
12e0: 20 6f 66 20 65 6e 74 69 72 65 73 20 77 68 6f 73   of entires whos
12f0: 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63  e left-most.** c
1300: 6f 6c 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68  olumn is less th
1310: 61 6e 20 74 68 65 20 73 61 6d 65 2e 20 20 54 68  an the same.  Th
1320: 65 20 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73  e nDLt column is
1330: 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65   the approximate
1340: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 64 69  .** number of di
1350: 73 74 69 6e 63 74 20 6c 65 66 74 2d 6d 6f 73 74  stinct left-most
1360: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1370: 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 6c  index that are l
1380: 65 73 73 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ess than.** the 
1390: 73 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 46 75 74 75  same..**.** Futu
13a0: 72 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  re versions of S
13b0: 51 4c 69 74 65 20 6d 69 67 68 74 20 63 68 61 6e  QLite might chan
13c0: 67 65 20 74 6f 20 73 74 6f 72 65 20 61 20 73 74  ge to store a st
13d0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ring containing.
13e0: 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 69 6e 74 65  ** multiple inte
13f0: 67 65 72 73 20 76 61 6c 75 65 73 20 69 6e 20 74  gers values in t
1400: 68 65 20 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 6f  he nDLt column o
1410: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 20  f sqlite_stat3. 
1420: 20 54 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   The first.** in
1430: 74 65 67 65 72 20 77 69 6c 6c 20 62 65 20 74 68  teger will be th
1440: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f  e number of prio
1450: 72 20 69 6e 64 65 78 20 65 6e 74 69 72 65 73 20  r index entires 
1460: 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63  that are distinc
1470: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  t in.** the left
1480: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 20 20 54  -most column.  T
1490: 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
14a0: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 75  r will be the nu
14b0: 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 69 6e  mber of prior in
14c0: 64 65 78 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74  dex.** entries t
14d0: 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
14e0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 74 77   in the first tw
14f0: 6f 20 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65 20  o columns.  The 
1500: 74 68 69 72 64 20 69 6e 74 65 67 65 72 0a 2a 2a  third integer.**
1510: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 75 6d   will be the num
1520: 62 65 72 20 6f 66 20 70 72 69 6f 72 20 69 6e 64  ber of prior ind
1530: 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
1540: 61 72 65 20 64 69 73 74 69 6e 63 74 20 69 6e 20  are distinct in 
1550: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72  the first.** thr
1560: 65 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 6e 64  ee columns.  And
1570: 20 73 6f 20 66 6f 72 74 68 2e 20 20 57 69 74 68   so forth.  With
1580: 20 74 68 61 74 20 65 78 74 65 6e 73 69 6f 6e 2c   that extension,
1590: 20 74 68 65 20 6e 44 4c 74 20 66 69 65 6c 64 20   the nDLt field 
15a0: 69 73 0a 2a 2a 20 73 69 6d 69 6c 61 72 20 69 6e  is.** similar in
15b0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65   function to the
15c0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 73 74   sqlite_stat1.st
15d0: 61 74 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  at field..**.** 
15e0: 54 68 65 72 65 20 63 61 6e 20 62 65 20 61 6e 20  There can be an 
15f0: 61 72 62 69 74 72 61 72 79 20 6e 75 6d 62 65 72  arbitrary number
1600: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33   of sqlite_stat3
1610: 20 65 6e 74 72 69 65 73 20 70 65 72 20 69 6e 64   entries per ind
1620: 65 78 2e 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59  ex..** The ANALY
1630: 5a 45 20 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 20  ZE command will 
1640: 74 79 70 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  typically genera
1650: 74 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  te sqlite_stat3 
1660: 74 61 62 6c 65 73 0a 2a 2a 20 74 68 61 74 20 63  tables.** that c
1670: 6f 6e 74 61 69 6e 20 62 65 74 77 65 65 6e 20 31  ontain between 1
1680: 30 20 61 6e 64 20 34 30 20 73 61 6d 70 6c 65 73  0 and 40 samples
1690: 20 77 68 69 63 68 20 61 72 65 20 64 69 73 74 72   which are distr
16a0: 69 62 75 74 65 64 20 61 63 72 6f 73 73 0a 2a 2a  ibuted across.**
16b0: 20 74 68 65 20 6b 65 79 20 73 70 61 63 65 2c 20   the key space, 
16c0: 74 68 6f 75 67 68 20 6e 6f 74 20 75 6e 69 66 6f  though not unifo
16d0: 72 6d 6c 79 2c 20 61 6e 64 20 77 68 69 63 68 20  rmly, and which 
16e0: 69 6e 63 6c 75 64 65 20 73 61 6d 70 6c 65 73 20  include samples 
16f0: 77 69 74 68 0a 2a 2a 20 6c 61 72 67 65 73 74 20  with.** largest 
1700: 70 6f 73 73 69 62 6c 65 20 6e 45 71 20 76 61 6c  possible nEq val
1710: 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ues..*/.#ifndef 
1720: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c  SQLITE_OMIT_ANAL
1730: 59 5a 45 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  YZE.#include "sq
1740: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  liteInt.h"../*.*
1750: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1760: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
1770: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 71 6c  at opens the sql
1780: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
1790: 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 77  for.** writing w
17a0: 69 74 68 20 63 75 72 73 6f 72 20 69 53 74 61 74  ith cursor iStat
17b0: 43 75 72 2e 20 49 66 20 74 68 65 20 6c 69 62 72  Cur. If the libr
17c0: 61 72 79 20 77 61 73 20 62 75 69 6c 74 20 77 69  ary was built wi
17d0: 74 68 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45  th the.** SQLITE
17e0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20 6d 61  _ENABLE_STAT2 ma
17f0: 63 72 6f 20 64 65 66 69 6e 65 64 2c 20 74 68 65  cro defined, the
1800: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
1810: 74 32 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 6f  t2 table is.** o
1820: 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
1830: 67 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 28  g using cursor (
1840: 69 53 74 61 74 43 75 72 2b 31 29 0a 2a 2a 0a 2a  iStatCur+1).**.*
1850: 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * If the sqlite_
1860: 73 74 61 74 31 20 74 61 62 6c 65 73 20 64 6f 65  stat1 tables doe
1870: 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  s not previously
1880: 20 65 78 69 73 74 2c 20 69 74 20 69 73 20 63 72   exist, it is cr
1890: 65 61 74 65 64 2e 0a 2a 2a 20 53 69 6d 69 6c 61  eated..** Simila
18a0: 72 6c 79 2c 20 69 66 20 74 68 65 20 73 71 6c 69  rly, if the sqli
18b0: 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20 64  te_stat2 table d
18c0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 61 6e  oes not exist an
18d0: 64 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  d the library.**
18e0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
18f0: 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  h SQLITE_ENABLE_
1900: 53 54 41 54 32 20 64 65 66 69 6e 65 64 2c 20 69  STAT2 defined, i
1910: 74 20 69 73 20 63 72 65 61 74 65 64 2e 20 0a 2a  t is created. .*
1920: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57  *.** Argument zW
1930: 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f  here may be a po
1940: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
1950: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  r containing a t
1960: 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72  able name,.** or
1970: 20 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c   it may be a NUL
1980: 4c 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74  L pointer. If it
1990: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
19a0: 65 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  en all entries i
19b0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
19c0: 73 74 61 74 31 20 61 6e 64 20 28 69 66 20 61 70  stat1 and (if ap
19d0: 70 6c 69 63 61 62 6c 65 29 20 73 71 6c 69 74 65  plicable) sqlite
19e0: 5f 73 74 61 74 32 20 74 61 62 6c 65 73 20 61 73  _stat2 tables as
19f0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
1a00: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
1a10: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 20 49 66   are deleted. If
1a20: 20 7a 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e   zWhere==0, then
1a30: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
1a40: 65 64 0a 2a 2a 20 74 6f 20 64 65 6c 65 74 65 20  ed.** to delete 
1a50: 61 6c 6c 20 73 74 61 74 20 74 61 62 6c 65 20 65  all stat table e
1a60: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
1a70: 63 20 76 6f 69 64 20 6f 70 65 6e 53 74 61 74 54  c void openStatT
1a80: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
1a90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1aa0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1ab0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1ae0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 69  we are looking i
1af0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74  n */.  int iStat
1b00: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Cur,           /
1b10: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
1b20: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 6f 6e  e_stat1 table on
1b30: 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
1b40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
1b50: 68 65 72 65 2c 20 20 20 20 20 2f 2a 20 44 65 6c  here,     /* Del
1b60: 65 74 65 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ete entries for 
1b70: 74 68 69 73 20 74 61 62 6c 65 20 6f 72 20 69 6e  this table or in
1b80: 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
1b90: 68 61 72 20 2a 7a 57 68 65 72 65 54 79 70 65 20  har *zWhereType 
1ba0: 20 2f 2a 20 45 69 74 68 65 72 20 22 74 62 6c 22   /* Either "tbl"
1bb0: 20 6f 72 20 22 69 64 78 22 20 2a 2f 0a 29 7b 0a   or "idx" */.){.
1bc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1bd0: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
1be0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
1bf0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c00: 43 6f 6c 73 3b 0a 20 20 7d 20 61 54 61 62 6c 65  Cols;.  } aTable
1c10: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 73 71  [] = {.    { "sq
1c20: 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 22 74 62  lite_stat1", "tb
1c30: 6c 2c 69 64 78 2c 73 74 61 74 22 20 7d 2c 0a 23  l,idx,stat" },.#
1c40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c50: 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 7b 20  BLE_STAT3.    { 
1c60: 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20  "sqlite_stat3", 
1c70: 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c 74  "tbl,idx,neq,nlt
1c80: 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d 2c  ,ndlt,sample" },
1c90: 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73  .#endif.  };.  s
1ca0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1cb0: 20 2a 61 7a 54 6f 44 72 6f 70 5b 5d 20 3d 20 7b   *azToDrop[] = {
1cc0: 20 0a 20 20 20 20 22 73 71 6c 69 74 65 5f 73 74   .    "sqlite_st
1cd0: 61 74 32 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  at2",.#ifndef SQ
1ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cf0: 33 0a 20 20 20 20 22 73 71 6c 69 74 65 5f 73 74  3.    "sqlite_st
1d00: 61 74 33 22 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  at3",.#endif.  }
1d10: 3b 0a 0a 20 20 69 6e 74 20 61 52 6f 6f 74 5b 5d  ;..  int aRoot[]
1d20: 20 3d 20 7b 30 2c 20 30 7d 3b 0a 20 20 75 38 20   = {0, 0};.  u8 
1d30: 61 43 72 65 61 74 65 54 62 6c 5b 5d 20 3d 20 7b  aCreateTbl[] = {
1d40: 30 2c 20 30 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b  0, 0};..  int i;
1d50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1d60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
1d70: 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65 20 2a  b *pDb;.  Vdbe *
1d80: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1d90: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1da0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
1db0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1dc0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
1dd0: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
1de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
1df0: 64 62 65 44 62 28 76 29 3d 3d 64 62 20 29 3b 0a  dbeDb(v)==db );.
1e00: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
1e10: 5b 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 44 72 6f  [iDb];..  /* Dro
1e20: 70 20 61 6c 6c 20 73 74 61 74 69 73 74 69 63 73  p all statistics
1e30: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 69   tables that thi
1e40: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  s version of SQL
1e50: 69 74 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  ite does not.  *
1e60: 2a 20 75 6e 64 65 72 73 74 61 6e 64 2e 0a 20 20  * understand..  
1e70: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1e80: 41 72 72 61 79 53 69 7a 65 28 61 7a 54 6f 44 72  ArraySize(azToDr
1e90: 6f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  op); i++){.    T
1ea0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
1eb0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1ec0: 2c 20 61 7a 54 6f 44 72 6f 70 5b 69 5d 2c 20 70  , azToDrop[i], p
1ed0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
1ee0: 69 66 28 20 70 54 61 62 20 29 20 73 71 6c 69 74  if( pTab ) sqlit
1ef0: 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
1f00: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
1f10: 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b, 0);.  }..  /*
1f20: 20 43 72 65 61 74 65 20 6e 65 77 20 73 74 61 74   Create new stat
1f30: 69 73 74 69 63 20 74 61 62 6c 65 73 20 69 66 20  istic tables if 
1f40: 74 68 65 79 20 64 6f 20 6e 6f 74 20 65 78 69 73  they do not exis
1f50: 74 2c 20 6f 72 20 63 6c 65 61 72 20 74 68 65 6d  t, or clear them
1f60: 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 64 6f  .  ** if they do
1f70: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
1f80: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1f90: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 61 62  i<ArraySize(aTab
1fa0: 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  le); i++){.    c
1fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1fc0: 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d  = aTable[i].zNam
1fd0: 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53  e;.    Table *pS
1fe0: 74 61 74 3b 0a 20 20 20 20 69 66 28 20 28 70 53  tat;.    if( (pS
1ff0: 74 61 74 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  tat = sqlite3Fin
2000: 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 2c  dTable(db, zTab,
2010: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 3d 3d 30   pDb->zName))==0
2020: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2030: 20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 32 5d   sqlite_stat[12]
2040: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
2050: 65 78 69 73 74 2e 20 43 72 65 61 74 65 20 69 74  exist. Create it
2060: 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 0a 20  . Note that a . 
2070: 20 20 20 20 20 2a 2a 20 73 69 64 65 2d 65 66 66       ** side-eff
2080: 65 63 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ect of the CREAT
2090: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
20a0: 74 20 69 73 20 74 6f 20 6c 65 61 76 65 20 74 68  t is to leave th
20b0: 65 20 72 6f 6f 74 70 61 67 65 20 0a 20 20 20 20  e rootpage .    
20c0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 65 77 20    ** of the new 
20d0: 74 61 62 6c 65 20 69 6e 20 72 65 67 69 73 74 65  table in registe
20e0: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
20f0: 74 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  t. This is impor
2100: 74 61 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 62  tant .      ** b
2110: 65 63 61 75 73 65 20 74 68 65 20 4f 70 65 6e 57  ecause the OpenW
2120: 72 69 74 65 20 6f 70 63 6f 64 65 20 62 65 6c 6f  rite opcode belo
2130: 77 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e  w will be needin
2140: 67 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 73  g it. */.      s
2150: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
2160: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
2170: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
2180: 45 20 25 51 2e 25 73 28 25 73 29 22 2c 20 70 44  E %Q.%s(%s)", pD
2190: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  b->zName, zTab, 
21a0: 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 0a  aTable[i].zCols.
21b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
21c0: 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61 72 73 65  Root[i] = pParse
21d0: 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20 20 20 20  ->regRoot;.     
21e0: 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d   aCreateTbl[i] =
21f0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2200: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2210: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
2220: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 6e  . If zWhere is n
2230: 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20  ot NULL, delete 
2240: 61 6c 6c 20 65 6e 74 72 69 65 73 20 0a 20 20 20  all entries .   
2250: 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64     ** associated
2260: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
2270: 7a 57 68 65 72 65 2e 20 49 66 20 7a 57 68 65 72  zWhere. If zWher
2280: 65 20 69 73 20 4e 55 4c 4c 2c 20 64 65 6c 65 74  e is NULL, delet
2290: 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  e the.      ** e
22a0: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
22b0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 2a 2f 0a  f the table. */.
22c0: 20 20 20 20 20 20 61 52 6f 6f 74 5b 69 5d 20 3d        aRoot[i] =
22d0: 20 70 53 74 61 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pStat->tnum;.  
22e0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
22f0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
2300: 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31 2c 20 7a  , aRoot[i], 1, z
2310: 54 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Tab);.      if( 
2320: 7a 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  zWhere ){.      
2330: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
2340: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
2350: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
2360: 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
2370: 20 25 73 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e   %s=%Q", pDb->zN
2380: 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68 65 72  ame, zTab, zWher
2390: 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a 20 20  eType, zWhere.  
23a0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
23b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
23c0: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
23d0: 5b 31 32 5d 20 74 61 62 6c 65 20 61 6c 72 65 61  [12] table alrea
23e0: 64 79 20 65 78 69 73 74 73 2e 20 20 44 65 6c 65  dy exists.  Dele
23f0: 74 65 20 61 6c 6c 20 72 6f 77 73 2e 20 2a 2f 0a  te all rows. */.
2400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2410: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2420: 43 6c 65 61 72 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Clear, aRoot[i],
2430: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
2440: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
2450: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73  pen the sqlite_s
2460: 74 61 74 5b 31 33 5d 20 74 61 62 6c 65 73 20 66  tat[13] tables f
2470: 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
2480: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
2490: 79 53 69 7a 65 28 61 54 61 62 6c 65 29 3b 20 69  ySize(aTable); i
24a0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
24b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
24c0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 53 74 61  _OpenWrite, iSta
24d0: 74 43 75 72 2b 69 2c 20 61 52 6f 6f 74 5b 69 5d  tCur+i, aRoot[i]
24e0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
24f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
2500: 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 33  v, -1, (char *)3
2510: 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
2520: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2530: 67 65 50 35 28 76 2c 20 61 43 72 65 61 74 65 54  geP5(v, aCreateT
2540: 62 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bl[i]);.  }.}../
2550: 2a 0a 2a 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64  *.** Recommended
2560: 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
2570: 65 73 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74  es for sqlite_st
2580: 61 74 33 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  at3.*/.#ifndef S
2590: 51 4c 49 54 45 5f 53 54 41 54 33 5f 53 41 4d 50  QLITE_STAT3_SAMP
25a0: 4c 45 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  LES.# define SQL
25b0: 49 54 45 5f 53 54 41 54 33 5f 53 41 4d 50 4c 45  ITE_STAT3_SAMPLE
25c0: 53 20 32 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  S 24.#endif../*.
25d0: 2a 2a 20 54 68 72 65 65 20 53 51 4c 20 66 75 6e  ** Three SQL fun
25e0: 63 74 69 6f 6e 73 20 2d 20 73 74 61 74 33 5f 69  ctions - stat3_i
25f0: 6e 69 74 28 29 2c 20 73 74 61 74 33 5f 70 75 73  nit(), stat3_pus
2600: 68 28 29 2c 20 61 6e 64 20 73 74 61 74 33 5f 70  h(), and stat3_p
2610: 6f 70 28 29 20 2d 0a 2a 2a 20 73 68 61 72 65 20  op() -.** share 
2620: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2630: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2640: 75 63 74 75 72 65 20 74 6f 20 68 6f 6c 64 20 74  ucture to hold t
2650: 68 65 69 72 20 73 74 61 74 65 0a 2a 2a 20 69 6e  heir state.** in
2660: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79  formation..*/.ty
2670: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61  pedef struct Sta
2680: 74 33 41 63 63 75 6d 20 53 74 61 74 33 41 63 63  t3Accum Stat3Acc
2690: 75 6d 3b 0a 73 74 72 75 63 74 20 53 74 61 74 33  um;.struct Stat3
26a0: 41 63 63 75 6d 20 7b 0a 20 20 74 52 6f 77 63 6e  Accum {.  tRowcn
26b0: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
26c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26d0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74   rows in the ent
26e0: 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 74  ire table */.  t
26f0: 52 6f 77 63 6e 74 20 6e 50 53 61 6d 70 6c 65 3b  Rowcnt nPSample;
2700: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
2710: 6f 66 74 65 6e 20 74 6f 20 64 6f 20 61 20 70 65  often to do a pe
2720: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a 2f  riodic sample */
2730: 0a 20 20 69 6e 74 20 69 4d 69 6e 3b 20 20 20 20  .  int iMin;    
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2750: 49 6e 64 65 78 20 6f 66 20 65 6e 74 72 79 20 77  Index of entry w
2760: 69 74 68 20 6d 69 6e 69 6d 75 6d 20 6e 45 71 20  ith minimum nEq 
2770: 61 6e 64 20 68 61 73 68 20 2a 2f 0a 20 20 69 6e  and hash */.  in
2780: 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20  t mxSample;     
2790: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
27a0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  um number of sam
27b0: 70 6c 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61  ples to accumula
27c0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d  te */.  int nSam
27d0: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
27e0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
27f0: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a  ber of samples *
2800: 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20 20  /.  u32 iPrn;   
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2820: 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   Pseudo-random n
2830: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 73  umber used for s
2840: 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 73 74 72  ampling */.  str
2850: 75 63 74 20 53 74 61 74 33 53 61 6d 70 6c 65 20  uct Stat3Sample 
2860: 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2880: 20 2f 2a 20 52 6f 77 69 64 20 69 6e 20 6d 61 69   /* Rowid in mai
2890: 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6b  n table of the k
28a0: 65 79 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e  ey */.    tRowcn
28b0: 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  t nEq;          
28c0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73       /* sqlite_s
28d0: 74 61 74 33 2e 6e 45 71 20 2a 2f 0a 20 20 20 20  tat3.nEq */.    
28e0: 74 52 6f 77 63 6e 74 20 6e 4c 74 3b 20 20 20 20  tRowcnt nLt;    
28f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
2900: 6c 69 74 65 5f 73 74 61 74 33 2e 6e 4c 74 20 2a  lite_stat3.nLt *
2910: 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 44  /.    tRowcnt nD
2920: 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Lt;             
2930: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 33   /* sqlite_stat3
2940: 2e 6e 44 4c 74 20 2a 2f 0a 20 20 20 20 75 38 20  .nDLt */.    u8 
2950: 69 73 50 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  isPSample;      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2970: 69 66 20 61 20 70 65 72 69 6f 64 69 63 20 73 61  if a periodic sa
2980: 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 75 33 32 20  mple */.    u32 
2990: 69 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  iHash;          
29a0: 20 20 20 20 20 20 20 2f 2a 20 54 69 65 62 72 65         /* Tiebre
29b0: 61 6b 65 72 20 68 61 73 68 20 2a 2f 0a 20 20 7d  aker hash */.  }
29c0: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
29d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61           /* An a
29e0: 72 72 61 79 20 6f 66 20 73 61 6d 70 6c 65 73 20  rray of samples 
29f0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  */.};..#ifdef SQ
2a00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
2a10: 33 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  3./*.** Implemen
2a20: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  tation of the st
2a30: 61 74 33 5f 69 6e 69 74 28 43 2c 53 29 20 53 51  at3_init(C,S) SQ
2a40: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
2a50: 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73 0a   two parameters.
2a60: 2a 2a 20 61 72 65 20 74 68 65 20 6e 75 6d 62 65  ** are the numbe
2a70: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2a80: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2a90: 28 43 29 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  (C) and the numb
2aa0: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a  er of samples.**
2ab0: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 28   to accumulate (
2ac0: 53 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  S)..**.** This r
2ad0: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
2ae0: 20 74 68 65 20 53 74 61 74 33 41 63 63 75 6d 20   the Stat3Accum 
2af0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
2b00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2b10: 73 20 74 68 65 20 53 74 61 74 33 41 63 63 75 6d  s the Stat3Accum
2b20: 20 6f 62 6a 65 63 74 20 28 50 29 2e 0a 2a 2f 0a   object (P)..*/.
2b30: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
2b40: 33 49 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  3Init(.  sqlite3
2b50: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2b60: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
2b70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b80: 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61 74 33  *argv.){.  Stat3
2b90: 41 63 63 75 6d 20 2a 70 3b 0a 20 20 74 52 6f 77  Accum *p;.  tRow
2ba0: 63 6e 74 20 6e 52 6f 77 3b 0a 20 20 69 6e 74 20  cnt nRow;.  int 
2bb0: 6d 78 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20  mxSample;.  int 
2bc0: 6e 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  n;..  UNUSED_PAR
2bd0: 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
2be0: 6e 52 6f 77 20 3d 20 28 74 52 6f 77 63 6e 74 29  nRow = (tRowcnt)
2bf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2c00: 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t64(argv[0]);.  
2c10: 6d 78 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74  mxSample = sqlit
2c20: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
2c30: 76 5b 31 5d 29 3b 0a 20 20 6e 20 3d 20 73 69 7a  v[1]);.  n = siz
2c40: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
2c50: 28 70 2d 3e 61 5b 30 5d 29 2a 6d 78 53 61 6d 70  (p->a[0])*mxSamp
2c60: 6c 65 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  le;.  p = sqlite
2c70: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  3_malloc( n );. 
2c80: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2c90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2ca0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
2cb0: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
2cc0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
2cd0: 2c 20 30 2c 20 6e 29 3b 0a 20 20 70 2d 3e 61 20  , 0, n);.  p->a 
2ce0: 3d 20 28 73 74 72 75 63 74 20 53 74 61 74 33 53  = (struct Stat3S
2cf0: 61 6d 70 6c 65 2a 29 26 70 5b 31 5d 3b 0a 20 20  ample*)&p[1];.  
2d00: 70 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a  p->nRow = nRow;.
2d10: 20 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 3d 20    p->mxSample = 
2d20: 6d 78 53 61 6d 70 6c 65 3b 0a 20 20 70 2d 3e 6e  mxSample;.  p->n
2d30: 50 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 6e 52 6f  PSample = p->nRo
2d40: 77 2f 28 6d 78 53 61 6d 70 6c 65 2f 33 2b 31 29  w/(mxSample/3+1)
2d50: 20 2b 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f   + 1;.  sqlite3_
2d60: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
2d70: 66 28 70 2d 3e 69 50 72 6e 29 2c 20 26 70 2d 3e  f(p->iPrn), &p->
2d80: 69 50 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  iPrn);.  sqlite3
2d90: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
2da0: 74 65 78 74 2c 20 70 2c 20 73 69 7a 65 6f 66 28  text, p, sizeof(
2db0: 70 29 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  p), sqlite3_free
2dc0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73  );.}.static cons
2dd0: 74 20 46 75 6e 63 44 65 66 20 73 74 61 74 33 49  t FuncDef stat3I
2de0: 6e 69 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20  nitFuncdef = {. 
2df0: 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
2e00: 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20     /* nArg */.  
2e10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
2e20: 20 20 2f 2a 20 69 50 72 65 66 45 6e 63 20 2a 2f    /* iPrefEnc */
2e30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2e40: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 2a 2f       /* flags */
2e50: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
2e60: 20 20 20 20 20 2f 2a 20 70 55 73 65 72 44 61 74       /* pUserDat
2e70: 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
2e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2e90: 74 20 2a 2f 0a 20 20 73 74 61 74 33 49 6e 69 74  t */.  stat3Init
2ea0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6e  ,        /* xFun
2eb0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
2ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 74 65           /* xSte
2ed0: 70 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  p */.  0,       
2ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
2ef0: 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74  alize */.  "stat
2f00: 33 5f 69 6e 69 74 22 2c 20 20 20 20 20 2f 2a 20  3_init",     /* 
2f10: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20  zName */.  0,   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f30: 70 48 61 73 68 20 2a 2f 0a 20 20 30 20 20 20 20  pHash */.  0    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f50: 70 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 7d  pDestructor */.}
2f60: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ;.../*.** Implem
2f70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2f80: 73 74 61 74 33 5f 70 75 73 68 28 6e 45 71 2c 6e  stat3_push(nEq,n
2f90: 4c 74 2c 6e 44 4c 74 2c 72 6f 77 69 64 2c 50 29  Lt,nDLt,rowid,P)
2fa0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
2fb0: 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  The.** arguments
2fc0: 20 64 65 73 63 72 69 62 65 20 61 20 73 69 6e 67   describe a sing
2fd0: 6c 65 20 6b 65 79 20 69 6e 73 74 61 6e 63 65 2e  le key instance.
2fe0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
2ff0: 61 6b 65 73 20 74 68 65 20 0a 2a 2a 20 64 65 63  akes the .** dec
3000: 69 73 69 6f 6e 20 61 62 6f 75 74 20 77 68 65 74  ision about whet
3010: 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72 65  her or not to re
3020: 74 61 69 6e 20 74 68 69 73 20 6b 65 79 20 66 6f  tain this key fo
3030: 72 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  r the sqlite_sta
3040: 74 33 0a 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a  t3.** table..**.
3050: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
3060: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  lue is NULL..*/.
3070: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
3080: 33 50 75 73 68 28 0a 20 20 73 71 6c 69 74 65 33  3Push(.  sqlite3
3090: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
30a0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
30b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
30c0: 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61 74 33  *argv.){.  Stat3
30d0: 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74  Accum *p = (Stat
30e0: 33 41 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f  3Accum*)sqlite3_
30f0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
3100: 34 5d 29 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  4]);.  tRowcnt n
3110: 45 71 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  Eq = sqlite3_val
3120: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
3130: 29 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74  );.  tRowcnt nLt
3140: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3150: 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 3b  _int64(argv[1]);
3160: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 44 4c 74 20  .  tRowcnt nDLt 
3170: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3180: 69 6e 74 36 34 28 61 72 67 76 5b 32 5d 29 3b 0a  int64(argv[2]);.
3190: 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71    i64 rowid = sq
31a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
31b0: 34 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 75 38  4(argv[3]);.  u8
31c0: 20 69 73 50 53 61 6d 70 6c 65 20 3d 20 30 3b 0a   isPSample = 0;.
31d0: 20 20 75 38 20 64 6f 49 6e 73 65 72 74 20 3d 20    u8 doInsert = 
31e0: 30 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20  0;.  int iMin = 
31f0: 70 2d 3e 69 4d 69 6e 3b 0a 20 20 73 74 72 75 63  p->iMin;.  struc
3200: 74 20 53 74 61 74 33 53 61 6d 70 6c 65 20 2a 70  t Stat3Sample *p
3210: 53 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 3b  Sample;.  int i;
3220: 0a 20 20 75 33 32 20 68 3b 0a 0a 20 20 55 4e 55  .  u32 h;..  UNU
3230: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 63 6f  SED_PARAMETER(co
3240: 6e 74 65 78 74 29 3b 0a 20 20 55 4e 55 53 45 44  ntext);.  UNUSED
3250: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29  _PARAMETER(argc)
3260: 3b 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29  ;.  if( nEq==0 )
3270: 20 72 65 74 75 72 6e 3b 0a 20 20 68 20 3d 20 70   return;.  h = p
3280: 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69 50 72 6e  ->iPrn = p->iPrn
3290: 2a 31 31 30 33 35 31 35 32 34 35 20 2b 20 31 32  *1103515245 + 12
32a0: 33 34 35 3b 0a 20 20 69 66 28 20 28 6e 4c 74 2f  345;.  if( (nLt/
32b0: 70 2d 3e 6e 50 53 61 6d 70 6c 65 29 21 3d 28 28  p->nPSample)!=((
32c0: 6e 45 71 2b 6e 4c 74 29 2f 70 2d 3e 6e 50 53 61  nEq+nLt)/p->nPSa
32d0: 6d 70 6c 65 29 20 29 7b 0a 20 20 20 20 64 6f 49  mple) ){.    doI
32e0: 6e 73 65 72 74 20 3d 20 69 73 50 53 61 6d 70 6c  nsert = isPSampl
32f0: 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 1;.  }else i
3300: 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d  f( p->nSample<p-
3310: 3e 6d 78 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  >mxSample ){.   
3320: 20 64 6f 49 6e 73 65 72 74 20 3d 20 31 3b 0a 20   doInsert = 1;. 
3330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3340: 6e 45 71 3e 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 6e  nEq>p->a[iMin].n
3350: 45 71 20 7c 7c 20 28 6e 45 71 3d 3d 70 2d 3e 61  Eq || (nEq==p->a
3360: 5b 69 4d 69 6e 5d 2e 6e 45 71 20 26 26 20 68 3e  [iMin].nEq && h>
3370: 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 69 48 61 73 68  p->a[iMin].iHash
3380: 29 20 29 7b 0a 20 20 20 20 20 20 64 6f 49 6e 73  ) ){.      doIns
3390: 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ert = 1;.    }. 
33a0: 20 7d 0a 20 20 69 66 28 20 21 64 6f 49 6e 73 65   }.  if( !doInse
33b0: 72 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  rt ) return;.  i
33c0: 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 70  f( p->nSample==p
33d0: 2d 3e 6d 78 53 61 6d 70 6c 65 20 29 7b 0a 20 20  ->mxSample ){.  
33e0: 20 20 69 66 28 20 69 4d 69 6e 3c 70 2d 3e 6e 53    if( iMin<p->nS
33f0: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 6d  ample ){.      m
3400: 65 6d 63 70 79 28 26 70 2d 3e 61 5b 69 4d 69 6e  emcpy(&p->a[iMin
3410: 5d 2c 20 26 70 2d 3e 61 5b 69 4d 69 6e 2b 31 5d  ], &p->a[iMin+1]
3420: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  , sizeof(p->a[0]
3430: 29 2a 28 70 2d 3e 6e 53 61 6d 70 6c 65 2d 69 4d  )*(p->nSample-iM
3440: 69 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in));.    }.    
3450: 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61 5b  pSample = &p->a[
3460: 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 3b 0a 20  p->nSample-1];. 
3470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 61 6d   }else{.    pSam
3480: 70 6c 65 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  ple = &p->a[p->n
3490: 53 61 6d 70 6c 65 2b 2b 5d 3b 0a 20 20 7d 0a 20  Sample++];.  }. 
34a0: 20 70 53 61 6d 70 6c 65 2d 3e 69 52 6f 77 69 64   pSample->iRowid
34b0: 20 3d 20 72 6f 77 69 64 3b 0a 20 20 70 53 61 6d   = rowid;.  pSam
34c0: 70 6c 65 2d 3e 6e 45 71 20 3d 20 6e 45 71 3b 0a  ple->nEq = nEq;.
34d0: 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 4c 74 20 3d    pSample->nLt =
34e0: 20 6e 4c 74 3b 0a 20 20 70 53 61 6d 70 6c 65 2d   nLt;.  pSample-
34f0: 3e 6e 44 4c 74 20 3d 20 6e 44 4c 74 3b 0a 20 20  >nDLt = nDLt;.  
3500: 70 53 61 6d 70 6c 65 2d 3e 69 48 61 73 68 20 3d  pSample->iHash =
3510: 20 68 3b 0a 20 20 70 53 61 6d 70 6c 65 2d 3e 69   h;.  pSample->i
3520: 73 50 53 61 6d 70 6c 65 20 3d 20 69 73 50 53 61  sPSample = isPSa
3530: 6d 70 6c 65 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  mple;..  /* Find
3540: 20 74 68 65 20 6e 65 77 20 6d 69 6e 69 6d 75 6d   the new minimum
3550: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61   */.  if( p->nSa
3560: 6d 70 6c 65 3d 3d 70 2d 3e 6d 78 53 61 6d 70 6c  mple==p->mxSampl
3570: 65 20 29 7b 0a 20 20 20 20 70 53 61 6d 70 6c 65  e ){.    pSample
3580: 20 3d 20 70 2d 3e 61 3b 0a 20 20 20 20 69 20 3d   = p->a;.    i =
3590: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   0;.    while( p
35a0: 53 61 6d 70 6c 65 2d 3e 69 73 50 53 61 6d 70 6c  Sample->isPSampl
35b0: 65 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  e ){.      i++;.
35c0: 20 20 20 20 20 20 70 53 61 6d 70 6c 65 2b 2b 3b        pSample++;
35d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35e0: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20  <p->nSample );. 
35f0: 20 20 20 7d 0a 20 20 20 20 6e 45 71 20 3d 20 70     }.    nEq = p
3600: 53 61 6d 70 6c 65 2d 3e 6e 45 71 3b 0a 20 20 20  Sample->nEq;.   
3610: 20 68 20 3d 20 70 53 61 6d 70 6c 65 2d 3e 69 48   h = pSample->iH
3620: 61 73 68 3b 0a 20 20 20 20 69 4d 69 6e 20 3d 20  ash;.    iMin = 
3630: 69 3b 0a 20 20 20 20 66 6f 72 28 69 2b 2b 2c 20  i;.    for(i++, 
3640: 70 53 61 6d 70 6c 65 2b 2b 3b 20 69 3c 70 2d 3e  pSample++; i<p->
3650: 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 2c 20 70 53  nSample; i++, pS
3660: 61 6d 70 6c 65 2b 2b 29 7b 0a 20 20 20 20 20 20  ample++){.      
3670: 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e 69 73 50  if( pSample->isP
3680: 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75  Sample ) continu
3690: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 61  e;.      if( pSa
36a0: 6d 70 6c 65 2d 3e 6e 45 71 3c 6e 45 71 0a 20 20  mple->nEq<nEq.  
36b0: 20 20 20 20 20 7c 7c 20 28 70 53 61 6d 70 6c 65       || (pSample
36c0: 2d 3e 6e 45 71 3d 3d 6e 45 71 20 26 26 20 70 53  ->nEq==nEq && pS
36d0: 61 6d 70 6c 65 2d 3e 69 48 61 73 68 3c 68 29 0a  ample->iHash<h).
36e0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
36f0: 20 69 4d 69 6e 20 3d 20 69 3b 0a 20 20 20 20 20   iMin = i;.     
3700: 20 20 20 6e 45 71 20 3d 20 70 53 61 6d 70 6c 65     nEq = pSample
3710: 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 68  ->nEq;.        h
3720: 20 3d 20 70 53 61 6d 70 6c 65 2d 3e 69 48 61 73   = pSample->iHas
3730: 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  h;.      }.    }
3740: 0a 20 20 20 20 70 2d 3e 69 4d 69 6e 20 3d 20 69  .    p->iMin = i
3750: 4d 69 6e 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  Min;.  }.}.stati
3760: 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20  c const FuncDef 
3770: 73 74 61 74 33 50 75 73 68 46 75 6e 63 64 65 66  stat3PushFuncdef
3780: 20 3d 20 7b 0a 20 20 35 2c 20 20 20 20 20 20 20   = {.  5,       
3790: 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 41 72 67           /* nArg
37a0: 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46   */.  SQLITE_UTF
37b0: 38 2c 20 20 20 20 20 20 2f 2a 20 69 50 72 65 66  8,      /* iPref
37c0: 45 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  Enc */.  0,     
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
37e0: 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ags */.  0,     
37f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55             /* pU
3800: 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20  serData */.  0, 
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3820: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61  * pNext */.  sta
3830: 74 33 50 75 73 68 2c 20 20 20 20 20 20 20 20 2f  t3Push,        /
3840: 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xFunc */.  0, 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3860: 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20 30 2c 20  * xStep */.  0, 
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3880: 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20  * xFinalize */. 
3890: 20 22 73 74 61 74 33 5f 70 75 73 68 22 2c 20 20   "stat3_push",  
38a0: 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
38b0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
38c0: 20 20 20 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20     /* pHash */. 
38d0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
38e0: 20 20 20 2f 2a 20 70 44 65 73 74 72 75 63 74 6f     /* pDestructo
38f0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  r */.};../*.** I
3900: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3910: 20 74 68 65 20 73 74 61 74 33 5f 67 65 74 28 50   the stat3_get(P
3920: 2c 4e 2c 2e 2e 2e 29 20 53 51 4c 20 66 75 6e 63  ,N,...) SQL func
3930: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
3940: 69 6e 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  ine is.** used t
3950: 6f 20 71 75 65 72 79 20 74 68 65 20 72 65 73 75  o query the resu
3960: 6c 74 73 2e 20 20 43 6f 6e 74 65 6e 74 20 69 73  lts.  Content is
3970: 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 74 68   returned for th
3980: 65 20 4e 74 68 20 73 71 6c 69 74 65 5f 73 74 61  e Nth sqlite_sta
3990: 74 33 0a 2a 2a 20 72 6f 77 20 77 68 65 72 65 20  t3.** row where 
39a0: 4e 20 69 73 20 62 65 74 77 65 65 6e 20 30 20 61  N is between 0 a
39b0: 6e 64 20 53 2d 31 20 61 6e 64 20 53 20 69 73 20  nd S-1 and S is 
39c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
39d0: 6d 70 6c 65 73 2e 20 20 54 68 65 0a 2a 2a 20 76  mples.  The.** v
39e0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
39f0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 6e 75 6d  pends on the num
3a00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3a10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 63 3d 3d  ..**.**   argc==
3a20: 32 20 20 20 20 72 65 73 75 6c 74 3a 20 20 72 6f  2    result:  ro
3a30: 77 69 64 0a 2a 2a 20 20 20 61 72 67 63 3d 3d 33  wid.**   argc==3
3a40: 20 20 20 20 72 65 73 75 6c 74 3a 20 20 6e 45 71      result:  nEq
3a50: 0a 2a 2a 20 20 20 61 72 67 63 3d 3d 34 20 20 20  .**   argc==4   
3a60: 20 72 65 73 75 6c 74 3a 20 20 6e 4c 74 0a 2a 2a   result:  nLt.**
3a70: 20 20 20 61 72 67 63 3d 3d 35 20 20 20 20 72 65     argc==5    re
3a80: 73 75 6c 74 3a 20 20 6e 44 4c 74 0a 2a 2f 0a 73  sult:  nDLt.*/.s
3a90: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 33  tatic void stat3
3aa0: 47 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  Get(.  sqlite3_c
3ab0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3ac0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
3ad0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3ae0: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  rgv.){.  int n =
3af0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
3b00: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 53  nt(argv[1]);.  S
3b10: 74 61 74 33 41 63 63 75 6d 20 2a 70 20 3d 20 28  tat3Accum *p = (
3b20: 53 74 61 74 33 41 63 63 75 6d 2a 29 73 71 6c 69  Stat3Accum*)sqli
3b30: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
3b40: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 61 73 73 65  rgv[0]);..  asse
3b50: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3b60: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 3d 6e 20  ( p->nSample<=n 
3b70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
3b80: 63 68 28 20 61 72 67 63 20 29 7b 0a 20 20 20 20  ch( argc ){.    
3b90: 63 61 73 65 20 32 3a 20 73 71 6c 69 74 65 33 5f  case 2: sqlite3_
3ba0: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e  result_int64(con
3bb0: 74 65 78 74 2c 20 70 2d 3e 61 5b 6e 5d 2e 69 52  text, p->a[n].iR
3bc0: 6f 77 69 64 29 3b 20 62 72 65 61 6b 3b 0a 20 20  owid); break;.  
3bd0: 20 20 63 61 73 65 20 33 3a 20 73 71 6c 69 74 65    case 3: sqlite
3be0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
3bf0: 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 5b 6e 5d 2e  ontext, p->a[n].
3c00: 6e 45 71 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nEq);    break;.
3c10: 20 20 20 20 63 61 73 65 20 34 3a 20 73 71 6c 69      case 4: sqli
3c20: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
3c30: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 5b 6e  (context, p->a[n
3c40: 5d 2e 6e 4c 74 29 3b 20 20 20 20 62 72 65 61 6b  ].nLt);    break
3c50: 3b 0a 20 20 20 20 63 61 73 65 20 35 3a 20 73 71  ;.    case 5: sq
3c60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
3c70: 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 61  64(context, p->a
3c80: 5b 6e 5d 2e 6e 44 4c 74 29 3b 20 20 20 62 72 65  [n].nDLt);   bre
3c90: 61 6b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ak;.  }.}.static
3ca0: 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73   const FuncDef s
3cb0: 74 61 74 33 47 65 74 46 75 6e 63 64 65 66 20 3d  tat3GetFuncdef =
3cc0: 20 7b 0a 20 20 2d 31 2c 20 20 20 20 20 20 20 20   {.  -1,        
3cd0: 20 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a         /* nArg *
3ce0: 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  /.  SQLITE_UTF8,
3cf0: 20 20 20 20 20 20 2f 2a 20 69 50 72 65 66 45 6e        /* iPrefEn
3d00: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
3d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
3d20: 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  s */.  0,       
3d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
3d40: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d60: 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 33  pNext */.  stat3
3d70: 47 65 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Get,         /* 
3d80: 78 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xFunc */.  0,   
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3da0: 78 53 74 65 70 20 2a 2f 0a 20 20 30 2c 20 20 20  xStep */.  0,   
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3dc0: 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22  xFinalize */.  "
3dd0: 73 74 61 74 33 5f 67 65 74 22 2c 20 20 20 20 20  stat3_get",     
3de0: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c  /* zName */.  0,
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20 30 20  /* pHash */.  0 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e20: 2f 2a 20 70 44 65 73 74 72 75 63 74 6f 72 20 2a  /* pDestructor *
3e30: 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  /.};.#endif /* S
3e40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
3e50: 54 33 20 2a 2f 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  T3 */...../*.** 
3e60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
3e70: 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   do an analysis 
3e80: 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  of all indices a
3e90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
3ea0: 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  * a single table
3eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ec0: 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65   analyzeOneTable
3ed0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3ee0: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
3ef0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
3f00: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
3f10: 54 61 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69  Table whose indi
3f20: 63 65 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e  ces are to be an
3f30: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
3f40: 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20  x *pOnlyIdx, /* 
3f50: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c  If not NULL, onl
3f60: 79 20 61 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f  y analyze this o
3f70: 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ne index */.  in
3f80: 74 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f  t iStatCur,    /
3f90: 2a 20 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43  * Index of VdbeC
3fa0: 75 72 73 6f 72 20 74 68 61 74 20 77 72 69 74 65  ursor that write
3fb0: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  s the sqlite_sta
3fc0: 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  t1 table */.  in
3fd0: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 2f  t iMem         /
3fe0: 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  * Available memo
3ff0: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67  ry locations beg
4000: 69 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  in here */.){.  
4010: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4020: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20  arse->db;    /* 
4030: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
4040: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
4050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4060: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f    /* An index to
4070: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
4080: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
4090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40a0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
40b0: 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20   on index being 
40c0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 56 64  analyzed */.  Vd
40d0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
40e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
40f0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
4100: 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70  e being built up
4110: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
4140: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 4f  er */.  int topO
4150: 66 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  fLoop;          
4160: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20       /* The top 
4170: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
4180: 20 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20   int endOfLoop; 
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41a0: 20 54 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   The end of the 
41b0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a  loop */.  int jZ
41c0: 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20 20  eroRows = -1;   
41d0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66         /* Jump f
41e0: 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62  rom here if numb
41f0: 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65  er of rows is ze
4200: 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ro */.  int iDb;
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
4230: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
4240: 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 69  ning pTab */.  i
4250: 6e 74 20 72 65 67 54 61 62 6e 61 6d 65 20 3d 20  nt regTabname = 
4260: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52  iMem++;     /* R
4270: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
4280: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ng table name */
4290: 0a 20 20 69 6e 74 20 72 65 67 49 64 78 6e 61 6d  .  int regIdxnam
42a0: 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  e = iMem++;     
42b0: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
42c0: 61 69 6e 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d  aining index nam
42d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74  e */.  int regSt
42e0: 61 74 31 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  at1 = iMem++;   
42f0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 20      /* The stat 
4300: 63 6f 6c 75 6d 6e 20 6f 66 20 73 71 6c 69 74 65  column of sqlite
4310: 5f 73 74 61 74 31 20 2a 2f 0a 23 69 66 64 65 66  _stat1 */.#ifdef
4320: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4330: 54 41 54 33 0a 20 20 69 6e 74 20 72 65 67 4e 75  TAT3.  int regNu
4340: 6d 45 71 20 3d 20 72 65 67 53 74 61 74 31 3b 20  mEq = regStat1; 
4350: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4360: 20 69 6e 73 74 61 6e 63 65 73 2e 20 20 53 61 6d   instances.  Sam
4370: 65 20 61 73 20 72 65 67 53 74 61 74 31 20 2a 2f  e as regStat1 */
4380: 0a 20 20 69 6e 74 20 72 65 67 4e 75 6d 4c 74 20  .  int regNumLt 
4390: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
43a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
43b0: 73 20 6c 65 73 73 20 74 68 61 6e 20 72 65 67 53  s less than regS
43c0: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  ample */.  int r
43d0: 65 67 4e 75 6d 44 4c 74 20 3d 20 69 4d 65 6d 2b  egNumDLt = iMem+
43e0: 2b 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  +;      /* Numbe
43f0: 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 6b 65  r of distinct ke
4400: 79 73 20 6c 65 73 73 20 74 68 61 6e 20 72 65 67  ys less than reg
4410: 53 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  Sample */.  int 
4420: 72 65 67 53 61 6d 70 6c 65 20 3d 20 69 4d 65 6d  regSample = iMem
4430: 2b 2b 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ++;      /* The 
4440: 6e 65 78 74 20 73 61 6d 70 6c 65 20 76 61 6c 75  next sample valu
4450: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f  e */.  int regRo
4460: 77 69 64 20 3d 20 72 65 67 53 61 6d 70 6c 65 3b  wid = regSample;
4470: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20      /* Rowid of 
4480: 61 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e  a sample */.  in
4490: 74 20 72 65 67 41 63 63 75 6d 20 3d 20 69 4d 65  t regAccum = iMe
44a0: 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  m++;       /* Re
44b0: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 53  gister to hold S
44c0: 74 61 74 33 41 63 63 75 6d 20 6f 62 6a 65 63 74  tat3Accum object
44d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 6f 6f   */.  int regLoo
44e0: 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  p = iMem++;     
44f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
4500: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  er */.  int regC
4510: 6f 75 6e 74 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  ount = iMem++;  
4520: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4530: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
4540: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
4550: 20 20 69 6e 74 20 72 65 67 54 65 6d 70 31 20 3d    int regTemp1 =
4560: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f   iMem++;       /
4570: 2a 20 49 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * Intermediate r
4580: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
4590: 20 72 65 67 54 65 6d 70 32 20 3d 20 69 4d 65 6d   regTemp2 = iMem
45a0: 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ++;       /* Int
45b0: 65 72 6d 65 64 69 61 74 65 20 72 65 67 69 73 74  ermediate regist
45c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 63 65  er */.  int once
45d0: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
45e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
45f0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
4600: 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 72 74 4a 75  */.  int shortJu
4610: 6d 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  mp = 0;         
4620: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
4630: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e   address */.  in
4640: 74 20 69 54 61 62 43 75 72 20 3d 20 70 50 61 72  t iTabCur = pPar
4650: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 2f 2a 20 54  se->nTab++; /* T
4660: 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 23  able cursor */.#
4670: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65 67 43  endif.  int regC
4680: 6f 6c 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  ol = iMem++;    
4690: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
46a0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
46b0: 6e 61 6c 79 7a 65 64 20 74 61 62 6c 65 20 2a 2f  nalyzed table */
46c0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 20 3d 20  .  int regRec = 
46d0: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20  iMem++;         
46e0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
46f0: 69 6e 67 20 63 6f 6d 70 6c 65 74 65 64 20 72 65  ing completed re
4700: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  cord */.  int re
4710: 67 54 65 6d 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20  gTemp = iMem++; 
4720: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
4730: 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
4740: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   */.  int regNew
4750: 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20  Rowid = iMem++; 
4760: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
4770: 74 68 65 20 69 6e 73 65 72 74 65 64 20 72 65 63  the inserted rec
4780: 6f 72 64 20 2a 2f 0a 0a 0a 20 20 76 20 3d 20 73  ord */...  v = s
4790: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
47a0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
47b0: 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61 62 3d  0 || NEVER(pTab=
47c0: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
47d0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  n;.  }.  if( pTa
47e0: 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  b->tnum==0 ){.  
47f0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68    /* Do not gath
4800: 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e  er statistics on
4810: 20 76 69 65 77 73 20 6f 72 20 76 69 72 74 75 61   views or virtua
4820: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  l tables */.    
4830: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
4840: 28 20 6d 65 6d 63 6d 70 28 70 54 61 62 2d 3e 7a  ( memcmp(pTab->z
4850: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
4860: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a   7)==0 ){.    /*
4870: 20 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73   Do not gather s
4880: 74 61 74 69 73 74 69 63 73 20 6f 6e 20 73 79 73  tatistics on sys
4890: 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  tem tables */.  
48a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
48b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
48c0: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
48d0: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 69 44 62  xes(db) );.  iDb
48e0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
48f0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
4900: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
4910: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a  sert( iDb>=0 );.
4920: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4930: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4940: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
4950: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4960: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
4970: 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
4980: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
4990: 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c   SQLITE_ANALYZE,
49a0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
49b0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
49c0: 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
49d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
49e0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 73 74 61  endif..  /* Esta
49f0: 62 6c 69 73 68 20 61 20 72 65 61 64 2d 6c 6f 63  blish a read-loc
4a00: 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 61  k on the table a
4a10: 74 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  t the shared-cac
4a20: 68 65 20 6c 65 76 65 6c 2e 20 2a 2f 0a 20 20 73  he level. */.  s
4a30: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
4a40: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
4a50: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
4a60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 69 49 64  ->zName);..  iId
4a70: 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
4a80: 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
4a90: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
4aa0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67  _String8, 0, reg
4ab0: 54 61 62 6e 61 6d 65 2c 20 30 2c 20 70 54 61 62  Tabname, 0, pTab
4ac0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 66  ->zName, 0);.  f
4ad0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
4ae0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
4af0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
4b00: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
4b10: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a   KeyInfo *pKey;.
4b20: 20 20 20 20 69 6e 74 20 61 64 64 72 49 66 4e 6f      int addrIfNo
4b30: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
4b40: 20 2f 2a 20 61 64 64 72 65 73 73 20 6f 66 20 4f   /* address of O
4b50: 50 5f 49 66 4e 6f 74 20 2a 2f 0a 20 20 20 20 69  P_IfNot */.    i
4b60: 6e 74 20 2a 61 43 68 6e 67 41 64 64 72 3b 20 20  nt *aChngAddr;  
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4b80: 72 72 61 79 20 6f 66 20 6a 75 6d 70 20 69 6e 73  rray of jump ins
4b90: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73  truction address
4ba0: 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  es */..    if( p
4bb0: 4f 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e 6c 79  OnlyIdx && pOnly
4bc0: 49 64 78 21 3d 70 49 64 78 20 29 20 63 6f 6e 74  Idx!=pIdx ) cont
4bd0: 69 6e 75 65 3b 0a 20 20 20 20 56 64 62 65 4e 6f  inue;.    VdbeNo
4be0: 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
4bf0: 65 67 69 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  egin analysis of
4c00: 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
4c10: 65 29 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  e));.    nCol = 
4c20: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
4c30: 20 20 20 61 43 68 6e 67 41 64 64 72 20 3d 20 73     aChngAddr = s
4c40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
4c50: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
4c60: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  )*nCol);.    if(
4c70: 20 61 43 68 6e 67 41 64 64 72 3d 3d 30 20 29 20   aChngAddr==0 ) 
4c80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 4b  continue;.    pK
4c90: 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
4ca0: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
4cb0: 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
4cc0: 69 4d 65 6d 2b 31 2b 28 6e 43 6f 6c 2a 32 29 3e  iMem+1+(nCol*2)>
4cd0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a  pParse->nMem ){.
4ce0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
4cf0: 65 6d 20 3d 20 69 4d 65 6d 2b 31 2b 28 6e 43 6f  em = iMem+1+(nCo
4d00: 6c 2a 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  l*2);.    }..   
4d10: 20 2f 2a 20 4f 70 65 6e 20 61 20 63 75 72 73 6f   /* Open a curso
4d20: 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 74  r to the index t
4d30: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
4d40: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  /.    assert( iD
4d50: 62 3d 3d 73 71 6c 69 74 65 33 53 63 68 65 6d 61  b==sqlite3Schema
4d60: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
4d70: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
4d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d90: 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op4(v, OP_OpenRe
4da0: 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 64  ad, iIdxCur, pId
4db0: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20  x->tnum, iDb,.  
4dc0: 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
4dd0: 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
4de0: 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 56 64 62  ANDOFF);.    Vdb
4df0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
4e00: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
4e10: 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  ;..    /* Popula
4e20: 74 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  te the register 
4e30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
4e40: 6e 64 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  ndex name. */.  
4e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e60: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
4e70: 38 2c 20 30 2c 20 72 65 67 49 64 78 6e 61 6d 65  8, 0, regIdxname
4e80: 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  , 0, pIdx->zName
4e90: 2c 20 30 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  , 0);..#ifdef SQ
4ea0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
4eb0: 33 0a 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29  3.    if( once )
4ec0: 7b 0a 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30  {.      once = 0
4ed0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
4ee0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
4ef0: 20 69 54 61 62 43 75 72 2c 20 69 44 62 2c 20 70   iTabCur, iDb, p
4f00: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
4f10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
4f20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4f30: 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78  , OP_Count, iIdx
4f40: 43 75 72 2c 20 72 65 67 43 6f 75 6e 74 29 3b 0a  Cur, regCount);.
4f50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
4f70: 67 65 72 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ger, SQLITE_STAT
4f80: 33 5f 53 41 4d 50 4c 45 53 2c 20 72 65 67 54 65  3_SAMPLES, regTe
4f90: 6d 70 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mp1);.    sqlite
4fa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4fb0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
4fc0: 67 4e 75 6d 45 71 29 3b 0a 20 20 20 20 73 71 6c  gNumEq);.    sql
4fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4fe0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
4ff0: 20 72 65 67 4e 75 6d 4c 74 29 3b 0a 20 20 20 20   regNumLt);.    
5000: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5010: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
5020: 20 2d 31 2c 20 72 65 67 4e 75 6d 44 4c 74 29 3b   -1, regNumDLt);
5030: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5040: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
5050: 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 43 6f 75  ction, 1, regCou
5060: 6e 74 2c 20 72 65 67 41 63 63 75 6d 2c 0a 20 20  nt, regAccum,.  
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61 74      (char*)&stat
5090: 33 49 6e 69 74 46 75 6e 63 64 65 66 2c 20 50 34  3InitFuncdef, P4
50a0: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
50b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
50c0: 50 35 28 76 2c 20 32 29 3b 0a 23 65 6e 64 69 66  P5(v, 2);.#endif
50d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
50e0: 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 20 20 20 20  E_STAT3 */..    
50f0: 2f 2a 20 54 68 65 20 62 6c 6f 63 6b 20 6f 66 20  /* The block of 
5100: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 69  memory cells ini
5110: 74 69 61 6c 69 7a 65 64 20 68 65 72 65 20 69 73  tialized here is
5120: 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73   used as follows
5130: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
5140: 20 20 20 69 4d 65 6d 3a 20 20 20 20 20 20 20 20     iMem:        
5150: 20 20 20 20 20 20 20 20 0a 20 20 20 20 2a 2a 20          .    ** 
5160: 20 20 20 20 20 20 20 54 68 65 20 74 6f 74 61 6c         The total
5170: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
5180: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  in the table..  
5190: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
51a0: 4d 65 6d 2b 31 20 2e 2e 20 69 4d 65 6d 2b 6e 43  Mem+1 .. iMem+nC
51b0: 6f 6c 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ol: .    **     
51c0: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73     Number of dis
51d0: 74 69 6e 63 74 20 65 6e 74 72 69 65 73 20 69 6e  tinct entries in
51e0: 20 69 6e 64 65 78 20 63 6f 6e 73 69 64 65 72 69   index consideri
51f0: 6e 67 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  ng the .    **  
5200: 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
5210: 4e 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 2c 20  N columns only, 
5220: 77 68 65 72 65 20 4e 20 69 73 20 62 65 74 77 65  where N is betwe
5230: 65 6e 20 31 20 61 6e 64 20 6e 43 6f 6c 2c 20 0a  en 1 and nCol, .
5240: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 69 6e      **        in
5250: 63 6c 75 73 69 76 65 2e 0a 20 20 20 20 2a 2a 0a  clusive..    **.
5260: 20 20 20 20 2a 2a 20 20 20 20 69 4d 65 6d 2b 6e      **    iMem+n
5270: 43 6f 6c 2b 31 20 2e 2e 20 4d 65 6d 2b 32 2a 6e  Col+1 .. Mem+2*n
5280: 43 6f 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20  Col:  .    **   
5290: 20 20 20 20 20 50 72 65 76 69 6f 75 73 20 76 61       Previous va
52a0: 6c 75 65 20 6f 66 20 69 6e 64 65 78 65 64 20 63  lue of indexed c
52b0: 6f 6c 75 6d 6e 73 2c 20 66 72 6f 6d 20 6c 65 66  olumns, from lef
52c0: 74 20 74 6f 20 72 69 67 68 74 2e 0a 20 20 20 20  t to right..    
52d0: 2a 2a 0a 20 20 20 20 2a 2a 20 43 65 6c 6c 73 20  **.    ** Cells 
52e0: 69 4d 65 6d 20 74 68 72 6f 75 67 68 20 69 4d 65  iMem through iMe
52f0: 6d 2b 6e 43 6f 6c 20 61 72 65 20 69 6e 69 74 69  m+nCol are initi
5300: 61 6c 69 7a 65 64 20 74 6f 20 30 2e 20 54 68 65  alized to 0. The
5310: 20 6f 74 68 65 72 73 20 61 72 65 20 0a 20 20 20   others are .   
5320: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
5330: 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 53 51  to contain an SQ
5340: 4c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  L NULL..    */. 
5350: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6e     for(i=0; i<=n
5360: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
5370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5380: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
5390: 2c 20 30 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20  , 0, iMem+i);.  
53a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
53b0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
53c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
53d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
53e0: 6c 2c 20 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b  l, 0, iMem+nCol+
53f0: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  i+1);.    }..   
5400: 20 2f 2a 20 53 74 61 72 74 20 74 68 65 20 61 6e   /* Start the an
5410: 61 6c 79 73 69 73 20 6c 6f 6f 70 2e 20 54 68 69  alysis loop. Thi
5420: 73 20 6c 6f 6f 70 20 72 75 6e 73 20 74 68 72 6f  s loop runs thro
5430: 75 67 68 20 61 6c 6c 20 74 68 65 20 65 6e 74 72  ugh all the entr
5440: 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ies in.    ** th
5450: 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  e index b-tree. 
5460: 20 2a 2f 0a 20 20 20 20 65 6e 64 4f 66 4c 6f 6f   */.    endOfLoo
5470: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  p = sqlite3VdbeM
5480: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5490: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54a0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
54b0: 20 69 49 64 78 43 75 72 2c 20 65 6e 64 4f 66 4c   iIdxCur, endOfL
54c0: 6f 6f 70 29 3b 0a 20 20 20 20 74 6f 70 4f 66 4c  oop);.    topOfL
54d0: 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
54e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
54f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5500: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
5510: 49 6d 6d 2c 20 69 4d 65 6d 2c 20 31 29 3b 20 20  Imm, iMem, 1);  
5520: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f 77  /* Increment row
5530: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20   counter */..   
5540: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
5550: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f  ; i++){.      Co
5560: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
5570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5580: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
5590: 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c 20  mn, iIdxCur, i, 
55a0: 72 65 67 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  regCol);.      i
55b0: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
55c0: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 72 65 63     /* Always rec
55d0: 6f 72 64 20 74 68 65 20 76 65 72 79 20 66 69 72  ord the very fir
55e0: 73 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  st row */.      
55f0: 20 20 61 64 64 72 49 66 4e 6f 74 20 3d 20 73 71    addrIfNot = sq
5600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5610: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4d 65  v, OP_IfNot, iMe
5620: 6d 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  m+1);.      }.  
5630: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
5640: 2d 3e 61 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  ->azColl!=0 );. 
5650: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
5660: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 21 3d 30 20  x->azColl[i]!=0 
5670: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  );.      pColl =
5680: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
5690: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
56a0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a  dx->azColl[i]);.
56b0: 20 20 20 20 20 20 61 43 68 6e 67 41 64 64 72 5b        aChngAddr[
56c0: 69 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  i] = sqlite3Vdbe
56d0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
56e0: 20 72 65 67 43 6f 6c 2c 20 30 2c 20 69 4d 65 6d   regCol, 0, iMem
56f0: 2b 6e 43 6f 6c 2b 69 2b 31 2c 0a 20 20 20 20 20  +nCol+i+1,.     
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 28 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50   (char*)pColl, P
5730: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
5740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5750: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
5760: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
5770: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5780: 6a 75 6d 70 20 69 66 20 63 6f 6c 75 6d 6e 20 25  jump if column %
5790: 64 20 63 68 61 6e 67 65 64 22 2c 20 69 29 29 3b  d changed", i));
57a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
57b0: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
57c0: 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
57d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
57e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
57f0: 64 49 6d 6d 2c 20 72 65 67 4e 75 6d 45 71 2c 20  dImm, regNumEq, 
5800: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
5810: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 63  Comment((v, "inc
5820: 72 20 72 65 70 65 61 74 20 63 6f 75 6e 74 22 29  r repeat count")
5830: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
5840: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
5850: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5860: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64   OP_Goto, 0, end
5870: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 66 6f 72  OfLoop);.    for
5880: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
5890: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
58a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
58b0: 20 61 43 68 6e 67 41 64 64 72 5b 69 5d 29 3b 20   aChngAddr[i]); 
58c0: 20 2f 2a 20 53 65 74 20 6a 75 6d 70 20 64 65 73   /* Set jump des
58d0: 74 20 66 6f 72 20 74 68 65 20 4f 50 5f 4e 65 20  t for the OP_Ne 
58e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  */.      if( i==
58f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
5900: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5910: 28 76 2c 20 61 64 64 72 49 66 4e 6f 74 29 3b 20  (v, addrIfNot); 
5920: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 20 66    /* Jump dest f
5930: 6f 72 20 4f 50 5f 49 66 4e 6f 74 20 2a 2f 0a 23  or OP_IfNot */.#
5940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5950: 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20 20  BLE_STAT3.      
5960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5970: 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
5980: 6f 6e 2c 20 31 2c 20 72 65 67 4e 75 6d 45 71 2c  on, 1, regNumEq,
5990: 20 72 65 67 54 65 6d 70 32 2c 0a 20 20 20 20 20   regTemp2,.     
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61       (char*)&sta
59c0: 74 33 50 75 73 68 46 75 6e 63 64 65 66 2c 20 50  t3PushFuncdef, P
59d0: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
59e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
59f0: 68 61 6e 67 65 50 35 28 76 2c 20 35 29 3b 0a 20  hangeP5(v, 5);. 
5a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5a10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5a20: 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
5a30: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 72  pIdx->nColumn, r
5a40: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
5a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5a60: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 72  Op3(v, OP_Add, r
5a70: 65 67 4e 75 6d 45 71 2c 20 72 65 67 4e 75 6d 4c  egNumEq, regNumL
5a80: 74 2c 20 72 65 67 4e 75 6d 4c 74 29 3b 0a 20 20  t, regNumLt);.  
5a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5aa0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
5ab0: 64 49 6d 6d 2c 20 72 65 67 4e 75 6d 44 4c 74 2c  dImm, regNumDLt,
5ac0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
5ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5ae0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5af0: 20 72 65 67 4e 75 6d 45 71 29 3b 0a 23 65 6e 64   regNumEq);.#end
5b00: 69 66 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  if        .     
5b10: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5b20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5b30: 5f 41 64 64 49 6d 6d 2c 20 69 4d 65 6d 2b 69 2b  _AddImm, iMem+i+
5b40: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
5b50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5b60: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
5b70: 78 43 75 72 2c 20 69 2c 20 69 4d 65 6d 2b 6e 43  xCur, i, iMem+nC
5b80: 6f 6c 2b 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ol+i+1);.    }. 
5b90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5ba0: 28 64 62 2c 20 61 43 68 6e 67 41 64 64 72 29 3b  (db, aChngAddr);
5bb0: 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ..    /* Always 
5bc0: 6a 75 6d 70 20 68 65 72 65 20 61 66 74 65 72 20  jump here after 
5bd0: 75 70 64 61 74 69 6e 67 20 74 68 65 20 69 4d 65  updating the iMe
5be0: 6d 2b 31 2e 2e 2e 69 4d 65 6d 2b 31 2b 6e 43 6f  m+1...iMem+1+nCo
5bf0: 6c 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  l counters */.  
5c00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
5c10: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
5c20: 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 73 71  OfLoop);..    sq
5c30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5c40: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78  v, OP_Next, iIdx
5c50: 43 75 72 2c 20 74 6f 70 4f 66 4c 6f 6f 70 29 3b  Cur, topOfLoop);
5c60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5c70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
5c80: 73 65 2c 20 69 49 64 78 43 75 72 29 3b 0a 23 69  se, iIdxCur);.#i
5c90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5ca0: 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 73 71 6c  LE_STAT3.    sql
5cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5cc0: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31  , OP_Function, 1
5cd0: 2c 20 72 65 67 4e 75 6d 45 71 2c 20 72 65 67 54  , regNumEq, regT
5ce0: 65 6d 70 32 2c 0a 20 20 20 20 20 20 20 20 20 20  emp2,.          
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
5d00: 72 2a 29 26 73 74 61 74 33 50 75 73 68 46 75 6e  r*)&stat3PushFun
5d10: 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  cdef, P4_FUNCDEF
5d20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5d30: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 35 29  beChangeP5(v, 5)
5d40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5d50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
5d60: 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67 4c 6f  teger, -1, regLo
5d70: 6f 70 29 3b 0a 20 20 20 20 73 68 6f 72 74 4a 75  op);.    shortJu
5d80: 6d 70 20 3d 20 0a 20 20 20 20 73 71 6c 69 74 65  mp = .    sqlite
5d90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5da0: 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 4c 6f 6f  P_AddImm, regLoo
5db0: 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 1);.    sqlit
5dc0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
5dd0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31 2c 20  OP_Function, 1, 
5de0: 72 65 67 41 63 63 75 6d 2c 20 72 65 67 54 65 6d  regAccum, regTem
5df0: 70 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p1,.            
5e00: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
5e10: 29 26 73 74 61 74 33 47 65 74 46 75 6e 63 64 65  )&stat3GetFuncde
5e20: 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
5e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5e40: 68 61 6e 67 65 50 35 28 76 2c 20 32 29 3b 0a 20  hangeP5(v, 2);. 
5e50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e60: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
5e70: 6c 2c 20 72 65 67 54 65 6d 70 31 29 3b 0a 20 20  l, regTemp1);.  
5e80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e90: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
5ea0: 73 74 73 2c 20 69 54 61 62 43 75 72 2c 20 73 68  sts, iTabCur, sh
5eb0: 6f 72 74 4a 75 6d 70 2c 20 72 65 67 54 65 6d 70  ortJump, regTemp
5ec0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
5ed0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5ee0: 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 43 75 72 2c  Column, iTabCur,
5ef0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
5f00: 30 5d 2c 20 72 65 67 53 61 6d 70 6c 65 29 3b 0a  0], regSample);.
5f10: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
5f20: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
5f30: 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
5f40: 5b 30 5d 2c 20 72 65 67 53 61 6d 70 6c 65 29 3b  [0], regSample);
5f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5f60: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
5f70: 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 41 63 63  ction, 1, regAcc
5f80: 75 6d 2c 20 72 65 67 4e 75 6d 45 71 2c 0a 20 20  um, regNumEq,.  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61 74      (char*)&stat
5fb0: 33 47 65 74 46 75 6e 63 64 65 66 2c 20 50 34 5f  3GetFuncdef, P4_
5fc0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
5fd0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5fe0: 35 28 76 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c  5(v, 3);.    sql
5ff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
6000: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31  , OP_Function, 1
6010: 2c 20 72 65 67 41 63 63 75 6d 2c 20 72 65 67 4e  , regAccum, regN
6020: 75 6d 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20  umLt,.          
6030: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
6040: 72 2a 29 26 73 74 61 74 33 47 65 74 46 75 6e 63  r*)&stat3GetFunc
6050: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
6060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6070: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 34 29 3b  eChangeP5(v, 4);
6080: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6090: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
60a0: 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 41 63 63  ction, 1, regAcc
60b0: 75 6d 2c 20 72 65 67 4e 75 6d 44 4c 74 2c 0a 20  um, regNumDLt,. 
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61       (char*)&sta
60e0: 74 33 47 65 74 46 75 6e 63 64 65 66 2c 20 50 34  t3GetFuncdef, P4
60f0: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
6100: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6110: 50 35 28 76 2c 20 35 29 3b 0a 20 20 20 20 73 71  P5(v, 5);.    sq
6120: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
6130: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6140: 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 36 2c  , regTabname, 6,
6150: 20 72 65 67 52 65 63 2c 20 22 62 62 62 62 62 62   regRec, "bbbbbb
6160: 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
6170: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6180: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74  OP_NewRowid, iSt
6190: 61 74 43 75 72 2b 31 2c 20 72 65 67 4e 65 77 52  atCur+1, regNewR
61a0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
61b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
61c0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74  OP_Insert, iStat
61d0: 43 75 72 2b 31 2c 20 72 65 67 52 65 63 2c 20 72  Cur+1, regRec, r
61e0: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20  egNewRowid);.   
61f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6200: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
6210: 2c 20 73 68 6f 72 74 4a 75 6d 70 29 3b 0a 20 20  , shortJump);.  
6220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
6230: 70 48 65 72 65 28 76 2c 20 73 68 6f 72 74 4a 75  pHere(v, shortJu
6240: 6d 70 2b 32 29 3b 0a 23 65 6e 64 69 66 20 20 20  mp+2);.#endif   
6250: 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 53 74       ..    /* St
6260: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
6270: 69 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2e  in sqlite_stat1.
6280: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6290: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73  he result is a s
62a0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
62b0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
62c0: 62 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 0a  ble.  The first.
62d0: 20 20 20 20 2a 2a 20 74 77 6f 20 63 6f 6c 75 6d      ** two colum
62e0: 6e 73 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73  ns are the names
62f0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
6300: 64 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74 68  d index.  The th
6310: 69 72 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  ird column.    *
6320: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f  * is a string co
6330: 6d 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74  mposed of a list
6340: 20 6f 66 20 69 6e 74 65 67 65 72 20 73 74 61 74   of integer stat
6350: 69 73 74 69 63 73 20 61 62 6f 75 74 20 74 68 65  istics about the
6360: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20  .    ** index.  
6370: 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
6380: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73  r in the list is
6390: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
63a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 0a 20 20 20  r of entries.   
63b0: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
63c0: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
63d0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67  additional integ
63e0: 65 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 66  er in the list f
63f0: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 63  or each.    ** c
6400: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
6410: 6c 65 2e 20 20 54 68 69 73 20 61 64 64 69 74 69  le.  This additi
6420: 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 73 20  onal integer is 
6430: 61 20 67 75 65 73 73 20 6f 66 20 68 6f 77 20 6d  a guess of how m
6440: 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 73 20  any.    ** rows 
6450: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  of the table the
6460: 20 69 6e 64 65 78 20 77 69 6c 6c 20 73 65 6c 65   index will sele
6470: 63 74 2e 20 20 49 66 20 44 20 69 73 20 74 68 65  ct.  If D is the
6480: 20 63 6f 75 6e 74 20 6f 66 20 64 69 73 74 69 6e   count of distin
6490: 63 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  ct.    ** values
64a0: 20 61 6e 64 20 4b 20 69 73 20 74 68 65 20 74 6f   and K is the to
64b0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  tal number of ro
64c0: 77 73 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74  ws, then the int
64d0: 65 67 65 72 20 69 73 20 63 6f 6d 70 75 74 65 64  eger is computed
64e0: 0a 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20 20 20  .    ** as:.    
64f0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
6500: 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20   I = (K+D-1)/D. 
6510: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
6520: 4b 3d 3d 30 20 74 68 65 6e 20 6e 6f 20 65 6e 74  K==0 then no ent
6530: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ry is made into 
6540: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
6550: 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2a   table.  .    **
6560: 20 49 66 20 4b 3e 30 20 74 68 65 6e 20 69 74 20   If K>0 then it 
6570: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
6580: 73 65 20 74 68 65 20 44 3e 30 20 73 6f 20 64 69  se the D>0 so di
6590: 76 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f 0a 20  vision by zero. 
65a0: 20 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20 70     ** is never p
65b0: 6f 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ossible..    */.
65c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
65d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
65e0: 79 2c 20 69 4d 65 6d 2c 20 72 65 67 53 74 61 74  y, iMem, regStat
65f0: 31 29 3b 0a 20 20 20 20 69 66 28 20 6a 5a 65 72  1);.    if( jZer
6600: 6f 52 6f 77 73 3c 30 20 29 7b 0a 20 20 20 20 20  oRows<0 ){.     
6610: 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c   jZeroRows = sql
6620: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6630: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4d 65 6d  , OP_IfNot, iMem
6640: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
6650: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
6660: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6670: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
6680: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65  P_String8, 0, re
6690: 67 54 65 6d 70 2c 20 30 2c 20 22 20 22 2c 20 30  gTemp, 0, " ", 0
66a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
66b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
66c0: 5f 43 6f 6e 63 61 74 2c 20 72 65 67 54 65 6d 70  _Concat, regTemp
66d0: 2c 20 72 65 67 53 74 61 74 31 2c 20 72 65 67 53  , regStat1, regS
66e0: 74 61 74 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  tat1);.      sql
66f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6700: 2c 20 4f 50 5f 41 64 64 2c 20 69 4d 65 6d 2c 20  , OP_Add, iMem, 
6710: 69 4d 65 6d 2b 69 2b 31 2c 20 72 65 67 54 65 6d  iMem+i+1, regTem
6720: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
6730: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6740: 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 54 65 6d  P_AddImm, regTem
6750: 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  p, -1);.      sq
6760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6770: 76 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20 69 4d  v, OP_Divide, iM
6780: 65 6d 2b 69 2b 31 2c 20 72 65 67 54 65 6d 70 2c  em+i+1, regTemp,
6790: 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20   regTemp);.     
67a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67b0: 70 31 28 76 2c 20 4f 50 5f 54 6f 49 6e 74 2c 20  p1(v, OP_ToInt, 
67c0: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
67d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
67e0: 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  3(v, OP_Concat, 
67f0: 72 65 67 54 65 6d 70 2c 20 72 65 67 53 74 61 74  regTemp, regStat
6800: 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20  1, regStat1);.  
6810: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
6820: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6830: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54  MakeRecord, regT
6840: 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 52 65  abname, 3, regRe
6850: 63 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a 20 20  c, "aaa", 0);.  
6860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6870: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
6880: 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  id, iStatCur, re
6890: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
68a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
68b0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
68c0: 69 53 74 61 74 43 75 72 2c 20 72 65 67 52 65 63  iStatCur, regRec
68d0: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
68e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
68f0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6900: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 7d 0a 0a  G_APPEND);.  }..
6910: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
6920: 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  e has no indices
6930: 2c 20 63 72 65 61 74 65 20 61 20 73 69 6e 67 6c  , create a singl
6940: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 65  e sqlite_stat1 e
6950: 6e 74 72 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ntry.  ** contai
6960: 6e 69 6e 67 20 4e 55 4c 4c 20 61 73 20 74 68 65  ning NULL as the
6970: 20 69 6e 64 65 78 20 6e 61 6d 65 20 61 6e 64 20   index name and 
6980: 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 61 73  the row count as
6990: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 20 20   the content..  
69a0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  */.  if( pTab->p
69b0: 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
69c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
69d0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
69e0: 2c 20 69 49 64 78 43 75 72 2c 20 70 54 61 62 2d  , iIdxCur, pTab-
69f0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
6a00: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6a10: 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   "%s", pTab->zNa
6a20: 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me));.    sqlite
6a30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6a40: 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72  P_Count, iIdxCur
6a50: 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20  , regStat1);.   
6a60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a70: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
6a80: 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 6a 5a  iIdxCur);.    jZ
6a90: 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69 74 65  eroRows = sqlite
6aa0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6ab0: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 53 74 61 74  P_IfNot, regStat
6ac0: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
6ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
6ae0: 48 65 72 65 28 76 2c 20 6a 5a 65 72 6f 52 6f 77  Here(v, jZeroRow
6af0: 73 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77  s);.    jZeroRow
6b00: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  s = sqlite3VdbeA
6b10: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
6b20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6b30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6b40: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 64 78  _Null, 0, regIdx
6b50: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  name);.  sqlite3
6b60: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
6b70: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6b80: 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 52  Tabname, 3, regR
6b90: 65 63 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a 20  ec, "aaa", 0);. 
6ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6bb0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6bc0: 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  d, iStatCur, reg
6bd0: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  NewRowid);.  sql
6be0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6bf0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74  , OP_Insert, iSt
6c00: 61 74 43 75 72 2c 20 72 65 67 52 65 63 2c 20 72  atCur, regRec, r
6c10: 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 73  egNewRowid);.  s
6c20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6c30: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
6c40: 45 4e 44 29 3b 0a 20 20 69 66 28 20 70 50 61 72  END);.  if( pPar
6c50: 73 65 2d 3e 6e 4d 65 6d 3c 72 65 67 52 65 63 20  se->nMem<regRec 
6c60: 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d  ) pParse->nMem =
6c70: 20 72 65 67 52 65 63 3b 0a 20 20 73 71 6c 69 74   regRec;.  sqlit
6c80: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6c90: 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 7d 0a  , jZeroRows);.}.
6ca0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6cb0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6cc0: 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20 72  cause the most r
6cd0: 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c  ecent index anal
6ce0: 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f  ysis to.** be lo
6cf0: 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e  aded into intern
6d00: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 77  al hash tables w
6d10: 68 65 72 65 20 69 73 20 63 61 6e 20 62 65 20 75  here is can be u
6d20: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sed..*/.static v
6d30: 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73  oid loadAnalysis
6d40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6d50: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
6d60: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
6d70: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
6d80: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
6d90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
6da0: 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69  , OP_LoadAnalysi
6db0: 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a  s, iDb);.  }.}..
6dc0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
6dd0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f  ode that will do
6de0: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
6df0: 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61  an entire databa
6e00: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  se.*/.static voi
6e10: 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73  d analyzeDatabas
6e20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6e30: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
6e40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6e50: 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61 20  e->db;.  Schema 
6e60: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
6e70: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
6e80: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
6e90: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f   database iDb */
6ea0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a  .  HashElem *k;.
6eb0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a    int iStatCur;.
6ec0: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 73    int iMem;..  s
6ed0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
6ee0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
6ef0: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74  , 0, iDb);.  iSt
6f00: 61 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  atCur = pParse->
6f10: 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nTab;.  pParse->
6f20: 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65  nTab += 3;.  ope
6f30: 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73  nStatTable(pPars
6f40: 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72  e, iDb, iStatCur
6f50: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20  , 0, 0);.  iMem 
6f60: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
6f70: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6f80: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
6f90: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
6fa0: 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65  ;.  for(k=sqlite
6fb0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
6fc0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b  ma->tblHash); k;
6fd0: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
6fe0: 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(k)){.    Table
6ff0: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a   *pTab = (Table*
7000: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
7010: 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f  k);.    analyzeO
7020: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
7030: 70 54 61 62 2c 20 30 2c 20 69 53 74 61 74 43 75  pTab, 0, iStatCu
7040: 72 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  r, iMem);.  }.  
7050: 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61  loadAnalysis(pPa
7060: 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  rse, iDb);.}../*
7070: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
7080: 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61  e that will do a
7090: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 20  n analysis of a 
70a0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a  single table in.
70b0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 2e 20 20  ** a database.  
70c0: 49 66 20 70 4f 6e 6c 79 49 64 78 20 69 73 20 6e  If pOnlyIdx is n
70d0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
70e0: 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  is a single inde
70f0: 78 0a 2a 2a 20 69 6e 20 70 54 61 62 20 74 68 61  x.** in pTab tha
7100: 74 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 61 6c  t should be anal
7110: 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  yzed..*/.static 
7120: 76 6f 69 64 20 61 6e 61 6c 79 7a 65 54 61 62 6c  void analyzeTabl
7130: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7140: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 49 6e   Table *pTab, In
7150: 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 29 7b 0a  dex *pOnlyIdx){.
7160: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74    int iDb;.  int
7170: 20 69 53 74 61 74 43 75 72 3b 0a 0a 20 20 61 73   iStatCur;..  as
7180: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
7190: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
71a0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
71b0: 75 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64  utexes(pParse->d
71c0: 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  b) );.  iDb = sq
71d0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
71e0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
71f0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
7200: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
7210: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
7220: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69  se, 0, iDb);.  i
7230: 53 74 61 74 43 75 72 20 3d 20 70 50 61 72 73 65  StatCur = pParse
7240: 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65  ->nTab;.  pParse
7250: 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 69  ->nTab += 3;.  i
7260: 66 28 20 70 4f 6e 6c 79 49 64 78 20 29 7b 0a 20  f( pOnlyIdx ){. 
7270: 20 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65     openStatTable
7280: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53  (pParse, iDb, iS
7290: 74 61 74 43 75 72 2c 20 70 4f 6e 6c 79 49 64 78  tatCur, pOnlyIdx
72a0: 2d 3e 7a 4e 61 6d 65 2c 20 22 69 64 78 22 29 3b  ->zName, "idx");
72b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
72c0: 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72  enStatTable(pPar
72d0: 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75  se, iDb, iStatCu
72e0: 72 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  r, pTab->zName, 
72f0: 22 74 62 6c 22 29 3b 0a 20 20 7d 0a 20 20 61 6e  "tbl");.  }.  an
7300: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50  alyzeOneTable(pP
7310: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 4f 6e 6c  arse, pTab, pOnl
7320: 79 49 64 78 2c 20 69 53 74 61 74 43 75 72 2c 20  yIdx, iStatCur, 
7330: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b  pParse->nMem+1);
7340: 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28  .  loadAnalysis(
7350: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a  pParse, iDb);.}.
7360: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7370: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 41 4e 41  code for the ANA
7380: 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 20 20 54  LYZE command.  T
7390: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
73a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
73b0: 77 68 65 6e 20 69 74 20 72 65 63 6f 67 6e 69 7a  when it recogniz
73c0: 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45 20 63 6f  es an ANALYZE co
73d0: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
73e0: 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 20 20 20      ANALYZE     
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
7410: 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3c        ANALYZE  <
7420: 64 61 74 61 62 61 73 65 3e 20 20 20 20 20 20 20  database>       
7430: 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
7440: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
7450: 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
7460: 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
7470: 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
7480: 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
7490: 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
74a0: 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
74b0: 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72  analyzed..** For
74c0: 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 2 analyzes all
74d0: 20 69 6e 64 69 63 65 73 20 74 68 65 20 73 69 6e   indices the sin
74e0: 67 6c 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  gle database nam
74f0: 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33 20 61 6e  ed..** Form 3 an
7500: 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63  alyzes all indic
7510: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
7520: 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
7530: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
7540: 74 65 33 41 6e 61 6c 79 7a 65 28 50 61 72 73 65  te3Analyze(Parse
7550: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
7560: 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
7570: 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71 6c 69 74  pName2){.  sqlit
7580: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7590: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
75a0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
75b0: 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c  *z, *zDb;.  Tabl
75c0: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
75d0: 20 2a 70 49 64 78 3b 0a 20 20 54 6f 6b 65 6e 20   *pIdx;.  Token 
75e0: 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 0a 20 20  *pTableName;..  
75f0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
7600: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
7610: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7620: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
7630: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
7640: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
7650: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
7660: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
7670: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
7680: 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65  llMutexes(pParse
7690: 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53  ->db) );.  if( S
76a0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
76b0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
76c0: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
76d0: 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  n;.  }..  assert
76e0: 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70  ( pName2!=0 || p
76f0: 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66  Name1==0 );.  if
7700: 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
7710: 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41     /* Form 1:  A
7720: 6e 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e  nalyze everythin
7730: 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  g */.    for(i=0
7740: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
7750: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
7760: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  1 ) continue;  /
7770: 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65  * Do not analyze
7780: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
7790: 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c  se */.      anal
77a0: 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72  yzeDatabase(pPar
77b0: 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  se, i);.    }.  
77c0: 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
77d0: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
77e0: 20 46 6f 72 6d 20 32 3a 20 20 41 6e 61 6c 79 7a   Form 2:  Analyz
77f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  e the database o
7800: 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 2a 2f  r table named */
7810: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
7820: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
7830: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
7840: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 6e  b>=0 ){.      an
7850: 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50  alyzeDatabase(pP
7860: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
7880: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7890: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 31  Token(db, pName1
78a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29  );.      if( z )
78b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
78c0: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
78d0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 30 29  dIndex(db, z, 0)
78e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
78f0: 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70    analyzeTable(p
7900: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61  Parse, pIdx->pTa
7910: 62 6c 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ble, pIdx);.    
7920: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
7930: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
7940: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
7950: 20 30 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b   0, z, 0))!=0 ){
7960: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
7970: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
7980: 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pTab, 0);.      
7990: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
79a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
79b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
79c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
79d0: 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20  Form 3: Analyze 
79e0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
79f0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  ied table name *
7a00: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
7a10: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
7a20: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
7a30: 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61  Name2, &pTableNa
7a40: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
7a50: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  >=0 ){.      zDb
7a60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7a70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a 20 3d  zName;.      z =
7a80: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7a90: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
7aa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
7ab0: 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66   z ){.        if
7ac0: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
7ad0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
7ae0: 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20  , zDb))!=0 ){.  
7af0: 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54          analyzeT
7b00: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 49 64  able(pParse, pId
7b10: 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64 78 29  x->pTable, pIdx)
7b20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
7b30: 69 66 28 20 28 70 54 61 62 20 3d 20 73 71 6c 69  if( (pTab = sqli
7b40: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
7b50: 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 7a 44 62  Parse, 0, z, zDb
7b60: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
7b70: 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28     analyzeTable(
7b80: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
7b90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7ba0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7bb0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7bc0: 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 0a 7d  }.    }   .  }.}
7bd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20  ../*.** Used to 
7be0: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
7bf0: 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a   from the analyz
7c00: 65 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67  er reader throug
7c10: 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  h to the.** call
7c20: 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  back routine..*/
7c30: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
7c40: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61  analysisInfo ana
7c50: 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63  lysisInfo;.struc
7c60: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b  t analysisInfo {
7c70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7c80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
7c90: 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  atabase;.};../*.
7ca0: 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b  ** This callback
7cb0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
7cc0: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
7cd0: 77 68 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65  when reading the
7ce0: 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31  .** sqlite_stat1
7cf0: 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20   table.  .**.** 
7d00: 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61      argv[0] = na
7d10: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  me of the table.
7d20: 2a 2a 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d  **     argv[1] =
7d30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
7d40: 65 78 20 28 6d 69 67 68 74 20 62 65 20 4e 55 4c  ex (might be NUL
7d50: 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32  L).**     argv[2
7d60: 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f 66 20 61  ] = results of a
7d70: 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74  nalysis - on int
7d80: 65 67 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f  eger for each co
7d90: 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 69  lumn.**.** Entri
7da0: 65 73 20 66 6f 72 20 77 68 69 63 68 20 61 72 67  es for which arg
7db0: 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70 6c  v[1]==NULL simpl
7dc0: 79 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  y record the num
7dd0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 2a  ber of rows in.*
7de0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  * the table..*/.
7df0: 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
7e00: 73 69 73 4c 6f 61 64 65 72 28 76 6f 69 64 20 2a  sisLoader(void *
7e10: 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c  pData, int argc,
7e20: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
7e30: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
7e40: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70   analysisInfo *p
7e50: 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73  Info = (analysis
7e60: 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49  Info*)pData;.  I
7e70: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
7e80: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
7e90: 20 69 6e 74 20 69 2c 20 63 2c 20 6e 3b 0a 20 20   int i, c, n;.  
7ea0: 74 52 6f 77 63 6e 74 20 76 3b 0a 20 20 63 6f 6e  tRowcnt v;.  con
7eb0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  st char *z;..  a
7ec0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33 20 29  ssert( argc==3 )
7ed0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
7ee0: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 61  ETER2(NotUsed, a
7ef0: 72 67 63 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  rgc);..  if( arg
7f00: 76 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30 5d 3d  v==0 || argv[0]=
7f10: 3d 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d 30  =0 || argv[2]==0
7f20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7f30: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
7f40: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
7f50: 65 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67  e(pInfo->db, arg
7f60: 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61  v[0], pInfo->zDa
7f70: 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
7f80: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
7f90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7fa0: 69 66 28 20 61 72 67 76 5b 31 5d 20 29 7b 0a 20  if( argv[1] ){. 
7fb0: 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69     pIndex = sqli
7fc0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 70 49 6e  te3FindIndex(pIn
7fd0: 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 31 5d 2c  fo->db, argv[1],
7fe0: 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73   pInfo->zDatabas
7ff0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
8000: 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
8010: 0a 20 20 6e 20 3d 20 70 49 6e 64 65 78 20 3f 20  .  n = pIndex ? 
8020: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
8030: 3a 20 30 3b 0a 20 20 7a 20 3d 20 61 72 67 76 5b  : 0;.  z = argv[
8040: 32 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 2a  2];.  for(i=0; *
8050: 7a 20 26 26 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b  z && i<=n; i++){
8060: 0a 20 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20  .    v = 0;.    
8070: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e  while( (c=z[0])>
8080: 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29  ='0' && c<='9' )
8090: 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
80a0: 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20   + c - '0';.    
80b0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
80c0: 20 69 66 28 20 69 3d 3d 30 20 29 20 70 54 61 62   if( i==0 ) pTab
80d0: 6c 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 76 3b  le->nRowEst = v;
80e0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 3d  .    if( pIndex=
80f0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
8100: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
8110: 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66 28  [i] = v;.    if(
8120: 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a   *z==' ' ) z++;.
8130: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a      if( memcmp(z
8140: 2c 20 22 75 6e 6f 72 64 65 72 65 64 22 2c 20 31  , "unordered", 1
8150: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  0)==0 ){.      p
8160: 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
8170: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  d = 1;.      bre
8180: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
8190: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
81a0: 2a 2a 20 49 66 20 74 68 65 20 49 6e 64 65 78 2e  ** If the Index.
81b0: 61 53 61 6d 70 6c 65 20 76 61 72 69 61 62 6c 65  aSample variable
81c0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65   is not NULL, de
81d0: 6c 65 74 65 20 74 68 65 20 61 53 61 6d 70 6c 65  lete the aSample
81e0: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20  [] array.** and 
81f0: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f  its contents..*/
8200: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
8210: 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28  eteIndexSamples(
8220: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
8230: 65 78 20 2a 70 49 64 78 29 7b 0a 23 69 66 64 65  ex *pIdx){.#ifde
8240: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8250: 53 54 41 54 33 0a 20 20 69 66 28 20 70 49 64 78  STAT3.  if( pIdx
8260: 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20  ->aSample ){.   
8270: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28   int j;.    for(
8280: 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 53 61  j=0; j<pIdx->nSa
8290: 6d 70 6c 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  mple; j++){.    
82a0: 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70    IndexSample *p
82b0: 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c   = &pIdx->aSampl
82c0: 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[j];.      if( 
82d0: 70 2d 3e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  p->eType==SQLITE
82e0: 5f 54 45 58 54 20 7c 7c 20 70 2d 3e 65 54 79 70  _TEXT || p->eTyp
82f0: 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  e==SQLITE_BLOB )
8300: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8310: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
8320: 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .z);.      }.   
8330: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
8340: 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 61  Free(db, pIdx->a
8350: 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  Sample);.  }.  i
8360: 66 28 20 64 62 20 26 26 20 64 62 2d 3e 70 6e 42  f( db && db->pnB
8370: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
8380: 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c      pIdx->nSampl
8390: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 2d  e = 0;.    pIdx-
83a0: 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20  >aSample = 0;.  
83b0: 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
83c0: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
83d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
83e0: 45 52 28 70 49 64 78 29 3b 0a 23 65 6e 64 69 66  ER(pIdx);.#endif
83f0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8400: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f  E_ENABLE_STAT3./
8410: 2a 0a 2a 2a 20 4c 6f 61 64 20 63 6f 6e 74 65 6e  *.** Load conten
8420: 74 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  t from the sqlit
8430: 65 5f 73 74 61 74 33 20 74 61 62 6c 65 20 69 6e  e_stat3 table in
8440: 74 6f 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61  to the Index.aSa
8450: 6d 70 6c 65 5b 5d 0a 2a 2a 20 61 72 72 61 79 73  mple[].** arrays
8460: 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e   of all indices.
8470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
8480: 6f 61 64 53 74 61 74 33 28 73 71 6c 69 74 65 33  oadStat3(sqlite3
8490: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
84a0: 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63   *zDb){.  int rc
84b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
84c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
84d0: 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75 62  t codes from sub
84e0: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 73 71  routines */.  sq
84f0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
8500: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41  t = 0;      /* A
8510: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
8520: 62 65 69 6e 67 20 72 75 6e 20 2a 2f 0a 20 20 63  being run */.  c
8530: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8550: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
8560: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 49  statement */.  I
8570: 6e 64 65 78 20 2a 70 50 72 65 76 49 64 78 20 3d  ndex *pPrevIdx =
8580: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
8590: 50 72 65 76 69 6f 75 73 20 69 6e 64 65 78 20 69  Previous index i
85a0: 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  n the loop */.  
85b0: 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85d0: 20 73 6c 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61   slot in pIdx->a
85e0: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 6e 65 78  Sample[] for nex
85f0: 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e  t sample */.  in
8600: 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
8610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8620: 61 74 61 74 79 70 65 20 6f 66 20 61 20 73 61 6d  atatype of a sam
8630: 70 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 53 61  ple */.  IndexSa
8640: 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 3b 20 20  mple *pSample;  
8650: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74         /* A slot
8660: 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c   in pIdx->aSampl
8670: 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73  e[] */..  if( !s
8680: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
8690: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
86a0: 33 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  3", zDb) ){.    
86b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
86c0: 3b 0a 20 20 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20  ;.  }..  zSql = 
86d0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
86e0: 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  b, .      "SELEC
86f0: 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46  T idx,count(*) F
8700: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
8710: 61 74 33 22 0a 20 20 20 20 20 20 22 20 47 52 4f  at3".      " GRO
8720: 55 50 20 42 59 20 69 64 78 22 2c 20 7a 44 62 29  UP BY idx", zDb)
8730: 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b  ;.  if( !zSql ){
8740: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8750: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
8760: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
8770: 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  pare(db, zSql, -
8780: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
8790: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
87a0: 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  b, zSql);.  if( 
87b0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
87c0: 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
87d0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
87e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
87f0: 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20   char *zIndex;  
8800: 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a   /* Index name *
8810: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
8820: 78 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  x;    /* Pointer
8830: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62   to the index ob
8840: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
8850: 6e 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 4e  nSample;    /* N
8860: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
8870: 20 2a 2f 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20   */..    zIndex 
8880: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
8890: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
88a0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
88b0: 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e   zIndex==0 ) con
88c0: 74 69 6e 75 65 3b 0a 20 20 20 20 6e 53 61 6d 70  tinue;.    nSamp
88d0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  le = sqlite3_col
88e0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
88f0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 61 6d 70  );.    if( nSamp
8900: 6c 65 3e 32 35 35 20 29 20 63 6f 6e 74 69 6e 75  le>255 ) continu
8910: 65 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71  e;.    pIdx = sq
8920: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
8930: 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b  b, zIndex, zDb);
8940: 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
8950: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8960: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
8970: 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  Sample==0 );.   
8980: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3d   pIdx->nSample =
8990: 20 28 75 38 29 6e 53 61 6d 70 6c 65 3b 0a 20 20   (u8)nSample;.  
89a0: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20    pIdx->aSample 
89b0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
89c0: 65 72 6f 28 20 6e 53 61 6d 70 6c 65 2a 73 69 7a  ero( nSample*siz
89d0: 65 6f 66 28 49 6e 64 65 78 53 61 6d 70 6c 65 29  eof(IndexSample)
89e0: 20 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 76   );.    pIdx->av
89f0: 67 45 71 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f  gEq = pIdx->aiRo
8a00: 77 45 73 74 5b 31 5d 3b 0a 20 20 20 20 69 66 28  wEst[1];.    if(
8a10: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3d 3d   pIdx->aSample==
8a20: 30 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  0 ){.      db->m
8a30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
8a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8a50: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
8a60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8a70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
8a80: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
8a90: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
8aa0: 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  mt);.  if( rc ) 
8ab0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 7a 53  return rc;..  zS
8ac0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
8ad0: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 22  ntf(db, .      "
8ae0: 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e  SELECT idx,neq,n
8af0: 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46  lt,ndlt,sample F
8b00: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
8b10: 61 74 33 22 2c 20 7a 44 62 29 3b 0a 20 20 69 66  at3", zDb);.  if
8b20: 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72  ( !zSql ){.    r
8b30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8b40: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
8b50: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64  qlite3_prepare(d
8b60: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
8b70: 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
8b80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
8b90: 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  l);.  if( rc ) r
8ba0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69  eturn rc;..  whi
8bb0: 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
8bc0: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
8bd0: 52 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ROW ){.    char 
8be0: 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e  *zIndex;   /* In
8bf0: 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  dex name */.    
8c00: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
8c10: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
8c20: 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e index object *
8c30: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
8c40: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8c50: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 74 52 6f  unter */.    tRo
8c60: 77 63 6e 74 20 73 75 6d 45 71 3b 20 20 2f 2a 20  wcnt sumEq;  /* 
8c70: 53 75 6d 20 6f 66 20 74 68 65 20 6e 45 71 20 76  Sum of the nEq v
8c80: 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 20 20 7a 49  alues */..    zI
8c90: 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73  ndex = (char *)s
8ca0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
8cb0: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
8cc0: 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20    if( zIndex==0 
8cd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8ce0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
8cf0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 49 6e 64  ndIndex(db, zInd
8d00: 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  ex, zDb);.    if
8d10: 28 20 70 49 64 78 3d 3d 30 20 29 20 63 6f 6e 74  ( pIdx==0 ) cont
8d20: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
8d30: 64 78 3d 3d 70 50 72 65 76 49 64 78 20 29 7b 0a  dx==pPrevIdx ){.
8d40: 20 20 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20        idx++;.   
8d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
8d60: 72 65 76 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  revIdx = pIdx;. 
8d70: 20 20 20 20 20 69 64 78 20 3d 20 30 3b 0a 20 20       idx = 0;.  
8d80: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
8d90: 69 64 78 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  idx<pIdx->nSampl
8da0: 65 20 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  e );.    pSample
8db0: 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c   = &pIdx->aSampl
8dc0: 65 5b 69 64 78 5d 3b 0a 20 20 20 20 70 53 61 6d  e[idx];.    pSam
8dd0: 70 6c 65 2d 3e 6e 45 71 20 3d 20 28 74 52 6f 77  ple->nEq = (tRow
8de0: 63 6e 74 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cnt)sqlite3_colu
8df0: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
8e00: 31 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  1);.    pSample-
8e10: 3e 6e 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 29  >nLt = (tRowcnt)
8e20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
8e30: 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 29 3b 0a  nt64(pStmt, 2);.
8e40: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 44 4c      pSample->nDL
8e50: 74 20 3d 20 28 74 52 6f 77 63 6e 74 29 73 71 6c  t = (tRowcnt)sql
8e60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
8e70: 34 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  4(pStmt, 3);.   
8e80: 20 69 66 28 20 69 64 78 3d 3d 70 49 64 78 2d 3e   if( idx==pIdx->
8e90: 6e 53 61 6d 70 6c 65 2d 31 20 29 7b 0a 20 20 20  nSample-1 ){.   
8ea0: 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e     if( pSample->
8eb0: 6e 44 4c 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  nDLt>0 ){.      
8ec0: 20 20 66 6f 72 28 69 3d 30 2c 20 73 75 6d 45 71    for(i=0, sumEq
8ed0: 3d 30 3b 20 69 3c 3d 69 64 78 2d 31 3b 20 69 2b  =0; i<=idx-1; i+
8ee0: 2b 29 20 73 75 6d 45 71 20 2b 3d 20 70 49 64 78  +) sumEq += pIdx
8ef0: 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 45 71  ->aSample[i].nEq
8f00: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
8f10: 61 76 67 45 71 20 3d 20 28 70 53 61 6d 70 6c 65  avgEq = (pSample
8f20: 2d 3e 6e 4c 74 20 2d 20 73 75 6d 45 71 29 2f 70  ->nLt - sumEq)/p
8f30: 53 61 6d 70 6c 65 2d 3e 6e 44 4c 74 3b 0a 20 20  Sample->nDLt;.  
8f40: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8f50: 70 49 64 78 2d 3e 61 76 67 45 71 3c 3d 30 20 29  pIdx->avgEq<=0 )
8f60: 20 70 49 64 78 2d 3e 61 76 67 45 71 20 3d 20 31   pIdx->avgEq = 1
8f70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 54 79 70  ;.    }.    eTyp
8f80: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
8f90: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 34  mn_type(pStmt, 4
8fa0: 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  );.    pSample->
8fb0: 65 54 79 70 65 20 3d 20 28 75 38 29 65 54 79 70  eType = (u8)eTyp
8fc0: 65 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 65  e;.    switch( e
8fd0: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
8fe0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
8ff0: 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 53 61  R: {.        pSa
9000: 6d 70 6c 65 2d 3e 75 2e 69 20 3d 20 73 71 6c 69  mple->u.i = sqli
9010: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
9020: 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20  (pStmt, 4);.    
9030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9040: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 51   }.      case SQ
9050: 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  LITE_FLOAT: {.  
9060: 20 20 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 75        pSample->u
9070: 2e 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .r = sqlite3_col
9080: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
9090: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 4);.        br
90a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
90b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
90c0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 62  ULL: {.        b
90d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
90e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
90f0: 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
9100: 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79 70 65  TE_TEXT || eType
9110: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 3b  ==SQLITE_BLOB );
9120: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74   {.        const
9130: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
9140: 74 20 63 68 61 72 20 2a 29 28 0a 20 20 20 20 20  t char *)(.     
9150: 20 20 20 20 20 20 20 20 20 28 65 54 79 70 65 3d           (eType=
9160: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 29 20 3f 0a  =SQLITE_BLOB) ?.
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
9180: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
9190: 62 28 70 53 74 6d 74 2c 20 34 29 3a 0a 20 20 20  b(pStmt, 4):.   
91a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
91b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
91c0: 53 74 6d 74 2c 20 34 29 0a 20 20 20 20 20 20 20  Stmt, 4).       
91d0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
91e0: 6e 74 20 6e 20 3d 20 7a 20 3f 20 73 71 6c 69 74  nt n = z ? sqlit
91f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
9200: 70 53 74 6d 74 2c 20 34 29 20 3a 20 30 3b 0a 20  pStmt, 4) : 0;. 
9210: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 30 78 66         if( n>0xf
9220: 66 66 66 20 29 20 6e 20 3d 20 30 78 66 66 66 66  fff ) n = 0xffff
9230: 3b 0a 20 20 20 20 20 20 20 20 70 53 61 6d 70 6c  ;.        pSampl
9240: 65 2d 3e 6e 42 79 74 65 20 3d 20 28 75 31 36 29  e->nByte = (u16)
9250: 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  n;.        if( n
9260: 20 3c 20 31 29 7b 0a 20 20 20 20 20 20 20 20 20   < 1){.         
9270: 20 70 53 61 6d 70 6c 65 2d 3e 75 2e 7a 20 3d 20   pSample->u.z = 
9280: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
9290: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 61 6d  {.          pSam
92a0: 70 6c 65 2d 3e 75 2e 7a 20 3d 20 73 71 6c 69 74  ple->u.z = sqlit
92b0: 65 33 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20  e3Malloc(n);.   
92c0: 20 20 20 20 20 20 20 69 66 28 20 70 53 61 6d 70         if( pSamp
92d0: 6c 65 2d 3e 75 2e 7a 3d 3d 30 20 29 7b 0a 20 20  le->u.z==0 ){.  
92e0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
92f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
9300: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9310: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
9320: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mt);.           
9330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9340: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
9350: 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
9360: 70 79 28 70 53 61 6d 70 6c 65 2d 3e 75 2e 7a 2c  py(pSample->u.z,
9370: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   z, n);.        
9380: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
9390: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
93a0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
93b0: 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  tmt);.}.#endif /
93c0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
93d0: 53 54 41 54 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT3 */../*.** 
93e0: 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Load the content
93f0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
9400: 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65 5f  tat1 and sqlite_
9410: 73 74 61 74 33 20 74 61 62 6c 65 73 2e 20 54 68  stat3 tables. Th
9420: 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
9430: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 72   sqlite_stat1 ar
9440: 65 20 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61  e used to popula
9450: 74 65 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  te the Index.aiR
9460: 6f 77 45 73 74 5b 5d 0a 2a 2a 20 61 72 72 61 79  owEst[].** array
9470: 73 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  s. The contents 
9480: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  of sqlite_stat3 
9490: 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70 75  are used to popu
94a0: 6c 61 74 65 20 74 68 65 0a 2a 2a 20 49 6e 64 65  late the.** Inde
94b0: 78 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  x.aSample[] arra
94c0: 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
94d0: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
94e0: 62 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ble is not prese
94f0: 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
9500: 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  se, SQLITE_ERROR
9510: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
9520: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
9530: 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e  ven if SQLITE_EN
9540: 41 42 4c 45 5f 53 54 41 54 33 20 77 61 73 20 64  ABLE_STAT3 was d
9550: 65 66 69 6e 65 64 20 0a 2a 2a 20 64 75 72 69 6e  efined .** durin
9560: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e  g compilation an
9570: 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  d the sqlite_sta
9580: 74 33 20 74 61 62 6c 65 20 69 73 20 70 72 65 73  t3 table is pres
9590: 65 6e 74 2c 20 6e 6f 20 64 61 74 61 20 69 73 20  ent, no data is 
95a0: 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 69 74  .** read from it
95b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
95c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20 77  E_ENABLE_STAT3 w
95d0: 61 73 20 64 65 66 69 6e 65 64 20 64 75 72 69 6e  as defined durin
95e0: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e  g compilation an
95f0: 64 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  d the .** sqlite
9600: 5f 73 74 61 74 33 20 74 61 62 6c 65 20 69 73 20  _stat3 table is 
9610: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
9620: 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c  he database, SQL
9630: 49 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20  ITE_ERROR is.** 
9640: 72 65 74 75 72 6e 65 64 2e 20 48 6f 77 65 76 65  returned. Howeve
9650: 72 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c  r, in this case,
9660: 20 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72   data is read fr
9670: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
9680: 61 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66  at1.** table (if
9690: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 29 20   it is present) 
96a0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
96b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
96c0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
96d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  this function al
96e0: 77 61 79 73 20 73 65 74 73 20 64 62 2d 3e 6d 61  ways sets db->ma
96f0: 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54  llocFailed..** T
9700: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
9710: 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
9720: 20 63 61 72 65 20 61 62 6f 75 74 20 6f 74 68 65   care about othe
9730: 72 20 65 72 72 6f 72 73 2c 20 74 68 65 20 72 65  r errors, the re
9740: 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79  turn.** code may
9750: 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   be ignored..*/.
9760: 69 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  int sqlite3Analy
9770: 73 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20  sisLoad(sqlite3 
9780: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
9790: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49   analysisInfo sI
97a0: 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  nfo;.  HashElem 
97b0: 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  *i;.  char *zSql
97c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
97d0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
97e0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
97f0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
9800: 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b  b[iDb].pBt!=0 );
9810: 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 61 6e 79  ..  /* Clear any
9820: 20 70 72 69 6f 72 20 73 74 61 74 69 73 74 69 63   prior statistic
9830: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  s */.  assert( s
9840: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
9850: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
9860: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ) );.  for(i=sql
9870: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9880: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
9890: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 69 3b 69  ma->idxHash);i;i
98a0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
98b0: 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  i)){.    Index *
98c0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
98d0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71  hData(i);.    sq
98e0: 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
98f0: 73 74 28 70 49 64 78 29 3b 0a 23 69 66 64 65 66  st(pIdx);.#ifdef
9900: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9910: 54 41 54 33 0a 20 20 20 20 73 71 6c 69 74 65 33  TAT3.    sqlite3
9920: 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c  DeleteIndexSampl
9930: 65 73 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20  es(db, pIdx);.  
9940: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20    pIdx->aSample 
9950: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
9960: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
9970: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 71 6c  ake sure the sql
9980: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
9990: 65 78 69 73 74 73 20 2a 2f 0a 20 20 73 49 6e 66  exists */.  sInf
99a0: 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e  o.db = db;.  sIn
99b0: 66 6f 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64  fo.zDatabase = d
99c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
99d0: 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
99e0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73  FindTable(db, "s
99f0: 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49  qlite_stat1", sI
9a00: 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3d 3d  nfo.zDatabase)==
9a10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9a20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9a30: 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 6e 65 77  }..  /* Load new
9a40: 20 73 74 61 74 69 73 74 69 63 73 20 6f 75 74 20   statistics out 
9a50: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
9a60: 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7a  at1 table */.  z
9a70: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
9a80: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
9a90: 22 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c  "SELECT tbl,idx,
9aa0: 73 74 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c  stat FROM %Q.sql
9ab0: 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66  ite_stat1", sInf
9ac0: 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  o.zDatabase);.  
9ad0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
9ae0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9af0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
9b00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
9b10: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 61  exec(db, zSql, a
9b20: 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c 20 26  nalysisLoader, &
9b30: 73 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 73  sInfo, 0);.    s
9b40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9b50: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20   zSql);.  }...  
9b60: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 74 61 74  /* Load the stat
9b70: 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20  istics from the 
9b80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62  sqlite_stat3 tab
9b90: 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  le. */.#ifdef SQ
9ba0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
9bb0: 33 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  3.  if( rc==SQLI
9bc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
9bd0: 3d 20 6c 6f 61 64 53 74 61 74 33 28 64 62 2c 20  = loadStat3(db, 
9be0: 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29  sInfo.zDatabase)
9bf0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
9c00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
9c10: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 64 62 2d 3e  OMEM ){.    db->
9c20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
9c30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9c40: 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  c;.}...#endif /*
9c50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
9c60: 4c 59 5a 45 20 2a 2f 0a                          LYZE */.