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

Artifact f2b6e33f13ea763fa26425ac2f37249c56153ccd:


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 7b 0a 20 20 20 20  if( pTab ){.    
1ef0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
1f00: 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
1f10: 54 61 62 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  Tab, iDb, 0);.  
1f20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
1f40: 65 20 6e 65 77 20 73 74 61 74 69 73 74 69 63 20  e new statistic 
1f50: 74 61 62 6c 65 73 20 69 66 20 74 68 65 79 20 64  tables if they d
1f60: 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  o not exist, or 
1f70: 63 6c 65 61 72 20 74 68 65 6d 0a 20 20 2a 2a 20  clear them.  ** 
1f80: 69 66 20 74 68 65 79 20 64 6f 20 61 6c 72 65 61  if they do alrea
1f90: 64 79 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  dy exist..  */. 
1fa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
1fb0: 79 53 69 7a 65 28 61 54 61 62 6c 65 29 3b 20 69  ySize(aTable); i
1fc0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1fd0: 68 61 72 20 2a 7a 54 61 62 20 3d 20 61 54 61 62  har *zTab = aTab
1fe0: 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  le[i].zName;.   
1ff0: 20 54 61 62 6c 65 20 2a 70 53 74 61 74 3b 0a 20   Table *pStat;. 
2000: 20 20 20 69 66 28 20 28 70 53 74 61 74 20 3d 20     if( (pStat = 
2010: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2020: 28 64 62 2c 20 7a 54 61 62 2c 20 70 44 62 2d 3e  (db, zTab, pDb->
2030: 7a 4e 61 6d 65 29 29 3d 3d 30 20 29 7b 0a 20 20  zName))==0 ){.  
2040: 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74      /* The sqlit
2050: 65 5f 73 74 61 74 5b 31 32 5d 20 74 61 62 6c 65  e_stat[12] table
2060: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2070: 20 43 72 65 61 74 65 20 69 74 2e 20 4e 6f 74 65   Create it. Note
2080: 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 2a   that a .      *
2090: 2a 20 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66  * side-effect of
20a0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
20b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  E statement is t
20c0: 6f 20 6c 65 61 76 65 20 74 68 65 20 72 6f 6f 74  o leave the root
20d0: 70 61 67 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  page .      ** o
20e0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
20f0: 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72  in register pPar
2100: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 20 54 68 69  se->regRoot. Thi
2110: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 0a  s is important .
2120: 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
2130: 20 74 68 65 20 4f 70 65 6e 57 72 69 74 65 20 6f   the OpenWrite o
2140: 70 63 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c 6c  pcode below will
2150: 20 62 65 20 6e 65 65 64 69 6e 67 20 69 74 2e 20   be needing it. 
2160: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2170: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
2180: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
2190: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 25  REATE TABLE %Q.%
21a0: 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a 4e 61  s(%s)", pDb->zNa
21b0: 6d 65 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c 65  me, zTab, aTable
21c0: 5b 69 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20 20  [i].zCols.      
21d0: 29 3b 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b 69  );.      aRoot[i
21e0: 5d 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ] = pParse->regR
21f0: 6f 6f 74 3b 0a 20 20 20 20 20 20 61 43 72 65 61  oot;.      aCrea
2200: 74 65 54 62 6c 5b 69 5d 20 3d 20 31 3b 0a 20 20  teTbl[i] = 1;.  
2210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2220: 2a 20 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65  * The table alre
2230: 61 64 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a  ady exists. If z
2240: 57 68 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Where is not NUL
2250: 4c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e  L, delete all en
2260: 74 72 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20  tries .      ** 
2270: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2280: 74 68 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65  the table zWhere
2290: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e  . If zWhere is N
22a0: 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a  ULL, delete the.
22b0: 20 20 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20        ** entire 
22c0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22d0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
22e0: 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74  aRoot[i] = pStat
22f0: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 73 71  ->tnum;.      sq
2300: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2310: 50 61 72 73 65 2c 20 69 44 62 2c 20 61 52 6f 6f  Parse, iDb, aRoo
2320: 74 5b 69 5d 2c 20 31 2c 20 7a 54 61 62 29 3b 0a  t[i], 1, zTab);.
2330: 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65        if( zWhere
2340: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2350: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
2360: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
2370: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
2380: 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
2390: 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  ", pDb->zName, z
23a0: 54 61 62 2c 20 7a 57 68 65 72 65 54 79 70 65 2c  Tab, zWhereType,
23b0: 20 7a 57 68 65 72 65 0a 20 20 20 20 20 20 20 20   zWhere.        
23c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
23e0: 71 6c 69 74 65 5f 73 74 61 74 5b 31 32 5d 20 74  qlite_stat[12] t
23f0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
2400: 73 74 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c  sts.  Delete all
2410: 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
2420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2430: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
2440: 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b   aRoot[i], iDb);
2450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2460: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
2470: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33  e sqlite_stat[13
2480: 5d 20 74 61 62 6c 65 73 20 66 6f 72 20 77 72 69  ] tables for wri
2490: 74 69 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ting. */.  for(i
24a0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
24b0: 61 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20  aTable); i++){. 
24c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
24e0: 72 69 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69  rite, iStatCur+i
24f0: 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29  , aRoot[i], iDb)
2500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2510: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
2520: 20 28 63 68 61 72 20 2a 29 33 2c 20 50 34 5f 49   (char *)3, P4_I
2530: 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  NT32);.    sqlit
2540: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2550: 2c 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29  , aCreateTbl[i])
2560: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2570: 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65  ecommended numbe
2580: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72  r of samples for
2590: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a 2a 2f   sqlite_stat3.*/
25a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25b0: 53 54 41 54 33 5f 53 41 4d 50 4c 45 53 0a 23 20  STAT3_SAMPLES.# 
25c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54  define SQLITE_ST
25d0: 41 54 33 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23  AT3_SAMPLES 24.#
25e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72  endif../*.** Thr
25f0: 65 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ee SQL functions
2600: 20 2d 20 73 74 61 74 33 5f 69 6e 69 74 28 29 2c   - stat3_init(),
2610: 20 73 74 61 74 33 5f 70 75 73 68 28 29 2c 20 61   stat3_push(), a
2620: 6e 64 20 73 74 61 74 33 5f 70 6f 70 28 29 20 2d  nd stat3_pop() -
2630: 0a 2a 2a 20 73 68 61 72 65 20 61 6e 20 69 6e 73  .** share an ins
2640: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2650: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2660: 20 74 6f 20 68 6f 6c 64 20 74 68 65 69 72 20 73   to hold their s
2670: 74 61 74 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  tate.** informat
2680: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
2690: 73 74 72 75 63 74 20 53 74 61 74 33 41 63 63 75  struct Stat3Accu
26a0: 6d 20 53 74 61 74 33 41 63 63 75 6d 3b 0a 73 74  m Stat3Accum;.st
26b0: 72 75 63 74 20 53 74 61 74 33 41 63 63 75 6d 20  ruct Stat3Accum 
26c0: 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  {.  tRowcnt nRow
26d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26e0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
26f0: 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  in the entire ta
2700: 62 6c 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  ble */.  tRowcnt
2710: 20 6e 50 53 61 6d 70 6c 65 3b 20 20 20 20 20 20   nPSample;      
2720: 20 20 20 2f 2a 20 48 6f 77 20 6f 66 74 65 6e 20     /* How often 
2730: 74 6f 20 64 6f 20 61 20 70 65 72 69 6f 64 69 63  to do a periodic
2740: 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74   sample */.  int
2750: 20 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20   iMin;          
2760: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2770: 6f 66 20 65 6e 74 72 79 20 77 69 74 68 20 6d 69  of entry with mi
2780: 6e 69 6d 75 6d 20 6e 45 71 20 61 6e 64 20 68 61  nimum nEq and ha
2790: 73 68 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 53 61  sh */.  int mxSa
27a0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  mple;           
27b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
27c0: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  ber of samples t
27d0: 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 2a 2f 0a  o accumulate */.
27e0: 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20 20    int nSample;  
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2800: 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
2810: 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 75 33   samples */.  u3
2820: 32 20 69 50 72 6e 3b 20 20 20 20 20 20 20 20 20  2 iPrn;         
2830: 20 20 20 20 20 20 20 20 2f 2a 20 50 73 65 75 64          /* Pseud
2840: 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  o-random number 
2850: 75 73 65 64 20 66 6f 72 20 73 61 6d 70 6c 69 6e  used for samplin
2860: 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 74  g */.  struct St
2870: 61 74 33 53 61 6d 70 6c 65 20 7b 0a 20 20 20 20  at3Sample {.    
2880: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
2890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
28a0: 77 69 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c  wid in main tabl
28b0: 65 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a  e of the key */.
28c0: 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 3b      tRowcnt nEq;
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e0: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 6e  * sqlite_stat3.n
28f0: 45 71 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e  Eq */.    tRowcn
2900: 74 20 6e 4c 74 3b 20 20 20 20 20 20 20 20 20 20  t nLt;          
2910: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73       /* sqlite_s
2920: 74 61 74 33 2e 6e 4c 74 20 2a 2f 0a 20 20 20 20  tat3.nLt */.    
2930: 74 52 6f 77 63 6e 74 20 6e 44 4c 74 3b 20 20 20  tRowcnt nDLt;   
2940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
2950: 6c 69 74 65 5f 73 74 61 74 33 2e 6e 44 4c 74 20  lite_stat3.nDLt 
2960: 2a 2f 0a 20 20 20 20 75 38 20 69 73 50 53 61 6d  */.    u8 isPSam
2970: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
2980: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
2990: 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a  eriodic sample *
29a0: 2f 0a 20 20 20 20 75 33 32 20 69 48 61 73 68 3b  /.    u32 iHash;
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 2f 2a 20 54 69 65 62 72 65 61 6b 65 72 20 68   /* Tiebreaker h
29d0: 61 73 68 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 20  ash */.  } *a;  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f     /* An array o
2a00: 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 7d 3b 0a  f samples */.};.
2a10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2a20: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 2f 2a 0a 2a  NABLE_STAT3./*.*
2a30: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2a40: 20 6f 66 20 74 68 65 20 73 74 61 74 33 5f 69 6e   of the stat3_in
2a50: 69 74 28 43 2c 53 29 20 53 51 4c 20 66 75 6e 63  it(C,S) SQL func
2a60: 74 69 6f 6e 2e 20 20 54 68 65 20 74 77 6f 20 70  tion.  The two p
2a70: 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72 65  arameters.** are
2a80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2a90: 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2aa0: 20 6f 72 20 69 6e 64 65 78 20 28 43 29 20 61 6e   or index (C) an
2ab0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
2ac0: 73 61 6d 70 6c 65 73 0a 2a 2a 20 74 6f 20 61 63  samples.** to ac
2ad0: 63 75 6d 75 6c 61 74 65 20 28 53 29 2e 0a 2a 2a  cumulate (S)..**
2ae0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2af0: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 53   allocates the S
2b00: 74 61 74 33 41 63 63 75 6d 20 6f 62 6a 65 63 74  tat3Accum object
2b10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
2b20: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2b30: 53 74 61 74 33 41 63 63 75 6d 20 6f 62 6a 65 63  Stat3Accum objec
2b40: 74 20 28 50 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t (P)..*/.static
2b50: 20 76 6f 69 64 20 73 74 61 74 33 49 6e 69 74 28   void stat3Init(
2b60: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2b70: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
2b80: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
2b90: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
2ba0: 29 7b 0a 20 20 53 74 61 74 33 41 63 63 75 6d 20  ){.  Stat3Accum 
2bb0: 2a 70 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52  *p;.  tRowcnt nR
2bc0: 6f 77 3b 0a 20 20 69 6e 74 20 6d 78 53 61 6d 70  ow;.  int mxSamp
2bd0: 6c 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  le;.  int n;..  
2be0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2bf0: 28 61 72 67 63 29 3b 0a 20 20 6e 52 6f 77 20 3d  (argc);.  nRow =
2c00: 20 28 74 52 6f 77 63 6e 74 29 73 71 6c 69 74 65   (tRowcnt)sqlite
2c10: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
2c20: 67 76 5b 30 5d 29 3b 0a 20 20 6d 78 53 61 6d 70  gv[0]);.  mxSamp
2c30: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
2c40: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
2c50: 0a 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 2a 70  .  n = sizeof(*p
2c60: 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  ) + sizeof(p->a[
2c70: 30 5d 29 2a 6d 78 53 61 6d 70 6c 65 3b 0a 20 20  0])*mxSample;.  
2c80: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
2c90: 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 70  oc( n );.  if( p
2ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2cb0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
2cc0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
2cd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2ce0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6e    memset(p, 0, n
2cf0: 29 3b 0a 20 20 70 2d 3e 61 20 3d 20 28 73 74 72  );.  p->a = (str
2d00: 75 63 74 20 53 74 61 74 33 53 61 6d 70 6c 65 2a  uct Stat3Sample*
2d10: 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 6e 52 6f  )&p[1];.  p->nRo
2d20: 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 70 2d 3e 6d  w = nRow;.  p->m
2d30: 78 53 61 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70  xSample = mxSamp
2d40: 6c 65 3b 0a 20 20 70 2d 3e 6e 50 53 61 6d 70 6c  le;.  p->nPSampl
2d50: 65 20 3d 20 70 2d 3e 6e 52 6f 77 2f 28 6d 78 53  e = p->nRow/(mxS
2d60: 61 6d 70 6c 65 2f 33 2b 31 29 20 2b 20 31 3b 0a  ample/3+1) + 1;.
2d70: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2d80: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 2d 3e 69  ness(sizeof(p->i
2d90: 50 72 6e 29 2c 20 26 70 2d 3e 69 50 72 6e 29 3b  Prn), &p->iPrn);
2da0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
2db0: 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20  t_blob(context, 
2dc0: 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 73 71  p, sizeof(p), sq
2dd0: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 73  lite3_free);.}.s
2de0: 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63  tatic const Func
2df0: 44 65 66 20 73 74 61 74 33 49 6e 69 74 46 75 6e  Def stat3InitFun
2e00: 63 64 65 66 20 3d 20 7b 0a 20 20 32 2c 20 20 20  cdef = {.  2,   
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e20: 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45  nArg */.  SQLITE
2e30: 5f 55 54 46 38 2c 20 20 20 20 20 20 2f 2a 20 69  _UTF8,      /* i
2e40: 50 72 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c 20  PrefEnc */.  0, 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e60: 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20  * flags */.  0, 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e80: 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20  * pUserData */. 
2e90: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ea0: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
2eb0: 20 73 74 61 74 33 49 6e 69 74 2c 20 20 20 20 20   stat3Init,     
2ec0: 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20     /* xFunc */. 
2ed0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ee0: 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20     /* xStep */. 
2ef0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2f00: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
2f10: 2a 2f 0a 20 20 22 73 74 61 74 33 5f 69 6e 69 74  */.  "stat3_init
2f20: 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  ",     /* zName 
2f30: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
2f40: 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73 68 20         /* pHash 
2f50: 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2f60: 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74 72         /* pDestr
2f70: 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a  uctor */.};.../*
2f80: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2f90: 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 33 5f  on of the stat3_
2fa0: 70 75 73 68 28 6e 45 71 2c 6e 4c 74 2c 6e 44 4c  push(nEq,nLt,nDL
2fb0: 74 2c 72 6f 77 69 64 2c 50 29 20 53 51 4c 20 66  t,rowid,P) SQL f
2fc0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 0a 2a 2a  unction.  The.**
2fd0: 20 61 72 67 75 6d 65 6e 74 73 20 64 65 73 63 72   arguments descr
2fe0: 69 62 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79  ibe a single key
2ff0: 20 69 6e 73 74 61 6e 63 65 2e 20 20 54 68 69 73   instance.  This
3000: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
3010: 68 65 20 0a 2a 2a 20 64 65 63 69 73 69 6f 6e 20  he .** decision 
3020: 61 62 6f 75 74 20 77 68 65 74 68 65 72 20 6f 72  about whether or
3030: 20 6e 6f 74 20 74 6f 20 72 65 74 61 69 6e 20 74   not to retain t
3040: 68 69 73 20 6b 65 79 20 66 6f 72 20 74 68 65 20  his key for the 
3050: 73 71 6c 69 74 65 5f 73 74 61 74 33 0a 2a 2a 20  sqlite_stat3.** 
3060: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
3070: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
3080: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
3090: 20 76 6f 69 64 20 73 74 61 74 33 50 75 73 68 28   void stat3Push(
30a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
30b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
30c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
30d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
30e0: 29 7b 0a 20 20 53 74 61 74 33 41 63 63 75 6d 20  ){.  Stat3Accum 
30f0: 2a 70 20 3d 20 28 53 74 61 74 33 41 63 63 75 6d  *p = (Stat3Accum
3100: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
3110: 62 6c 6f 62 28 61 72 67 76 5b 34 5d 29 3b 0a 20  blob(argv[4]);. 
3120: 20 74 52 6f 77 63 6e 74 20 6e 45 71 20 3d 20 73   tRowcnt nEq = s
3130: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3140: 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 74  64(argv[0]);.  t
3150: 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 73 71 6c  Rowcnt nLt = sql
3160: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
3170: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 74 52 6f  (argv[1]);.  tRo
3180: 77 63 6e 74 20 6e 44 4c 74 20 3d 20 73 71 6c 69  wcnt nDLt = sqli
3190: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
31a0: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 36 34 20  argv[2]);.  i64 
31b0: 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
31c0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
31d0: 5b 33 5d 29 3b 0a 20 20 75 38 20 69 73 50 53 61  [3]);.  u8 isPSa
31e0: 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 75 38 20 64  mple = 0;.  u8 d
31f0: 6f 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69  oInsert = 0;.  i
3200: 6e 74 20 69 4d 69 6e 20 3d 20 70 2d 3e 69 4d 69  nt iMin = p->iMi
3210: 6e 3b 0a 20 20 73 74 72 75 63 74 20 53 74 61 74  n;.  struct Stat
3220: 33 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65  3Sample *pSample
3230: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  ;.  int i;.  u32
3240: 20 68 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   h;..  UNUSED_PA
3250: 52 41 4d 45 54 45 52 28 63 6f 6e 74 65 78 74 29  RAMETER(context)
3260: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3270: 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 69 66  ETER(argc);.  if
3280: 28 20 6e 45 71 3d 3d 30 20 29 20 72 65 74 75 72  ( nEq==0 ) retur
3290: 6e 3b 0a 20 20 68 20 3d 20 70 2d 3e 69 50 72 6e  n;.  h = p->iPrn
32a0: 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31 30 33 35   = p->iPrn*11035
32b0: 31 35 32 34 35 20 2b 20 31 32 33 34 35 3b 0a 20  15245 + 12345;. 
32c0: 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53   if( (nLt/p->nPS
32d0: 61 6d 70 6c 65 29 21 3d 28 28 6e 45 71 2b 6e 4c  ample)!=((nEq+nL
32e0: 74 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 29 20  t)/p->nPSample) 
32f0: 29 7b 0a 20 20 20 20 64 6f 49 6e 73 65 72 74 20  ){.    doInsert 
3300: 3d 20 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b  = isPSample = 1;
3310: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3320: 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d  nSample<p->mxSam
3330: 70 6c 65 20 29 7b 0a 20 20 20 20 64 6f 49 6e 73  ple ){.    doIns
3340: 65 72 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ert = 1;.  }else
3350: 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3e 70 2d  {.    if( nEq>p-
3360: 3e 61 5b 69 4d 69 6e 5d 2e 6e 45 71 20 7c 7c 20  >a[iMin].nEq || 
3370: 28 6e 45 71 3d 3d 70 2d 3e 61 5b 69 4d 69 6e 5d  (nEq==p->a[iMin]
3380: 2e 6e 45 71 20 26 26 20 68 3e 70 2d 3e 61 5b 69  .nEq && h>p->a[i
3390: 4d 69 6e 5d 2e 69 48 61 73 68 29 20 29 7b 0a 20  Min].iHash) ){. 
33a0: 20 20 20 20 20 64 6f 49 6e 73 65 72 74 20 3d 20       doInsert = 
33b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
33c0: 66 28 20 21 64 6f 49 6e 73 65 72 74 20 29 20 72  f( !doInsert ) r
33d0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
33e0: 6e 53 61 6d 70 6c 65 3d 3d 70 2d 3e 6d 78 53 61  nSample==p->mxSa
33f0: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 61 73 73 65  mple ){.    asse
3400: 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 2d  rt( p->nSample -
3410: 20 69 4d 69 6e 20 2d 20 31 20 3e 3d 20 30 20 29   iMin - 1 >= 0 )
3420: 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70  ;.    memmove(&p
3430: 2d 3e 61 5b 69 4d 69 6e 5d 2c 20 26 70 2d 3e 61  ->a[iMin], &p->a
3440: 5b 69 4d 69 6e 2b 31 5d 2c 20 73 69 7a 65 6f 66  [iMin+1], sizeof
3450: 28 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53  (p->a[0])*(p->nS
3460: 61 6d 70 6c 65 2d 69 4d 69 6e 2d 31 29 29 3b 0a  ample-iMin-1));.
3470: 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70      pSample = &p
3480: 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31  ->a[p->nSample-1
3490: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
34a0: 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61 5b  pSample = &p->a[
34b0: 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 5d 3b 0a 20  p->nSample++];. 
34c0: 20 7d 0a 20 20 70 53 61 6d 70 6c 65 2d 3e 69 52   }.  pSample->iR
34d0: 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20  owid = rowid;.  
34e0: 70 53 61 6d 70 6c 65 2d 3e 6e 45 71 20 3d 20 6e  pSample->nEq = n
34f0: 45 71 3b 0a 20 20 70 53 61 6d 70 6c 65 2d 3e 6e  Eq;.  pSample->n
3500: 4c 74 20 3d 20 6e 4c 74 3b 0a 20 20 70 53 61 6d  Lt = nLt;.  pSam
3510: 70 6c 65 2d 3e 6e 44 4c 74 20 3d 20 6e 44 4c 74  ple->nDLt = nDLt
3520: 3b 0a 20 20 70 53 61 6d 70 6c 65 2d 3e 69 48 61  ;.  pSample->iHa
3530: 73 68 20 3d 20 68 3b 0a 20 20 70 53 61 6d 70 6c  sh = h;.  pSampl
3540: 65 2d 3e 69 73 50 53 61 6d 70 6c 65 20 3d 20 69  e->isPSample = i
3550: 73 50 53 61 6d 70 6c 65 3b 0a 0a 20 20 2f 2a 20  sPSample;..  /* 
3560: 46 69 6e 64 20 74 68 65 20 6e 65 77 20 6d 69 6e  Find the new min
3570: 69 6d 75 6d 20 2a 2f 0a 20 20 69 66 28 20 70 2d  imum */.  if( p-
3580: 3e 6e 53 61 6d 70 6c 65 3d 3d 70 2d 3e 6d 78 53  >nSample==p->mxS
3590: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 70 53 61  ample ){.    pSa
35a0: 6d 70 6c 65 20 3d 20 70 2d 3e 61 3b 0a 20 20 20  mple = p->a;.   
35b0: 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   i = 0;.    whil
35c0: 65 28 20 70 53 61 6d 70 6c 65 2d 3e 69 73 50 53  e( pSample->isPS
35d0: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  ample ){.      i
35e0: 2b 2b 3b 0a 20 20 20 20 20 20 70 53 61 6d 70 6c  ++;.      pSampl
35f0: 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e++;.      asser
3600: 74 28 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20  t( i<p->nSample 
3610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 45 71  );.    }.    nEq
3620: 20 3d 20 70 53 61 6d 70 6c 65 2d 3e 6e 45 71 3b   = pSample->nEq;
3630: 0a 20 20 20 20 68 20 3d 20 70 53 61 6d 70 6c 65  .    h = pSample
3640: 2d 3e 69 48 61 73 68 3b 0a 20 20 20 20 69 4d 69  ->iHash;.    iMi
3650: 6e 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  n = i;.    for(i
3660: 2b 2b 2c 20 70 53 61 6d 70 6c 65 2b 2b 3b 20 69  ++, pSample++; i
3670: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  <p->nSample; i++
3680: 2c 20 70 53 61 6d 70 6c 65 2b 2b 29 7b 0a 20 20  , pSample++){.  
3690: 20 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d      if( pSample-
36a0: 3e 69 73 50 53 61 6d 70 6c 65 20 29 20 63 6f 6e  >isPSample ) con
36b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
36c0: 20 70 53 61 6d 70 6c 65 2d 3e 6e 45 71 3c 6e 45   pSample->nEq<nE
36d0: 71 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 61  q.       || (pSa
36e0: 6d 70 6c 65 2d 3e 6e 45 71 3d 3d 6e 45 71 20 26  mple->nEq==nEq &
36f0: 26 20 70 53 61 6d 70 6c 65 2d 3e 69 48 61 73 68  & pSample->iHash
3700: 3c 68 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  <h).      ){.   
3710: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 3b 0a 20       iMin = i;. 
3720: 20 20 20 20 20 20 20 6e 45 71 20 3d 20 70 53 61         nEq = pSa
3730: 6d 70 6c 65 2d 3e 6e 45 71 3b 0a 20 20 20 20 20  mple->nEq;.     
3740: 20 20 20 68 20 3d 20 70 53 61 6d 70 6c 65 2d 3e     h = pSample->
3750: 69 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  iHash;.      }. 
3760: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4d 69 6e     }.    p->iMin
3770: 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d 0a 73   = iMin;.  }.}.s
3780: 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63  tatic const Func
3790: 44 65 66 20 73 74 61 74 33 50 75 73 68 46 75 6e  Def stat3PushFun
37a0: 63 64 65 66 20 3d 20 7b 0a 20 20 35 2c 20 20 20  cdef = {.  5,   
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37c0: 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45  nArg */.  SQLITE
37d0: 5f 55 54 46 38 2c 20 20 20 20 20 20 2f 2a 20 69  _UTF8,      /* i
37e0: 50 72 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c 20  PrefEnc */.  0, 
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3800: 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20  * flags */.  0, 
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3820: 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20  * pUserData */. 
3830: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3840: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
3850: 20 73 74 61 74 33 50 75 73 68 2c 20 20 20 20 20   stat3Push,     
3860: 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20     /* xFunc */. 
3870: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3880: 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20     /* xStep */. 
3890: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
38a0: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
38b0: 2a 2f 0a 20 20 22 73 74 61 74 33 5f 70 75 73 68  */.  "stat3_push
38c0: 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  ",     /* zName 
38d0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
38e0: 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73 68 20         /* pHash 
38f0: 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
3900: 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74 72         /* pDestr
3910: 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  uctor */.};../*.
3920: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3930: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 33 5f 67  n of the stat3_g
3940: 65 74 28 50 2c 4e 2c 2e 2e 2e 29 20 53 51 4c 20  et(P,N,...) SQL 
3950: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
3960: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 75 73  routine is.** us
3970: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
3980: 72 65 73 75 6c 74 73 2e 20 20 43 6f 6e 74 65 6e  results.  Conten
3990: 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 6f  t is returned fo
39a0: 72 20 74 68 65 20 4e 74 68 20 73 71 6c 69 74 65  r the Nth sqlite
39b0: 5f 73 74 61 74 33 0a 2a 2a 20 72 6f 77 20 77 68  _stat3.** row wh
39c0: 65 72 65 20 4e 20 69 73 20 62 65 74 77 65 65 6e  ere N is between
39d0: 20 30 20 61 6e 64 20 53 2d 31 20 61 6e 64 20 53   0 and S-1 and S
39e0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
39f0: 66 20 73 61 6d 70 6c 65 73 2e 20 20 54 68 65 0a  f samples.  The.
3a00: 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
3a10: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
3a20: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
3a30: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 72  ents..**.**   ar
3a40: 67 63 3d 3d 32 20 20 20 20 72 65 73 75 6c 74 3a  gc==2    result:
3a50: 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61 72 67    rowid.**   arg
3a60: 63 3d 3d 33 20 20 20 20 72 65 73 75 6c 74 3a 20  c==3    result: 
3a70: 20 6e 45 71 0a 2a 2a 20 20 20 61 72 67 63 3d 3d   nEq.**   argc==
3a80: 34 20 20 20 20 72 65 73 75 6c 74 3a 20 20 6e 4c  4    result:  nL
3a90: 74 0a 2a 2a 20 20 20 61 72 67 63 3d 3d 35 20 20  t.**   argc==5  
3aa0: 20 20 72 65 73 75 6c 74 3a 20 20 6e 44 4c 74 0a    result:  nDLt.
3ab0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3ac0: 74 61 74 33 47 65 74 28 0a 20 20 73 71 6c 69 74  tat3Get(.  sqlit
3ad0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3ae0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
3af0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3b00: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
3b10: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
3b20: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
3b30: 0a 20 20 53 74 61 74 33 41 63 63 75 6d 20 2a 70  .  Stat3Accum *p
3b40: 20 3d 20 28 53 74 61 74 33 41 63 63 75 6d 2a 29   = (Stat3Accum*)
3b50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
3b60: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20  ob(argv[0]);..  
3b70: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
3b80: 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
3b90: 3c 3d 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <=n ) return;.  
3ba0: 73 77 69 74 63 68 28 20 61 72 67 63 20 29 7b 0a  switch( argc ){.
3bb0: 20 20 20 20 63 61 73 65 20 32 3a 20 20 73 71 6c      case 2:  sql
3bc0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
3bd0: 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 5b  4(context, p->a[
3be0: 6e 5d 2e 69 52 6f 77 69 64 29 3b 20 62 72 65 61  n].iRowid); brea
3bf0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 20 20  k;.    case 3:  
3c00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3c10: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d  nt64(context, p-
3c20: 3e 61 5b 6e 5d 2e 6e 45 71 29 3b 20 20 20 20 62  >a[n].nEq);    b
3c30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 34  reak;.    case 4
3c40: 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  :  sqlite3_resul
3c50: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
3c60: 20 70 2d 3e 61 5b 6e 5d 2e 6e 4c 74 29 3b 20 20   p->a[n].nLt);  
3c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
3c80: 61 75 6c 74 3a 20 73 71 6c 69 74 65 33 5f 72 65  ault: sqlite3_re
3c90: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
3ca0: 78 74 2c 20 70 2d 3e 61 5b 6e 5d 2e 6e 44 4c 74  xt, p->a[n].nDLt
3cb0: 29 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  );   break;.  }.
3cc0: 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46  }.static const F
3cd0: 75 6e 63 44 65 66 20 73 74 61 74 33 47 65 74 46  uncDef stat3GetF
3ce0: 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 2d 31 2c  uncdef = {.  -1,
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d00: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
3d10: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 20 2f 2a  TE_UTF8,      /*
3d20: 20 69 50 72 65 66 45 6e 63 20 2a 2f 0a 20 20 30   iPrefEnc */.  0
3d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d40: 20 2f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 30   /* flags */.  0
3d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d60: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
3d70: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
3d80: 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
3d90: 0a 20 20 73 74 61 74 33 47 65 74 2c 20 20 20 20  .  stat3Get,    
3da0: 20 20 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f       /* xFunc */
3db0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
3dc0: 20 20 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f       /* xStep */
3dd0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
3de0: 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a       /* xFinaliz
3df0: 65 20 2a 2f 0a 20 20 22 73 74 61 74 33 5f 67 65  e */.  "stat3_ge
3e00: 74 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65  t",     /* zName
3e10: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
3e20: 20 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73 68          /* pHash
3e30: 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
3e40: 20 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74          /* pDest
3e50: 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 23 65 6e  ructor */.};.#en
3e60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
3e70: 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 0a  ABLE_STAT3 */...
3e80: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
3e90: 20 63 6f 64 65 20 74 6f 20 64 6f 20 61 6e 20 61   code to do an a
3ea0: 6e 61 6c 79 73 69 73 20 6f 66 20 61 6c 6c 20 69  nalysis of all i
3eb0: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
3ec0: 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67  d with.** a sing
3ed0: 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  le table..*/.sta
3ee0: 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
3ef0: 4f 6e 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  OneTable(.  Pars
3f00: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
3f10: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
3f20: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
3f30: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 68       /* Table wh
3f40: 6f 73 65 20 69 6e 64 69 63 65 73 20 61 72 65 20  ose indices are 
3f50: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
3f60: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6e 6c 79  /.  Index *pOnly
3f70: 49 64 78 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  Idx, /* If not N
3f80: 55 4c 4c 2c 20 6f 6e 6c 79 20 61 6e 61 6c 79 7a  ULL, only analyz
3f90: 65 20 74 68 69 73 20 6f 6e 65 20 69 6e 64 65 78  e this one index
3fa0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 43   */.  int iStatC
3fb0: 75 72 2c 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  ur,    /* Index 
3fc0: 6f 66 20 56 64 62 65 43 75 72 73 6f 72 20 74 68  of VdbeCursor th
3fd0: 61 74 20 77 72 69 74 65 73 20 74 68 65 20 73 71  at writes the sq
3fe0: 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
3ff0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
4000: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
4010: 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ble memory locat
4020: 69 6f 6e 73 20 62 65 67 69 6e 20 68 65 72 65 20  ions begin here 
4030: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4040: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4050: 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  ;    /* Database
4060: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 64   handle */.  Ind
4070: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
4080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
4090: 69 6e 64 65 78 20 74 6f 20 62 65 69 6e 67 20 61  index to being a
40a0: 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  nalyzed */.  int
40b0: 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
40d0: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 69 6e 64 65  sor open on inde
40e0: 78 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  x being analyzed
40f0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
4120: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
4130: 62 75 69 6c 74 20 75 70 20 2a 2f 0a 20 20 69 6e  built up */.  in
4140: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
4150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
4160: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
4170: 69 6e 74 20 74 6f 70 4f 66 4c 6f 6f 70 3b 20 20  int topOfLoop;  
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4190: 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  The top of the l
41a0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  oop */.  int end
41b0: 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  OfLoop;         
41c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 64        /* The end
41d0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
41e0: 20 20 69 6e 74 20 6a 5a 65 72 6f 52 6f 77 73 20    int jZeroRows 
41f0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 2f  = -1;          /
4200: 2a 20 4a 75 6d 70 20 66 72 6f 6d 20 68 65 72 65  * Jump from here
4210: 20 69 66 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   if number of ro
4220: 77 73 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  ws is zero */.  
4230: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4250: 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
4260: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
4270: 62 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54 61  b */.  int regTa
4280: 62 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20  bname = iMem++; 
4290: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
42a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
42b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 72   name */.  int r
42c0: 65 67 49 64 78 6e 61 6d 65 20 3d 20 69 4d 65 6d  egIdxname = iMem
42d0: 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ++;     /* Regis
42e0: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69  ter containing i
42f0: 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  ndex name */.  i
4300: 6e 74 20 72 65 67 53 74 61 74 31 20 3d 20 69 4d  nt regStat1 = iM
4310: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 54  em++;       /* T
4320: 68 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20 6f  he stat column o
4330: 66 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 2a  f sqlite_stat1 *
4340: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4350: 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 69  ENABLE_STAT3.  i
4360: 6e 74 20 72 65 67 4e 75 6d 45 71 20 3d 20 72 65  nt regNumEq = re
4370: 67 53 74 61 74 31 3b 20 20 20 20 20 2f 2a 20 4e  gStat1;     /* N
4380: 75 6d 62 65 72 20 6f 66 20 69 6e 73 74 61 6e 63  umber of instanc
4390: 65 73 2e 20 20 53 61 6d 65 20 61 73 20 72 65 67  es.  Same as reg
43a0: 53 74 61 74 31 20 2a 2f 0a 20 20 69 6e 74 20 72  Stat1 */.  int r
43b0: 65 67 4e 75 6d 4c 74 20 3d 20 69 4d 65 6d 2b 2b  egNumLt = iMem++
43c0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
43d0: 72 20 6f 66 20 6b 65 79 73 20 6c 65 73 73 20 74  r of keys less t
43e0: 68 61 6e 20 72 65 67 53 61 6d 70 6c 65 20 2a 2f  han regSample */
43f0: 0a 20 20 69 6e 74 20 72 65 67 4e 75 6d 44 4c 74  .  int regNumDLt
4400: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
4410: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73  /* Number of dis
4420: 74 69 6e 63 74 20 6b 65 79 73 20 6c 65 73 73 20  tinct keys less 
4430: 74 68 61 6e 20 72 65 67 53 61 6d 70 6c 65 20 2a  than regSample *
4440: 2f 0a 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c  /.  int regSampl
4450: 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  e = iMem++;     
4460: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 61 6d   /* The next sam
4470: 70 6c 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ple value */.  i
4480: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65  nt regRowid = re
4490: 67 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 52  gSample;    /* R
44a0: 6f 77 69 64 20 6f 66 20 61 20 73 61 6d 70 6c 65  owid of a sample
44b0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 63 63   */.  int regAcc
44c0: 75 6d 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  um = iMem++;    
44d0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
44e0: 6f 20 68 6f 6c 64 20 53 74 61 74 33 41 63 63 75  o hold Stat3Accu
44f0: 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  m object */.  in
4500: 74 20 72 65 67 4c 6f 6f 70 20 3d 20 69 4d 65 6d  t regLoop = iMem
4510: 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ++;        /* Lo
4520: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
4530: 69 6e 74 20 72 65 67 43 6f 75 6e 74 20 3d 20 69  int regCount = i
4540: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
4550: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
4560: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  n the table or i
4570: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
4580: 67 54 65 6d 70 31 20 3d 20 69 4d 65 6d 2b 2b 3b  gTemp1 = iMem++;
4590: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 6d         /* Interm
45a0: 65 64 69 61 74 65 20 72 65 67 69 73 74 65 72 20  ediate register 
45b0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54 65 6d 70  */.  int regTemp
45c0: 32 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  2 = iMem++;     
45d0: 20 20 2f 2a 20 49 6e 74 65 72 6d 65 64 69 61 74    /* Intermediat
45e0: 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
45f0: 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 20 20 20  int once = 1;   
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4610: 4f 6e 65 2d 74 69 6d 65 20 69 6e 69 74 69 61 6c  One-time initial
4620: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ization */.  int
4630: 20 73 68 6f 72 74 4a 75 6d 70 20 3d 20 30 3b 20   shortJump = 0; 
4640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
4650: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73  truction address
4660: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
4670: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
4680: 2b 2b 3b 20 2f 2a 20 54 61 62 6c 65 20 63 75 72  ++; /* Table cur
4690: 73 6f 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  sor */.#endif.  
46a0: 69 6e 74 20 72 65 67 43 6f 6c 20 3d 20 69 4d 65  int regCol = iMe
46b0: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  m++;         /* 
46c0: 43 6f 6e 74 65 6e 74 20 6f 66 20 61 20 63 6f 6c  Content of a col
46d0: 75 6d 6e 20 69 6e 20 61 6e 61 6c 79 7a 65 64 20  umn in analyzed 
46e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
46f0: 65 67 52 65 63 20 3d 20 69 4d 65 6d 2b 2b 3b 20  egRec = iMem++; 
4700: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
4710: 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6d 70  ter holding comp
4720: 6c 65 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a  leted record */.
4730: 20 20 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20    int regTemp = 
4740: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f  iMem++;        /
4750: 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
4760: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
4770: 74 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20  t regNewRowid = 
4780: 69 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f  iMem++;    /* Ro
4790: 77 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65  wid for the inse
47a0: 72 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 0a  rted record */..
47b0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
47c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
47d0: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 4e 45 56   if( v==0 || NEV
47e0: 45 52 28 70 54 61 62 3d 3d 30 29 20 29 7b 0a 20  ER(pTab==0) ){. 
47f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4800: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
4810: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  =0 ){.    /* Do 
4820: 6e 6f 74 20 67 61 74 68 65 72 20 73 74 61 74 69  not gather stati
4830: 73 74 69 63 73 20 6f 6e 20 76 69 65 77 73 20 6f  stics on views o
4840: 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
4850: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
4860: 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70    }.  if( memcmp
4870: 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
4880: 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
4890: 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
48a0: 67 61 74 68 65 72 20 73 74 61 74 69 73 74 69 63  gather statistic
48b0: 73 20 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c  s on system tabl
48c0: 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  es */.    return
48d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
48e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
48f0: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
4900: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
4910: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
4920: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
4930: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
4940: 62 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b>=0 );.  assert
4950: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
4960: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
4970: 2c 20 30 29 20 29 3b 0a 23 69 66 6e 64 65 66 20  , 0) );.#ifndef 
4980: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
4990: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
49a0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
49b0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
49c0: 41 4e 41 4c 59 5a 45 2c 20 70 54 61 62 2d 3e 7a  ANALYZE, pTab->z
49d0: 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
49e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
49f0: 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
4a00: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
4a10: 20 2f 2a 20 45 73 74 61 62 6c 69 73 68 20 61 20   /* Establish a 
4a20: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
4a30: 20 74 61 62 6c 65 20 61 74 20 74 68 65 20 73 68   table at the sh
4a40: 61 72 65 64 2d 63 61 63 68 65 20 6c 65 76 65 6c  ared-cache level
4a50: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  . */.  sqlite3Ta
4a60: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
4a70: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
4a80: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
4a90: 3b 0a 0a 20 20 69 49 64 78 43 75 72 20 3d 20 70  ;..  iIdxCur = p
4aa0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
4ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ac0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
4ad0: 2c 20 30 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c  , 0, regTabname,
4ae0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
4af0: 20 30 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d   0);.  for(pIdx=
4b00: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
4b10: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
4b20: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Next){.    int n
4b30: 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  Col;.    KeyInfo
4b40: 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 6e 74 20   *pKey;.    int 
4b50: 61 64 64 72 49 66 4e 6f 74 20 3d 20 30 3b 20 20  addrIfNot = 0;  
4b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
4b70: 65 73 73 20 6f 66 20 4f 50 5f 49 66 4e 6f 74 20  ess of OP_IfNot 
4b80: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 43 68 6e  */.    int *aChn
4b90: 67 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  gAddr;          
4ba0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4bb0: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
4bc0: 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 0a 20   addresses */.. 
4bd0: 20 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 20     if( pOnlyIdx 
4be0: 26 26 20 70 4f 6e 6c 79 49 64 78 21 3d 70 49 64  && pOnlyIdx!=pId
4bf0: 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  x ) continue;.  
4c00: 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
4c10: 74 28 28 76 2c 20 22 42 65 67 69 6e 20 61 6e 61  t((v, "Begin ana
4c20: 6c 79 73 69 73 20 6f 66 20 25 73 22 2c 20 70 49  lysis of %s", pI
4c30: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
4c40: 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
4c50: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 61 43 68 6e 67  olumn;.    aChng
4c60: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 44 62  Addr = sqlite3Db
4c70: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
4c80: 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 29 3b  zeof(int)*nCol);
4c90: 0a 20 20 20 20 69 66 28 20 61 43 68 6e 67 41 64  .    if( aChngAd
4ca0: 64 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  dr==0 ) continue
4cb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
4cc0: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
4cd0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
4ce0: 20 20 20 20 69 66 28 20 69 4d 65 6d 2b 31 2b 28      if( iMem+1+(
4cf0: 6e 43 6f 6c 2a 32 29 3e 70 50 61 72 73 65 2d 3e  nCol*2)>pParse->
4d00: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 50  nMem ){.      pP
4d10: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 69 4d 65  arse->nMem = iMe
4d20: 6d 2b 31 2b 28 6e 43 6f 6c 2a 32 29 3b 0a 20 20  m+1+(nCol*2);.  
4d30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e    }..    /* Open
4d40: 20 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65   a cursor to the
4d50: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 61 6e 61   index to be ana
4d60: 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73  lyzed. */.    as
4d70: 73 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69 74  sert( iDb==sqlit
4d80: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
4d90: 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  db, pIdx->pSchem
4da0: 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a) );.    sqlite
4db0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4dc0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
4dd0: 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Cur, pIdx->tnum,
4de0: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 28 63   iDb,.        (c
4df0: 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  har *)pKey, P4_K
4e00: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
4e10: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
4e20: 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
4e30: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
4e40: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 72  * Populate the r
4e50: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
4e60: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  ng the index nam
4e70: 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
4e80: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4e90: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65  P_String8, 0, re
4ea0: 67 49 64 78 6e 61 6d 65 2c 20 30 2c 20 70 49 64  gIdxname, 0, pId
4eb0: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 23  x->zName, 0);..#
4ec0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4ed0: 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66  BLE_STAT3.    if
4ee0: 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
4ef0: 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
4f00: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
4f10: 28 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72  (pParse, iTabCur
4f20: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
4f30: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 7d  OpenRead);.    }
4f40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
4f60: 6e 74 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67  nt, iIdxCur, reg
4f70: 43 6f 75 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  Count);.    sqli
4f80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4f90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c   OP_Integer, SQL
4fa0: 49 54 45 5f 53 54 41 54 33 5f 53 41 4d 50 4c 45  ITE_STAT3_SAMPLE
4fb0: 53 2c 20 72 65 67 54 65 6d 70 31 29 3b 0a 20 20  S, regTemp1);.  
4fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4fd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
4fe0: 72 2c 20 30 2c 20 72 65 67 4e 75 6d 45 71 29 3b  r, 0, regNumEq);
4ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5000: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
5010: 65 67 65 72 2c 20 30 2c 20 72 65 67 4e 75 6d 4c  eger, 0, regNumL
5020: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5030: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5040: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67  Integer, -1, reg
5050: 4e 75 6d 44 4c 74 29 3b 0a 20 20 20 20 73 71 6c  NumDLt);.    sql
5060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5070: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31  , OP_Function, 1
5080: 2c 20 72 65 67 43 6f 75 6e 74 2c 20 72 65 67 41  , regCount, regA
5090: 63 63 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  ccum,.          
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
50b0: 72 2a 29 26 73 74 61 74 33 49 6e 69 74 46 75 6e  r*)&stat3InitFun
50c0: 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  cdef, P4_FUNCDEF
50d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
50e0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 29  beChangeP5(v, 2)
50f0: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
5100: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 20  TE_ENABLE_STAT3 
5110: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 62  */..    /* The b
5120: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 63  lock of memory c
5130: 65 6c 6c 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ells initialized
5140: 20 68 65 72 65 20 69 73 20 75 73 65 64 20 61 73   here is used as
5150: 20 66 6f 6c 6c 6f 77 73 2e 0a 20 20 20 20 2a 2a   follows..    **
5160: 0a 20 20 20 20 2a 2a 20 20 20 20 69 4d 65 6d 3a  .    **    iMem:
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 54  .    **        T
5190: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
51a0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
51b0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
51c0: 20 2a 2a 20 20 20 20 69 4d 65 6d 2b 31 20 2e 2e   **    iMem+1 ..
51d0: 20 69 4d 65 6d 2b 6e 43 6f 6c 3a 20 0a 20 20 20   iMem+nCol: .   
51e0: 20 2a 2a 20 20 20 20 20 20 20 20 4e 75 6d 62 65   **        Numbe
51f0: 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 65 6e  r of distinct en
5200: 74 72 69 65 73 20 69 6e 20 69 6e 64 65 78 20 63  tries in index c
5210: 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 0a  onsidering the .
5220: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 6c 65      **        le
5230: 66 74 2d 6d 6f 73 74 20 4e 20 63 6f 6c 75 6d 6e  ft-most N column
5240: 73 20 6f 6e 6c 79 2c 20 77 68 65 72 65 20 4e 20  s only, where N 
5250: 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
5260: 20 6e 43 6f 6c 2c 20 0a 20 20 20 20 2a 2a 20 20   nCol, .    **  
5270: 20 20 20 20 20 20 69 6e 63 6c 75 73 69 76 65 2e        inclusive.
5280: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
5290: 20 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 31 20 2e 2e    iMem+nCol+1 ..
52a0: 20 4d 65 6d 2b 32 2a 6e 43 6f 6c 3a 20 20 0a 20   Mem+2*nCol:  . 
52b0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 50 72 65     **        Pre
52c0: 76 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 69  vious value of i
52d0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 2c 20  ndexed columns, 
52e0: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
52f0: 68 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ht..    **.    *
5300: 2a 20 43 65 6c 6c 73 20 69 4d 65 6d 20 74 68 72  * Cells iMem thr
5310: 6f 75 67 68 20 69 4d 65 6d 2b 6e 43 6f 6c 20 61  ough iMem+nCol a
5320: 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  re initialized t
5330: 6f 20 30 2e 20 54 68 65 20 6f 74 68 65 72 73 20  o 0. The others 
5340: 61 72 65 20 0a 20 20 20 20 2a 2a 20 69 6e 69 74  are .    ** init
5350: 69 61 6c 69 7a 65 64 20 74 6f 20 63 6f 6e 74 61  ialized to conta
5360: 69 6e 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2e 0a  in an SQL NULL..
5370: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
5380: 3d 30 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b  =0; i<=nCol; i++
5390: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
53a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
53b0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4d 65  _Integer, 0, iMe
53c0: 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  m+i);.    }.    
53d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
53e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
53f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5400: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d  , OP_Null, 0, iM
5410: 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 29 3b 0a 20 20  em+nCol+i+1);.  
5420: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 61 72    }..    /* Star
5430: 74 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 6c  t the analysis l
5440: 6f 6f 70 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72  oop. This loop r
5450: 75 6e 73 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  uns through all 
5460: 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  the entries in. 
5470: 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
5480: 62 2d 74 72 65 65 2e 20 20 2a 2f 0a 20 20 20 20  b-tree.  */.    
5490: 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  endOfLoop = sqli
54a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
54b0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
54c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
54d0: 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72  _Rewind, iIdxCur
54e0: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20  , endOfLoop);.  
54f0: 20 20 74 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71    topOfLoop = sq
5500: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5510: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
5520: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5530: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4d 65  , OP_AddImm, iMe
5540: 6d 2c 20 31 29 3b 20 20 2f 2a 20 49 6e 63 72 65  m, 1);  /* Incre
5550: 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 65 72  ment row counter
5560: 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   */..    for(i=0
5570: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
5580: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
5590: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
55a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
55b0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
55c0: 43 75 72 2c 20 69 2c 20 72 65 67 43 6f 6c 29 3b  Cur, i, regCol);
55d0: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20  .      if( i==0 
55e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  ){.        /* Al
55f0: 77 61 79 73 20 72 65 63 6f 72 64 20 74 68 65 20  ways record the 
5600: 76 65 72 79 20 66 69 72 73 74 20 72 6f 77 20 2a  very first row *
5610: 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 49 66  /.        addrIf
5620: 4e 6f 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Not = sqlite3Vdb
5630: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
5640: 4e 6f 74 2c 20 69 4d 65 6d 2b 31 29 3b 0a 20 20  Not, iMem+1);.  
5650: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
5660: 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  rt( pIdx->azColl
5670: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
5680: 65 72 74 28 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ert( pIdx->azCol
5690: 6c 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  l[i]!=0 );.     
56a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
56b0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
56c0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  arse, pIdx->azCo
56d0: 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 43  ll[i]);.      aC
56e0: 68 6e 67 41 64 64 72 5b 69 5d 20 3d 20 73 71 6c  hngAddr[i] = sql
56f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5700: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 43 6f 6c 2c  , OP_Ne, regCol,
5710: 20 30 2c 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b   0, iMem+nCol+i+
5720: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
5750: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
5760: 51 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Q);.      sqlite
5770: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
5780: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
5790: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
57a0: 6e 74 28 28 76 2c 20 22 6a 75 6d 70 20 69 66 20  nt((v, "jump if 
57b0: 63 6f 6c 75 6d 6e 20 25 64 20 63 68 61 6e 67 65  column %d change
57c0: 64 22 2c 20 69 29 29 3b 0a 23 69 66 64 65 66 20  d", i));.#ifdef 
57d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
57e0: 41 54 33 0a 20 20 20 20 20 20 69 66 28 20 69 3d  AT3.      if( i=
57f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5800: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5810: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
5820: 67 4e 75 6d 45 71 2c 20 31 29 3b 0a 20 20 20 20  gNumEq, 1);.    
5830: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
5840: 28 76 2c 20 22 69 6e 63 72 20 72 65 70 65 61 74  (v, "incr repeat
5850: 20 63 6f 75 6e 74 22 29 29 3b 0a 20 20 20 20 20   count"));.     
5860: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
5870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5880: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
5890: 2c 20 30 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b  , 0, endOfLoop);
58a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
58b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
58c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
58d0: 70 48 65 72 65 28 76 2c 20 61 43 68 6e 67 41 64  pHere(v, aChngAd
58e0: 64 72 5b 69 5d 29 3b 20 20 2f 2a 20 53 65 74 20  dr[i]);  /* Set 
58f0: 6a 75 6d 70 20 64 65 73 74 20 66 6f 72 20 74 68  jump dest for th
5900: 65 20 4f 50 5f 4e 65 20 2a 2f 0a 20 20 20 20 20  e OP_Ne */.     
5910: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
5920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5930: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
5940: 49 66 4e 6f 74 29 3b 20 20 20 2f 2a 20 4a 75 6d  IfNot);   /* Jum
5950: 70 20 64 65 73 74 20 66 6f 72 20 4f 50 5f 49 66  p dest for OP_If
5960: 4e 6f 74 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Not */.#ifdef SQ
5970: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
5980: 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  3.        sqlite
5990: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
59a0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31 2c 20 72  P_Function, 1, r
59b0: 65 67 4e 75 6d 45 71 2c 20 72 65 67 54 65 6d 70  egNumEq, regTemp
59c0: 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
59e0: 61 72 2a 29 26 73 74 61 74 33 50 75 73 68 46 75  ar*)&stat3PushFu
59f0: 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  ncdef, P4_FUNCDE
5a00: 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  F);.        sqli
5a10: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5a20: 76 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 73  v, 5);.        s
5a30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5a40: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
5a50: 49 64 78 43 75 72 2c 20 70 49 64 78 2d 3e 6e 43  IdxCur, pIdx->nC
5a60: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29  olumn, regRowid)
5a70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5a80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5a90: 50 5f 41 64 64 2c 20 72 65 67 4e 75 6d 45 71 2c  P_Add, regNumEq,
5aa0: 20 72 65 67 4e 75 6d 4c 74 2c 20 72 65 67 4e 75   regNumLt, regNu
5ab0: 6d 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mLt);.        sq
5ac0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5ad0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
5ae0: 67 4e 75 6d 44 4c 74 2c 20 31 29 3b 0a 20 20 20  gNumDLt, 1);.   
5af0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
5b10: 65 67 65 72 2c 20 31 2c 20 72 65 67 4e 75 6d 45  eger, 1, regNumE
5b20: 71 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 20  q);.#endif      
5b30: 20 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20    .      }.     
5b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b50: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
5b60: 20 69 4d 65 6d 2b 69 2b 31 2c 20 31 29 3b 0a 20   iMem+i+1, 1);. 
5b70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
5b90: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c  umn, iIdxCur, i,
5ba0: 20 69 4d 65 6d 2b 6e 43 6f 6c 2b 69 2b 31 29 3b   iMem+nCol+i+1);
5bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5bc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 68  e3DbFree(db, aCh
5bd0: 6e 67 41 64 64 72 29 3b 0a 0a 20 20 20 20 2f 2a  ngAddr);..    /*
5be0: 20 41 6c 77 61 79 73 20 6a 75 6d 70 20 68 65 72   Always jump her
5bf0: 65 20 61 66 74 65 72 20 75 70 64 61 74 69 6e 67  e after updating
5c00: 20 74 68 65 20 69 4d 65 6d 2b 31 2e 2e 2e 69 4d   the iMem+1...iM
5c10: 65 6d 2b 31 2b 6e 43 6f 6c 20 63 6f 75 6e 74 65  em+1+nCol counte
5c20: 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  rs */.    sqlite
5c30: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
5c40: 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b  l(v, endOfLoop);
5c50: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
5c60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
5c70: 78 74 2c 20 69 49 64 78 43 75 72 2c 20 74 6f 70  xt, iIdxCur, top
5c80: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c  OfLoop);.    sql
5c90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5ca0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
5cb0: 43 75 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Cur);.#ifdef SQL
5cc0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
5cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ce0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
5cf0: 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 4e 75 6d  ction, 1, regNum
5d00: 45 71 2c 20 72 65 67 54 65 6d 70 32 2c 0a 20 20  Eq, regTemp2,.  
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61 74      (char*)&stat
5d30: 33 50 75 73 68 46 75 6e 63 64 65 66 2c 20 50 34  3PushFuncdef, P4
5d40: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
5d50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5d60: 50 35 28 76 2c 20 35 29 3b 0a 20 20 20 20 73 71  P5(v, 5);.    sq
5d70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5d80: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
5d90: 31 2c 20 72 65 67 4c 6f 6f 70 29 3b 0a 20 20 20  1, regLoop);.   
5da0: 20 73 68 6f 72 74 4a 75 6d 70 20 3d 20 0a 20 20   shortJump = .  
5db0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5dc0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
5dd0: 2c 20 72 65 67 4c 6f 6f 70 2c 20 31 29 3b 0a 20  , regLoop, 1);. 
5de0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5df0: 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
5e00: 69 6f 6e 2c 20 31 2c 20 72 65 67 41 63 63 75 6d  ion, 1, regAccum
5e10: 2c 20 72 65 67 54 65 6d 70 31 2c 0a 20 20 20 20  , regTemp1,.    
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 20 28 63 68 61 72 2a 29 26 73 74 61 74 33 47    (char*)&stat3G
5e40: 65 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55  etFuncdef, P4_FU
5e50: 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
5e60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5e70: 76 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  v, 2);.    sqlit
5e80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5e90: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 54 65  OP_IsNull, regTe
5ea0: 6d 70 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mp1);.    sqlite
5eb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5ec0: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 54 61  P_NotExists, iTa
5ed0: 62 43 75 72 2c 20 73 68 6f 72 74 4a 75 6d 70 2c  bCur, shortJump,
5ee0: 20 72 65 67 54 65 6d 70 31 29 3b 0a 20 20 20 20   regTemp1);.    
5ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f00: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
5f10: 69 54 61 62 43 75 72 2c 20 70 49 64 78 2d 3e 61  iTabCur, pIdx->a
5f20: 69 43 6f 6c 75 6d 6e 5b 30 5d 2c 20 72 65 67 53  iColumn[0], regS
5f30: 61 6d 70 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  ample);.    sqli
5f40: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
5f50: 28 76 2c 20 70 54 61 62 2c 20 70 49 64 78 2d 3e  (v, pTab, pIdx->
5f60: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 2c 20 72 65 67  aiColumn[0], reg
5f70: 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 73 71 6c  Sample);.    sql
5f80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5f90: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31  , OP_Function, 1
5fa0: 2c 20 72 65 67 41 63 63 75 6d 2c 20 72 65 67 4e  , regAccum, regN
5fb0: 75 6d 45 71 2c 0a 20 20 20 20 20 20 20 20 20 20  umEq,.          
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
5fd0: 72 2a 29 26 73 74 61 74 33 47 65 74 46 75 6e 63  r*)&stat3GetFunc
5fe0: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
5ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6000: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 33 29 3b  eChangeP5(v, 3);
6010: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6020: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e  AddOp4(v, OP_Fun
6030: 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 41 63 63  ction, 1, regAcc
6040: 75 6d 2c 20 72 65 67 4e 75 6d 4c 74 2c 0a 20 20  um, regNumLt,.  
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61 74      (char*)&stat
6070: 33 47 65 74 46 75 6e 63 64 65 66 2c 20 50 34 5f  3GetFuncdef, P4_
6080: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
6090: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
60a0: 35 28 76 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c  5(v, 4);.    sql
60b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
60c0: 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31  , OP_Function, 1
60d0: 2c 20 72 65 67 41 63 63 75 6d 2c 20 72 65 67 4e  , regAccum, regN
60e0: 75 6d 44 4c 74 2c 0a 20 20 20 20 20 20 20 20 20  umDLt,.         
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
6100: 61 72 2a 29 26 73 74 61 74 33 47 65 74 46 75 6e  ar*)&stat3GetFun
6110: 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  cdef, P4_FUNCDEF
6120: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6130: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 35 29  beChangeP5(v, 5)
6140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6150: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
6160: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62  keRecord, regTab
6170: 6e 61 6d 65 2c 20 36 2c 20 72 65 67 52 65 63 2c  name, 6, regRec,
6180: 20 22 62 62 62 62 62 62 22 2c 20 30 29 3b 0a 20   "bbbbbb", 0);. 
6190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
61a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
61b0: 77 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31 2c  wid, iStatCur+1,
61c0: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
61d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
61e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
61f0: 74 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20 72  t, iStatCur+1, r
6200: 65 67 52 65 63 2c 20 72 65 67 4e 65 77 52 6f 77  egRec, regNewRow
6210: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
6220: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6230: 5f 47 6f 74 6f 2c 20 30 2c 20 73 68 6f 72 74 4a  _Goto, 0, shortJ
6240: 75 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ump);.    sqlite
6250: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
6260: 20 73 68 6f 72 74 4a 75 6d 70 2b 32 29 3b 0a 23   shortJump+2);.#
6270: 65 6e 64 69 66 20 20 20 20 20 20 20 20 0a 0a 20  endif        .. 
6280: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
6290: 72 65 73 75 6c 74 73 20 69 6e 20 73 71 6c 69 74  results in sqlit
62a0: 65 5f 73 74 61 74 31 2e 0a 20 20 20 20 2a 2a 0a  e_stat1..    **.
62b0: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c      ** The resul
62c0: 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  t is a single ro
62d0: 77 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  w of the sqlite_
62e0: 73 74 61 74 31 20 74 61 62 6c 65 2e 20 20 54 68  stat1 table.  Th
62f0: 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 74  e first.    ** t
6300: 77 6f 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 74  wo columns are t
6310: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
6320: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 2e  table and index.
6330: 20 20 54 68 65 20 74 68 69 72 64 20 63 6f 6c 75    The third colu
6340: 6d 6e 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 73  mn.    ** is a s
6350: 74 72 69 6e 67 20 63 6f 6d 70 6f 73 65 64 20 6f  tring composed o
6360: 66 20 61 20 6c 69 73 74 20 6f 66 20 69 6e 74 65  f a list of inte
6370: 67 65 72 20 73 74 61 74 69 73 74 69 63 73 20 61  ger statistics a
6380: 62 6f 75 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  bout the.    ** 
6390: 69 6e 64 65 78 2e 20 20 54 68 65 20 66 69 72 73  index.  The firs
63a0: 74 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  t integer in the
63b0: 20 6c 69 73 74 20 69 73 20 74 68 65 20 74 6f 74   list is the tot
63c0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  al number of ent
63d0: 72 69 65 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ries.    ** in t
63e0: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 72 65  he index.  There
63f0: 20 69 73 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e   is one addition
6400: 61 6c 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68  al integer in th
6410: 65 20 6c 69 73 74 20 66 6f 72 20 65 61 63 68 0a  e list for each.
6420: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66      ** column of
6430: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
6440: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74  s additional int
6450: 65 67 65 72 20 69 73 20 61 20 67 75 65 73 73 20  eger is a guess 
6460: 6f 66 20 68 6f 77 20 6d 61 6e 79 0a 20 20 20 20  of how many.    
6470: 2a 2a 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ** rows of the t
6480: 61 62 6c 65 20 74 68 65 20 69 6e 64 65 78 20 77  able the index w
6490: 69 6c 6c 20 73 65 6c 65 63 74 2e 20 20 49 66 20  ill select.  If 
64a0: 44 20 69 73 20 74 68 65 20 63 6f 75 6e 74 20 6f  D is the count o
64b0: 66 20 64 69 73 74 69 6e 63 74 0a 20 20 20 20 2a  f distinct.    *
64c0: 2a 20 76 61 6c 75 65 73 20 61 6e 64 20 4b 20 69  * values and K i
64d0: 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
64e0: 65 72 20 6f 66 20 72 6f 77 73 2c 20 74 68 65 6e  er of rows, then
64f0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   the integer is 
6500: 63 6f 6d 70 75 74 65 64 0a 20 20 20 20 2a 2a 20  computed.    ** 
6510: 61 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  as:.    **.    *
6520: 2a 20 20 20 20 20 20 20 20 49 20 3d 20 28 4b 2b  *        I = (K+
6530: 44 2d 31 29 2f 44 0a 20 20 20 20 2a 2a 0a 20 20  D-1)/D.    **.  
6540: 20 20 2a 2a 20 49 66 20 4b 3d 3d 30 20 74 68 65    ** If K==0 the
6550: 6e 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 6d 61  n no entry is ma
6560: 64 65 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69  de into the sqli
6570: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20  te_stat1 table. 
6580: 20 0a 20 20 20 20 2a 2a 20 49 66 20 4b 3e 30 20   .    ** If K>0 
6590: 74 68 65 6e 20 69 74 20 69 73 20 61 6c 77 61 79  then it is alway
65a0: 73 20 74 68 65 20 63 61 73 65 20 74 68 65 20 44  s the case the D
65b0: 3e 30 20 73 6f 20 64 69 76 69 73 69 6f 6e 20 62  >0 so division b
65c0: 79 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 69 73  y zero.    ** is
65d0: 20 6e 65 76 65 72 20 70 6f 73 73 69 62 6c 65 2e   never possible.
65e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
65f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6600: 20 4f 50 5f 53 43 6f 70 79 2c 20 69 4d 65 6d 2c   OP_SCopy, iMem,
6610: 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20   regStat1);.    
6620: 69 66 28 20 6a 5a 65 72 6f 52 6f 77 73 3c 30 20  if( jZeroRows<0 
6630: 29 7b 0a 20 20 20 20 20 20 6a 5a 65 72 6f 52 6f  ){.      jZeroRo
6640: 77 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ws = sqlite3Vdbe
6650: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
6660: 6f 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d  ot, iMem);.    }
6670: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6680: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
66a0: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
66b0: 38 2c 20 30 2c 20 72 65 67 54 65 6d 70 2c 20 30  8, 0, regTemp, 0
66c0: 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  , " ", 0);.     
66d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
66e0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c  p3(v, OP_Concat,
66f0: 20 72 65 67 54 65 6d 70 2c 20 72 65 67 53 74 61   regTemp, regSta
6700: 74 31 2c 20 72 65 67 53 74 61 74 31 29 3b 0a 20  t1, regStat1);. 
6710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6720: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
6730: 2c 20 69 4d 65 6d 2c 20 69 4d 65 6d 2b 69 2b 31  , iMem, iMem+i+1
6740: 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20  , regTemp);.    
6750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6760: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
6770: 2c 20 72 65 67 54 65 6d 70 2c 20 2d 31 29 3b 0a  , regTemp, -1);.
6780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6790: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 69  eAddOp3(v, OP_Di
67a0: 76 69 64 65 2c 20 69 4d 65 6d 2b 69 2b 31 2c 20  vide, iMem+i+1, 
67b0: 72 65 67 54 65 6d 70 2c 20 72 65 67 54 65 6d 70  regTemp, regTemp
67c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
67d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
67e0: 5f 54 6f 49 6e 74 2c 20 72 65 67 54 65 6d 70 29  _ToInt, regTemp)
67f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6800: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6810: 43 6f 6e 63 61 74 2c 20 72 65 67 54 65 6d 70 2c  Concat, regTemp,
6820: 20 72 65 67 53 74 61 74 31 2c 20 72 65 67 53 74   regStat1, regSt
6830: 61 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  at1);.    }.    
6840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6850: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
6860: 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20  rd, regTabname, 
6870: 33 2c 20 72 65 67 52 65 63 2c 20 22 61 61 61 22  3, regRec, "aaa"
6880: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6890: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
68a0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
68b0: 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69  tCur, regNewRowi
68c0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
68d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
68e0: 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72  Insert, iStatCur
68f0: 2c 20 72 65 67 52 65 63 2c 20 72 65 67 4e 65 77  , regRec, regNew
6900: 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Rowid);.    sqli
6910: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
6920: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
6930: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
6940: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6e 6f  the table has no
6950: 20 69 6e 64 69 63 65 73 2c 20 63 72 65 61 74 65   indices, create
6960: 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74 65   a single sqlite
6970: 5f 73 74 61 74 31 20 65 6e 74 72 79 0a 20 20 2a  _stat1 entry.  *
6980: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c  * containing NUL
6990: 4c 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 6e  L as the index n
69a0: 61 6d 65 20 61 6e 64 20 74 68 65 20 72 6f 77 20  ame and the row 
69b0: 63 6f 75 6e 74 20 61 73 20 74 68 65 20 63 6f 6e  count as the con
69c0: 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tent..  */.  if(
69d0: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
69e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
69f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6a00: 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
6a10: 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  r, pTab->tnum, i
6a20: 44 62 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  Db);.    VdbeCom
6a30: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6a40: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
6a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a60: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
6a70: 20 69 49 64 78 43 75 72 2c 20 72 65 67 53 74 61   iIdxCur, regSta
6a80: 74 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t1);.    sqlite3
6a90: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6aa0: 5f 43 6c 6f 73 65 2c 20 69 49 64 78 43 75 72 29  _Close, iIdxCur)
6ab0: 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20  ;.    jZeroRows 
6ac0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6ad0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
6ae0: 20 72 65 67 53 74 61 74 31 29 3b 0a 20 20 7d 65   regStat1);.  }e
6af0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6b00: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6b10: 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 20 20  jZeroRows);.    
6b20: 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69  jZeroRows = sqli
6b30: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
6b40: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 20   OP_Goto);.  }. 
6b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b60: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
6b70: 2c 20 72 65 67 49 64 78 6e 61 6d 65 29 3b 0a 20  , regIdxname);. 
6b80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b90: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
6ba0: 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c  ord, regTabname,
6bb0: 20 33 2c 20 72 65 67 52 65 63 2c 20 22 61 61 61   3, regRec, "aaa
6bc0: 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", 0);.  sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6be0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74  _NewRowid, iStat
6bf0: 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64  Cur, regNewRowid
6c00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
6c20: 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72  ert, iStatCur, r
6c30: 65 67 52 65 63 2c 20 72 65 67 4e 65 77 52 6f 77  egRec, regNewRow
6c40: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
6c50: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6c60: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
6c70: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  if( pParse->nMem
6c80: 3c 72 65 67 52 65 63 20 29 20 70 50 61 72 73 65  <regRec ) pParse
6c90: 2d 3e 6e 4d 65 6d 20 3d 20 72 65 67 52 65 63 3b  ->nMem = regRec;
6ca0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
6cb0: 6d 70 48 65 72 65 28 76 2c 20 6a 5a 65 72 6f 52  mpHere(v, jZeroR
6cc0: 6f 77 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ows);.}.../*.** 
6cd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
6ce0: 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  at will cause th
6cf0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
6d00: 64 65 78 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a  dex analysis to.
6d10: 2a 2a 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  ** be loaded int
6d20: 6f 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  o internal hash 
6d30: 74 61 62 6c 65 73 20 77 68 65 72 65 20 69 73 20  tables where is 
6d40: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  can be used..*/.
6d50: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64  static void load
6d60: 41 6e 61 6c 79 73 69 73 28 50 61 72 73 65 20 2a  Analysis(Parse *
6d70: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
6d80: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
6d90: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
6da0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
6db0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6dc0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 6f 61  AddOp1(v, OP_Loa
6dd0: 64 41 6e 61 6c 79 73 69 73 2c 20 69 44 62 29 3b  dAnalysis, iDb);
6de0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
6df0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
6e00: 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c   will do an anal
6e10: 79 73 69 73 20 6f 66 20 61 6e 20 65 6e 74 69 72  ysis of an entir
6e20: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  e database.*/.st
6e30: 61 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a  atic void analyz
6e40: 65 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  eDatabase(Parse 
6e50: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
6e60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6e70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6e80: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6e90: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6ea0: 70 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53  pSchema;    /* S
6eb0: 63 68 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73  chema of databas
6ec0: 65 20 69 44 62 20 2a 2f 0a 20 20 48 61 73 68 45  e iDb */.  HashE
6ed0: 6c 65 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53  lem *k;.  int iS
6ee0: 74 61 74 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d  tatCur;.  int iM
6ef0: 65 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65  em;..  sqlite3Be
6f00: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
6f10: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
6f20: 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20  );.  iStatCur = 
6f30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
6f40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20  pParse->nTab += 
6f50: 33 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54 61 62  3;.  openStatTab
6f60: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  le(pParse, iDb, 
6f70: 69 53 74 61 74 43 75 72 2c 20 30 2c 20 30 29 3b  iStatCur, 0, 0);
6f80: 0a 20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  .  iMem = pParse
6f90: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 61 73 73 65  ->nMem+1;.  asse
6fa0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
6fb0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
6fc0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72 28  Db, 0) );.  for(
6fd0: 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
6fe0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
6ff0: 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74  ash); k; k=sqlit
7000: 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
7010: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
7020: 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
7030: 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
7040: 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28  analyzeOneTable(
7050: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
7060: 20 69 53 74 61 74 43 75 72 2c 20 69 4d 65 6d 29   iStatCur, iMem)
7070: 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c  ;.  }.  loadAnal
7080: 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62  ysis(pParse, iDb
7090: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
70a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
70b0: 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73  ill do an analys
70c0: 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74  is of a single t
70d0: 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61 74  able in.** a dat
70e0: 61 62 61 73 65 2e 20 20 49 66 20 70 4f 6e 6c 79  abase.  If pOnly
70f0: 49 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Idx is not NULL 
7100: 74 68 65 6e 20 69 74 20 69 73 20 61 20 73 69 6e  then it is a sin
7110: 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 20  gle index.** in 
7120: 70 54 61 62 20 74 68 61 74 20 73 68 6f 75 6c 64  pTab that should
7130: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f   be analyzed..*/
7140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
7150: 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20  lyzeTable(Parse 
7160: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
7170: 70 54 61 62 2c 20 49 6e 64 65 78 20 2a 70 4f 6e  pTab, Index *pOn
7180: 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 44  lyIdx){.  int iD
7190: 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75  b;.  int iStatCu
71a0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  r;..  assert( pT
71b0: 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
71c0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
71d0: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70  oldsAllMutexes(p
71e0: 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20  Parse->db) );.  
71f0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
7200: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
7210: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
7220: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
7230: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
7240: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
7250: 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20  Db);.  iStatCur 
7260: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
7270: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b    pParse->nTab +
7280: 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e 6c 79  = 3;.  if( pOnly
7290: 49 64 78 20 29 7b 0a 20 20 20 20 6f 70 65 6e 53  Idx ){.    openS
72a0: 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  tatTable(pParse,
72b0: 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20   iDb, iStatCur, 
72c0: 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c  pOnlyIdx->zName,
72d0: 20 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c 73 65   "idx");.  }else
72e0: 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54 61  {.    openStatTa
72f0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ble(pParse, iDb,
7300: 20 69 53 74 61 74 43 75 72 2c 20 70 54 61 62 2d   iStatCur, pTab-
7310: 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29 3b 0a  >zName, "tbl");.
7320: 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65    }.  analyzeOne
7330: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
7340: 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20 69 53  ab, pOnlyIdx, iS
7350: 74 61 74 43 75 72 2c 20 70 50 61 72 73 65 2d 3e  tatCur, pParse->
7360: 6e 4d 65 6d 2b 31 29 3b 0a 20 20 6c 6f 61 64 41  nMem+1);.  loadA
7370: 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20  nalysis(pParse, 
7380: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iDb);.}../*.** G
7390: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
73a0: 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
73b0: 6d 61 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65  mand.  The parse
73c0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
73d0: 74 69 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20  tine.** when it 
73e0: 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e  recognizes an AN
73f0: 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
7400: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  *.**        ANAL
7410: 59 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 20  YZE             
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
7430: 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e  - 1.**        AN
7440: 41 4c 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65  ALYZE  <database
7450: 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
7460: 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
7470: 41 4e 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62  ANALYZE  ?<datab
7480: 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
7490: 3e 20 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 3.**.** Fo
74a0: 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
74b0: 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
74c0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
74d0: 73 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  s to be analyzed
74e0: 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c  ..** Form 2 anal
74f0: 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  yzes all indices
7500: 20 74 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61   the single data
7510: 62 61 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46  base named..** F
7520: 6f 72 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61  orm 3 analyzes a
7530: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
7540: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
7550: 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  amed table..*/.v
7560: 6f 69 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  oid sqlite3Analy
7570: 7a 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ze(Parse *pParse
7580: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
7590: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
75a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
75b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
75c0: 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b  nt iDb;.  int i;
75d0: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62  .  char *z, *zDb
75e0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
75f0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
7600: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
7610: 61 6d 65 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ame;..  /* Read 
7620: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
7630: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
7640: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
7650: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
7660: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
7670: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
7680: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73  rn NULL. */.  as
7690: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
76a0: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
76b0: 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b  s(pParse->db) );
76c0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
76d0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
76e0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
76f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
7700: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32    assert( pName2
7710: 21 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30  !=0 || pName1==0
7720: 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   );.  if( pName1
7730: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f  ==0 ){.    /* Fo
7740: 72 6d 20 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65  rm 1:  Analyze e
7750: 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20  verything */.   
7760: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
7770: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
7780: 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74   if( i==1 ) cont
7790: 69 6e 75 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74  inue;  /* Do not
77a0: 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 54 45 4d   analyze the TEM
77b0: 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
77c0: 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62      analyzeDatab
77d0: 61 73 65 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ase(pParse, i);.
77e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
77f0: 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29  ( pName2->n==0 )
7800: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a  {.    /* Form 2:
7810: 20 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61    Analyze the da
7820: 74 61 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20  tabase or table 
7830: 6e 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62  named */.    iDb
7840: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
7850: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
7860: 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
7870: 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74        analyzeDat
7880: 61 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 44  abase(pParse, iD
7890: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  b);.    }else{. 
78a0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
78b0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
78c0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
78d0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
78e0: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
78f0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
7900: 62 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a  b, z, 0))!=0 ){.
7910: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
7920: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
7930: 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64  Idx->pTable, pId
7940: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
7950: 65 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71  e if( (pTab = sq
7960: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
7970: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 30  (pParse, 0, z, 0
7980: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
7990: 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28     analyzeTable(
79a0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
79b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
79c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
79d0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
79e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
79f0: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20  .    /* Form 3: 
7a00: 41 6e 61 6c 79 7a 65 20 74 68 65 20 66 75 6c 6c  Analyze the full
7a10: 79 20 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  y qualified tabl
7a20: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 44  e name */.    iD
7a30: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
7a40: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
7a50: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
7a60: 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  pTableName);.   
7a70: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
7a80: 20 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61       zDb = db->a
7a90: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7aa0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
7ab0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7ac0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  , pTableName);. 
7ad0: 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20       if( z ){.  
7ae0: 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78 20        if( (pIdx 
7af0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
7b00: 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 29 21  ex(db, z, zDb))!
7b10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7b20: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61  analyzeTable(pPa
7b30: 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  rse, pIdx->pTabl
7b40: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
7b50: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61    }else if( (pTa
7b60: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
7b70: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  eTable(pParse, 0
7b80: 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b  , z, zDb))!=0 ){
7b90: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
7ba0: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
7bb0: 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pTab, 0);.      
7bc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
7bd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
7be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
7bf0: 20 20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20    .  }.}../*.** 
7c00: 55 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  Used to pass inf
7c10: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
7c20: 65 20 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65  e analyzer reade
7c30: 72 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  r through to the
7c40: 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  .** callback rou
7c50: 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  tine..*/.typedef
7c60: 20 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73   struct analysis
7c70: 49 6e 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66  Info analysisInf
7c80: 6f 3b 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73  o;.struct analys
7c90: 69 73 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74  isInfo {.  sqlit
7ca0: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
7cb0: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b  char *zDatabase;
7cc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
7cd0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
7ce0: 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
7cf0: 68 20 69 6e 64 65 78 20 77 68 65 6e 20 72 65 61  h index when rea
7d00: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ding the.** sqli
7d10: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20  te_stat1 table. 
7d20: 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76   .**.**     argv
7d30: 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68  [0] = name of th
7d40: 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 61  e table.**     a
7d50: 72 67 76 5b 31 5d 20 3d 20 6e 61 6d 65 20 6f 66  rgv[1] = name of
7d60: 20 74 68 65 20 69 6e 64 65 78 20 28 6d 69 67 68   the index (migh
7d70: 74 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 20 20  t be NULL).**   
7d80: 20 20 61 72 67 76 5b 32 5d 20 3d 20 72 65 73 75    argv[2] = resu
7d90: 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73 69 73 20  lts of analysis 
7da0: 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20 66 6f 72  - on integer for
7db0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   each column.**.
7dc0: 2a 2a 20 45 6e 74 72 69 65 73 20 66 6f 72 20 77  ** Entries for w
7dd0: 68 69 63 68 20 61 72 67 76 5b 31 5d 3d 3d 4e 55  hich argv[1]==NU
7de0: 4c 4c 20 73 69 6d 70 6c 79 20 72 65 63 6f 72 64  LL simply record
7df0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
7e00: 6f 77 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61  ows in.** the ta
7e10: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
7e20: 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65  nt analysisLoade
7e30: 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  r(void *pData, i
7e40: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
7e50: 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74  argv, char **Not
7e60: 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c 79 73 69  Used){.  analysi
7e70: 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 28  sInfo *pInfo = (
7e80: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a 29 70 44  analysisInfo*)pD
7e90: 61 74 61 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ata;.  Index *pI
7ea0: 6e 64 65 78 3b 0a 20 20 54 61 62 6c 65 20 2a 70  ndex;.  Table *p
7eb0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Table;.  int i, 
7ec0: 63 2c 20 6e 3b 0a 20 20 74 52 6f 77 63 6e 74 20  c, n;.  tRowcnt 
7ed0: 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  v;.  const char 
7ee0: 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  *z;..  assert( a
7ef0: 72 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53  rgc==3 );.  UNUS
7f00: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
7f10: 74 55 73 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20  tUsed, argc);.. 
7f20: 20 69 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20   if( argv==0 || 
7f30: 61 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72  argv[0]==0 || ar
7f40: 67 76 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  gv[2]==0 ){.    
7f50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7f60: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
7f70: 46 69 6e 64 54 61 62 6c 65 28 70 49 6e 66 6f 2d  FindTable(pInfo-
7f80: 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49  >db, argv[0], pI
7f90: 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  nfo->zDatabase);
7fa0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
7fb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
7fc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76  ;.  }.  if( argv
7fd0: 5b 31 5d 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  [1] ){.    pInde
7fe0: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
7ff0: 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62 2c 20  ndex(pInfo->db, 
8000: 61 72 67 76 5b 31 5d 2c 20 70 49 6e 66 6f 2d 3e  argv[1], pInfo->
8010: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 7d 65  zDatabase);.  }e
8020: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 20  lse{.    pIndex 
8030: 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 70  = 0;.  }.  n = p
8040: 49 6e 64 65 78 20 3f 20 70 49 6e 64 65 78 2d 3e  Index ? pIndex->
8050: 6e 43 6f 6c 75 6d 6e 20 3a 20 30 3b 0a 20 20 7a  nColumn : 0;.  z
8060: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 66 6f   = argv[2];.  fo
8070: 72 28 69 3d 30 3b 20 2a 7a 20 26 26 20 69 3c 3d  r(i=0; *z && i<=
8080: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20 3d  n; i++){.    v =
8090: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
80a0: 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26 20  c=z[0])>='0' && 
80b0: 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  c<='9' ){.      
80c0: 76 20 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20 27  v = v*10 + c - '
80d0: 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  0';.      z++;. 
80e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
80f0: 30 20 29 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  0 ) pTable->nRow
8100: 45 73 74 20 3d 20 76 3b 0a 20 20 20 20 69 66 28  Est = v;.    if(
8110: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 62 72 65   pIndex==0 ) bre
8120: 61 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  ak;.    pIndex->
8130: 61 69 52 6f 77 45 73 74 5b 69 5d 20 3d 20 76 3b  aiRowEst[i] = v;
8140: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 20 27  .    if( *z==' '
8150: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
8160: 6d 65 6d 63 6d 70 28 7a 2c 20 22 75 6e 6f 72 64  memcmp(z, "unord
8170: 65 72 65 64 22 2c 20 31 30 29 3d 3d 30 20 29 7b  ered", 10)==0 ){
8180: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 62  .      pIndex->b
8190: 55 6e 6f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  Unordered = 1;. 
81a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
81b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
81c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
81d0: 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 20  e Index.aSample 
81e0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
81f0: 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65  NULL, delete the
8200: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
8210: 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  .** and its cont
8220: 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
8230: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
8240: 53 61 6d 70 6c 65 73 28 73 71 6c 69 74 65 33 20  Samples(sqlite3 
8250: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
8260: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
8270: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
8280: 69 66 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  if( pIdx->aSampl
8290: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  e ){.    int j;.
82a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
82b0: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 6a 2b  Idx->nSample; j+
82c0: 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 53  +){.      IndexS
82d0: 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70 49 64 78  ample *p = &pIdx
82e0: 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20  ->aSample[j];.  
82f0: 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65      if( p->eType
8300: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
8310: 20 70 2d 3e 65 54 79 70 65 3d 3d 53 51 4c 49 54   p->eType==SQLIT
8320: 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
8330: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8340: 64 62 2c 20 70 2d 3e 75 2e 7a 29 3b 0a 20 20 20  db, p->u.z);.   
8350: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8360: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8370: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 3b   pIdx->aSample);
8380: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 20 26 26  .  }.  if( db &&
8390: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
83a0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78  d==0 ){.    pIdx
83b0: 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20  ->nSample = 0;. 
83c0: 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65     pIdx->aSample
83d0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a   = 0;.  }.#else.
83e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
83f0: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
8400: 5f 50 41 52 41 4d 45 54 45 52 28 70 49 64 78 29  _PARAMETER(pIdx)
8410: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 64  ;.#endif.}..#ifd
8420: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8430: 5f 53 54 41 54 33 0a 2f 2a 0a 2a 2a 20 4c 6f 61  _STAT3./*.** Loa
8440: 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
8450: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  he sqlite_stat3 
8460: 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 49  table into the I
8470: 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d 0a 2a  ndex.aSample[].*
8480: 2a 20 61 72 72 61 79 73 20 6f 66 20 61 6c 6c 20  * arrays of all 
8490: 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  indices..*/.stat
84a0: 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61 74 33  ic int loadStat3
84b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
84c0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
84d0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 73 20  /* Result codes 
8500: 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73  from subroutines
8510: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
8520: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
8530: 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
8540: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 75  atement being ru
8550: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  n */.  char *zSq
8560: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8570: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
8580: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
8590: 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
85a0: 72 65 76 49 64 78 20 3d 20 30 3b 20 20 20 20 20  revIdx = 0;     
85b0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
85c0: 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f   index in the lo
85d0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 20  op */.  int idx 
85e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
85f0: 20 20 20 20 20 20 2f 2a 20 73 6c 6f 74 20 69 6e        /* slot in
8600: 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d   pIdx->aSample[]
8610: 20 66 6f 72 20 6e 65 78 74 20 73 61 6d 70 6c 65   for next sample
8620: 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 20 20 20 2f 2a 20 44 61 74 61 74 79 70 65 20      /* Datatype 
8650: 6f 66 20 61 20 73 61 6d 70 6c 65 20 2a 2f 0a 20  of a sample */. 
8660: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 53   IndexSample *pS
8670: 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  ample;         /
8680: 2a 20 41 20 73 6c 6f 74 20 69 6e 20 70 49 64 78  * A slot in pIdx
8690: 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a  ->aSample[] */..
86a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 46 69    if( !sqlite3Fi
86b0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c  ndTable(db, "sql
86c0: 69 74 65 5f 73 74 61 74 33 22 2c 20 7a 44 62 29  ite_stat3", zDb)
86d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
86e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
86f0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d   zSql = sqlite3M
8700: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
8710: 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 63 6f    "SELECT idx,co
8720: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73  unt(*) FROM %Q.s
8730: 71 6c 69 74 65 5f 73 74 61 74 33 22 0a 20 20 20  qlite_stat3".   
8740: 20 20 20 22 20 47 52 4f 55 50 20 42 59 20 69 64     " GROUP BY id
8750: 78 22 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  x", zDb);.  if( 
8760: 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65 74  !zSql ){.    ret
8770: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8790: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
87a0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
87b0: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
87c0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
87d0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
87e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65  urn rc;..  while
87f0: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
8800: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
8810: 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  W ){.    char *z
8820: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64 65  Index;   /* Inde
8830: 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e  x name */.    In
8840: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a  dex *pIdx;    /*
8850: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8860: 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
8870: 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b      int nSample;
8880: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8890: 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 0a 20 20 20   samples */..   
88a0: 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20   zIndex = (char 
88b0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
88c0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
88d0: 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d  .    if( zIndex=
88e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
88f0: 20 20 20 6e 53 61 6d 70 6c 65 20 3d 20 73 71 6c     nSample = sql
8900: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
8910: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70  pStmt, 1);.    p
8920: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
8930: 64 49 6e 64 65 78 28 64 62 2c 20 7a 49 6e 64 65  dIndex(db, zInde
8940: 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  x, zDb);.    if(
8950: 20 70 49 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69   pIdx==0 ) conti
8960: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
8970: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3d 3d   pIdx->nSample==
8980: 30 20 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 6e  0 );.    pIdx->n
8990: 53 61 6d 70 6c 65 20 3d 20 6e 53 61 6d 70 6c 65  Sample = nSample
89a0: 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d  ;.    pIdx->aSam
89b0: 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ple = sqlite3Mal
89c0: 6c 6f 63 5a 65 72 6f 28 20 6e 53 61 6d 70 6c 65  locZero( nSample
89d0: 2a 73 69 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d  *sizeof(IndexSam
89e0: 70 6c 65 29 20 29 3b 0a 20 20 20 20 70 49 64 78  ple) );.    pIdx
89f0: 2d 3e 61 76 67 45 71 20 3d 20 70 49 64 78 2d 3e  ->avgEq = pIdx->
8a00: 61 69 52 6f 77 45 73 74 5b 31 5d 3b 0a 20 20 20  aiRowEst[1];.   
8a10: 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61 6d 70   if( pIdx->aSamp
8a20: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  le==0 ){.      d
8a30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8a40: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
8a50: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
8a60: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
8a70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8a80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
8a90: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
8aa0: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
8ab0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
8ac0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
8ad0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
8ae0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 6e     "SELECT idx,n
8af0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
8b00: 6c 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  le FROM %Q.sqlit
8b10: 65 5f 73 74 61 74 33 22 2c 20 7a 44 62 29 3b 0a  e_stat3", zDb);.
8b20: 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
8b30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8b40: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63  _NOMEM;.  }.  rc
8b50: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
8b60: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  re(db, zSql, -1,
8b70: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
8b80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8b90: 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63   zSql);.  if( rc
8ba0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8bb0: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
8bc0: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
8bd0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
8be0: 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f  har *zIndex;   /
8bf0: 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a  * Index name */.
8c00: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
8c10: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8c20: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a 65  o the index obje
8c30: 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ct */.    int i;
8c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8c50: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
8c60: 20 74 52 6f 77 63 6e 74 20 73 75 6d 45 71 3b 20   tRowcnt sumEq; 
8c70: 20 2f 2a 20 53 75 6d 20 6f 66 20 74 68 65 20 6e   /* Sum of the n
8c80: 45 71 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20  Eq values */..  
8c90: 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72    zIndex = (char
8ca0: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
8cb0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
8cc0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78  ;.    if( zIndex
8cd0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
8ce0: 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74      pIdx = sqlit
8cf0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
8d00: 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20  zIndex, zDb);.  
8d10: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
8d20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8d30: 28 20 70 49 64 78 3d 3d 70 50 72 65 76 49 64 78  ( pIdx==pPrevIdx
8d40: 20 29 7b 0a 20 20 20 20 20 20 69 64 78 2b 2b 3b   ){.      idx++;
8d50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8d60: 20 20 70 50 72 65 76 49 64 78 20 3d 20 70 49 64    pPrevIdx = pId
8d70: 78 3b 0a 20 20 20 20 20 20 69 64 78 20 3d 20 30  x;.      idx = 0
8d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
8d90: 72 74 28 20 69 64 78 3c 70 49 64 78 2d 3e 6e 53  rt( idx<pIdx->nS
8da0: 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 70 53 61  ample );.    pSa
8db0: 6d 70 6c 65 20 3d 20 26 70 49 64 78 2d 3e 61 53  mple = &pIdx->aS
8dc0: 61 6d 70 6c 65 5b 69 64 78 5d 3b 0a 20 20 20 20  ample[idx];.    
8dd0: 70 53 61 6d 70 6c 65 2d 3e 6e 45 71 20 3d 20 28  pSample->nEq = (
8de0: 74 52 6f 77 63 6e 74 29 73 71 6c 69 74 65 33 5f  tRowcnt)sqlite3_
8df0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
8e00: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70 53 61 6d  mt, 1);.    pSam
8e10: 70 6c 65 2d 3e 6e 4c 74 20 3d 20 28 74 52 6f 77  ple->nLt = (tRow
8e20: 63 6e 74 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cnt)sqlite3_colu
8e30: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
8e40: 32 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  2);.    pSample-
8e50: 3e 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74  >nDLt = (tRowcnt
8e60: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
8e70: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 29 3b  int64(pStmt, 3);
8e80: 0a 20 20 20 20 69 66 28 20 69 64 78 3d 3d 70 49  .    if( idx==pI
8e90: 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31 20 29 7b  dx->nSample-1 ){
8ea0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 61 6d 70  .      if( pSamp
8eb0: 6c 65 2d 3e 6e 44 4c 74 3e 30 20 29 7b 0a 20 20  le->nDLt>0 ){.  
8ec0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 73        for(i=0, s
8ed0: 75 6d 45 71 3d 30 3b 20 69 3c 3d 69 64 78 2d 31  umEq=0; i<=idx-1
8ee0: 3b 20 69 2b 2b 29 20 73 75 6d 45 71 20 2b 3d 20  ; i++) sumEq += 
8ef0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  pIdx->aSample[i]
8f00: 2e 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 70 49  .nEq;.        pI
8f10: 64 78 2d 3e 61 76 67 45 71 20 3d 20 28 70 53 61  dx->avgEq = (pSa
8f20: 6d 70 6c 65 2d 3e 6e 4c 74 20 2d 20 73 75 6d 45  mple->nLt - sumE
8f30: 71 29 2f 70 53 61 6d 70 6c 65 2d 3e 6e 44 4c 74  q)/pSample->nDLt
8f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8f50: 69 66 28 20 70 49 64 78 2d 3e 61 76 67 45 71 3c  if( pIdx->avgEq<
8f60: 3d 30 20 29 20 70 49 64 78 2d 3e 61 76 67 45 71  =0 ) pIdx->avgEq
8f70: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8f80: 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
8f90: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
8fa0: 74 2c 20 34 29 3b 0a 20 20 20 20 70 53 61 6d 70  t, 4);.    pSamp
8fb0: 6c 65 2d 3e 65 54 79 70 65 20 3d 20 28 75 38 29  le->eType = (u8)
8fc0: 65 54 79 70 65 3b 0a 20 20 20 20 73 77 69 74 63  eType;.    switc
8fd0: 68 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20  h( eType ){.    
8fe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
8ff0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20  TEGER: {.       
9000: 20 70 53 61 6d 70 6c 65 2d 3e 75 2e 69 20 3d 20   pSample->u.i = 
9010: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
9020: 6e 74 36 34 28 70 53 74 6d 74 2c 20 34 29 3b 0a  nt64(pStmt, 4);.
9030: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
9050: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
9060: 7b 0a 20 20 20 20 20 20 20 20 70 53 61 6d 70 6c  {.        pSampl
9070: 65 2d 3e 75 2e 72 20 3d 20 73 71 6c 69 74 65 33  e->u.r = sqlite3
9080: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
9090: 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20 20 20  Stmt, 4);.      
90a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
90b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
90c0: 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TE_NULL: {.     
90d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
90e0: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
90f0: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
9100: 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65  SQLITE_TEXT || e
9110: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  Type==SQLITE_BLO
9120: 42 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 63  B ); {.        c
9130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
9140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 28 0a 20  const char *)(. 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 54               (eT
9160: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
9170: 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
9180: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
9190: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 3a  _blob(pStmt, 4):
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
91b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
91c0: 78 74 28 70 53 74 6d 74 2c 20 34 29 0a 20 20 20  xt(pStmt, 4).   
91d0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
91e0: 20 20 20 69 6e 74 20 6e 20 3d 20 7a 20 3f 20 73     int n = z ? s
91f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
9200: 74 65 73 28 70 53 74 6d 74 2c 20 34 29 20 3a 20  tes(pStmt, 4) : 
9210: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 61 6d 70  0;.        pSamp
9220: 6c 65 2d 3e 6e 42 79 74 65 20 3d 20 6e 3b 0a 20  le->nByte = n;. 
9230: 20 20 20 20 20 20 20 69 66 28 20 6e 20 3c 20 31         if( n < 1
9240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 61  ){.          pSa
9250: 6d 70 6c 65 2d 3e 75 2e 7a 20 3d 20 30 3b 0a 20  mple->u.z = 0;. 
9260: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9270: 20 20 20 20 20 20 20 20 70 53 61 6d 70 6c 65 2d          pSample-
9280: 3e 75 2e 7a 20 3d 20 73 71 6c 69 74 65 33 4d 61  >u.z = sqlite3Ma
9290: 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 20 20 20  lloc(n);.       
92a0: 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e     if( pSample->
92b0: 75 2e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  u.z==0 ){.      
92c0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
92d0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
92e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
92f0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
9300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
9310: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9320: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9330: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
9340: 53 61 6d 70 6c 65 2d 3e 75 2e 7a 2c 20 7a 2c 20  Sample->u.z, z, 
9350: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
9360: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9370: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9380: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
9390: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
93a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
93b0: 33 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  3 */../*.** Load
93c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
93d0: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
93e0: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
93f0: 33 20 74 61 62 6c 65 73 2e 20 54 68 65 0a 2a 2a  3 tables. The.**
9400: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c   contents of sql
9410: 69 74 65 5f 73 74 61 74 31 20 61 72 65 20 75 73  ite_stat1 are us
9420: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
9430: 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
9440: 74 5b 5d 0a 2a 2a 20 61 72 72 61 79 73 2e 20 54  t[].** arrays. T
9450: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73  he contents of s
9460: 71 6c 69 74 65 5f 73 74 61 74 33 20 61 72 65 20  qlite_stat3 are 
9470: 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65  used to populate
9480: 20 74 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53   the.** Index.aS
9490: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a  ample[] arrays..
94a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
94b0: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
94c0: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
94d0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
94e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20  SQLITE_ERROR.** 
94f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
9500: 74 68 69 73 20 63 61 73 65 2c 20 65 76 65 6e 20  this case, even 
9510: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
9520: 5f 53 54 41 54 33 20 77 61 73 20 64 65 66 69 6e  _STAT3 was defin
9530: 65 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f  ed .** during co
9540: 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68  mpilation and th
9550: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74  e sqlite_stat3 t
9560: 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  able is present,
9570: 20 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a 2a 20   no data is .** 
9580: 72 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a  read from it..**
9590: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e  .** If SQLITE_EN
95a0: 41 42 4c 45 5f 53 54 41 54 33 20 77 61 73 20 64  ABLE_STAT3 was d
95b0: 65 66 69 6e 65 64 20 64 75 72 69 6e 67 20 63 6f  efined during co
95c0: 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68  mpilation and th
95d0: 65 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61  e .** sqlite_sta
95e0: 74 33 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  t3 table is not 
95f0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
9600: 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f  atabase, SQLITE_
9610: 45 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75  ERROR is.** retu
9620: 72 6e 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69  rned. However, i
9630: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 61 74  n this case, dat
9640: 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  a is read from t
9650: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 0a  he sqlite_stat1.
9660: 2a 2a 20 74 61 62 6c 65 20 28 69 66 20 69 74 20  ** table (if it 
9670: 69 73 20 70 72 65 73 65 6e 74 29 20 62 65 66 6f  is present) befo
9680: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
9690: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
96a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
96b0: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
96c0: 20 73 65 74 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63   sets db->malloc
96d0: 46 61 69 6c 65 64 2e 0a 2a 2a 20 54 68 69 73 20  Failed..** This 
96e0: 6d 65 61 6e 73 20 69 66 20 74 68 65 20 63 61 6c  means if the cal
96f0: 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 61 72  ler does not car
9700: 65 20 61 62 6f 75 74 20 6f 74 68 65 72 20 65 72  e about other er
9710: 72 6f 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e  rors, the return
9720: 0a 2a 2a 20 63 6f 64 65 20 6d 61 79 20 62 65 20  .** code may be 
9730: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
9740: 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c  sqlite3AnalysisL
9750: 6f 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  oad(sqlite3 *db,
9760: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 61 6e 61   int iDb){.  ana
9770: 6c 79 73 69 73 49 6e 66 6f 20 73 49 6e 66 6f 3b  lysisInfo sInfo;
9780: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
9790: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
97a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
97b0: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
97c0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
97d0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
97e0: 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20  b].pBt!=0 );..  
97f0: 2f 2a 20 43 6c 65 61 72 20 61 6e 79 20 70 72 69  /* Clear any pri
9800: 6f 72 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f  or statistics */
9810: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9820: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
9830: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
9840: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
9850: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
9860: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
9870: 69 64 78 48 61 73 68 29 3b 69 3b 69 3d 73 71 6c  idxHash);i;i=sql
9880: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9890: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
98a0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
98b0: 61 28 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a(i);.    sqlite
98c0: 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
98d0: 49 64 78 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Idx);.#ifdef SQL
98e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
98f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
9900: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
9910: 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 70 49  b, pIdx);.    pI
9920: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b  dx->aSample = 0;
9930: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
9940: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
9950: 73 75 72 65 20 74 68 65 20 73 71 6c 69 74 65 5f  sure the sqlite_
9960: 73 74 61 74 31 20 74 61 62 6c 65 20 65 78 69 73  stat1 table exis
9970: 74 73 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62  ts */.  sInfo.db
9980: 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a   = db;.  sInfo.z
9990: 44 61 74 61 62 61 73 65 20 3d 20 64 62 2d 3e 61  Database = db->a
99a0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
99b0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
99c0: 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
99d0: 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
99e0: 7a 44 61 74 61 62 61 73 65 29 3d 3d 30 20 29 7b  zDatabase)==0 ){
99f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9a00: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
9a10: 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61   /* Load new sta
9a20: 74 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74  tistics out of t
9a30: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
9a40: 74 61 62 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20  table */.  zSql 
9a50: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9a60: 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  (db, .      "SEL
9a70: 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74  ECT tbl,idx,stat
9a80: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
9a90: 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44  stat1", sInfo.zD
9aa0: 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
9ab0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
9ac0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9ad0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9ae0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
9af0: 28 64 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79  (db, zSql, analy
9b00: 73 69 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66  sisLoader, &sInf
9b10: 6f 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  o, 0);.    sqlit
9b20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
9b30: 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c  l);.  }...  /* L
9b40: 6f 61 64 20 74 68 65 20 73 74 61 74 69 73 74 69  oad the statisti
9b50: 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  cs from the sqli
9b60: 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65 2e 20  te_stat3 table. 
9b70: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9b80: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20  _ENABLE_STAT3.  
9b90: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9ba0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  K ){.    rc = lo
9bb0: 61 64 53 74 61 74 33 28 64 62 2c 20 73 49 6e 66  adStat3(db, sInf
9bc0: 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  o.zDatabase);.  
9bd0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
9be0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
9bf0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
9c00: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
9c10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9c20: 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ...#endif /* SQL
9c30: 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
9c40: 20 2a 2f 0a                                       */.