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

Artifact fcc42c3a9f4c3a048b20e138e3530b7f3d8470f6:


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 73 65 64 65 64 20 62 79 20 73   superseded 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 70 6c 65 2e 20 20  an the sample.  
1320: 54 68 65 20 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20  The nDLt column 
1330: 69 73 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61  is the approxima
1340: 74 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  te.** number of 
1350: 64 69 73 74 69 6e 63 74 20 6c 65 66 74 2d 6d 6f  distinct left-mo
1360: 73 74 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  st entries in th
1370: 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
1380: 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 74 68   less than.** th
1390: 65 20 73 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20  e sample..**.** 
13a0: 46 75 74 75 72 65 20 76 65 72 73 69 6f 6e 73 20  Future versions 
13b0: 6f 66 20 53 51 4c 69 74 65 20 6d 69 67 68 74 20  of SQLite might 
13c0: 63 68 61 6e 67 65 20 74 6f 20 73 74 6f 72 65 20  change to store 
13d0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
13e0: 69 6e 67 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65 20  ing.** multiple 
13f0: 69 6e 74 65 67 65 72 73 20 76 61 6c 75 65 73 20  integers values 
1400: 69 6e 20 74 68 65 20 6e 44 4c 74 20 63 6f 6c 75  in the nDLt colu
1410: 6d 6e 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  mn of sqlite_sta
1420: 74 33 2e 20 20 54 68 65 20 66 69 72 73 74 0a 2a  t3.  The first.*
1430: 2a 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62  * integer will b
1440: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1450: 70 72 69 6f 72 20 69 6e 64 65 78 20 65 6e 74 69  prior index enti
1460: 72 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73  res that are dis
1470: 74 69 6e 63 74 20 69 6e 0a 2a 2a 20 74 68 65 20  tinct in.** the 
1480: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1490: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  .  The second in
14a0: 74 65 67 65 72 20 77 69 6c 6c 20 62 65 20 74 68  teger will be th
14b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f  e number of prio
14c0: 72 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 69  r index.** entri
14d0: 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73 74  es that are dist
14e0: 69 6e 63 74 20 69 6e 20 74 68 65 20 66 69 72 73  inct in the firs
14f0: 74 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 2e 20 20  t two columns.  
1500: 54 68 65 20 74 68 69 72 64 20 69 6e 74 65 67 65  The third intege
1510: 72 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 74 68 65  r.** will be the
1520: 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72   number of prior
1530: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
1540: 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
1550: 20 69 6e 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   in the first.**
1560: 20 74 68 72 65 65 20 63 6f 6c 75 6d 6e 73 2e 20   three columns. 
1570: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
1580: 57 69 74 68 20 74 68 61 74 20 65 78 74 65 6e 73  With that extens
1590: 69 6f 6e 2c 20 74 68 65 20 6e 44 4c 74 20 66 69  ion, the nDLt fi
15a0: 65 6c 64 20 69 73 0a 2a 2a 20 73 69 6d 69 6c 61  eld is.** simila
15b0: 72 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f  r in function to
15c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
15d0: 31 2e 73 74 61 74 20 66 69 65 6c 64 2e 0a 2a 2a  1.stat field..**
15e0: 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 62 65  .** There can be
15f0: 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e 75   an arbitrary nu
1600: 6d 62 65 72 20 6f 66 20 73 71 6c 69 74 65 5f 73  mber of sqlite_s
1610: 74 61 74 33 20 65 6e 74 72 69 65 73 20 70 65 72  tat3 entries per
1620: 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 20 41   index..** The A
1630: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 77  NALYZE command w
1640: 69 6c 6c 20 74 79 70 69 63 61 6c 6c 79 20 67 65  ill typically ge
1650: 6e 65 72 61 74 65 20 73 71 6c 69 74 65 5f 73 74  nerate sqlite_st
1660: 61 74 33 20 74 61 62 6c 65 73 0a 2a 2a 20 74 68  at3 tables.** th
1670: 61 74 20 63 6f 6e 74 61 69 6e 20 62 65 74 77 65  at contain betwe
1680: 65 6e 20 31 30 20 61 6e 64 20 34 30 20 73 61 6d  en 10 and 40 sam
1690: 70 6c 65 73 20 77 68 69 63 68 20 61 72 65 20 64  ples which are d
16a0: 69 73 74 72 69 62 75 74 65 64 20 61 63 72 6f 73  istributed acros
16b0: 73 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 70 61  s.** the key spa
16c0: 63 65 2c 20 74 68 6f 75 67 68 20 6e 6f 74 20 75  ce, though not u
16d0: 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e 64 20 77 68  niformly, and wh
16e0: 69 63 68 20 69 6e 63 6c 75 64 65 20 73 61 6d 70  ich include samp
16f0: 6c 65 73 20 77 69 74 68 0a 2a 2a 20 6c 61 72 67  les with.** larg
1700: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 6e 45 71  est possible nEq
1710: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e   values..*/.#ifn
1720: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1730: 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64 65  ANALYZE.#include
1740: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
1750: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1760: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
1770: 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65  e that opens the
1780: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61   sqlite_stat1 ta
1790: 62 6c 65 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  ble for.** writi
17a0: 6e 67 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  ng with cursor i
17b0: 53 74 61 74 43 75 72 2e 20 49 66 20 74 68 65 20  StatCur. If the 
17c0: 6c 69 62 72 61 72 79 20 77 61 73 20 62 75 69 6c  library was buil
17d0: 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 53 51  t with the.** SQ
17e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17f0: 34 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2c  4 macro defined,
1800: 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
1810: 5f 73 74 61 74 34 20 74 61 62 6c 65 20 69 73 0a  _stat4 table is.
1820: 2a 2a 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ** opened for wr
1830: 69 74 69 6e 67 20 75 73 69 6e 67 20 63 75 72 73  iting using curs
1840: 6f 72 20 28 69 53 74 61 74 43 75 72 2b 31 29 0a  or (iStatCur+1).
1850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
1860: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 73  ite_stat1 tables
1870: 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 69 6f   does not previo
1880: 75 73 6c 79 20 65 78 69 73 74 2c 20 69 74 20 69  usly exist, it i
1890: 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 20 53 69  s created..** Si
18a0: 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20  milarly, if the 
18b0: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62  sqlite_stat4 tab
18c0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
18d0: 74 20 61 6e 64 20 74 68 65 20 6c 69 62 72 61 72  t and the librar
18e0: 79 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64  y.** is compiled
18f0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45 4e 41   with SQLITE_ENA
1900: 42 4c 45 5f 53 54 41 54 34 20 64 65 66 69 6e 65  BLE_STAT4 define
1910: 64 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  d, it is created
1920: 2e 20 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  . .**.** Argumen
1930: 74 20 7a 57 68 65 72 65 20 6d 61 79 20 62 65 20  t zWhere may be 
1940: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
1950: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1960: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a   a table name,.*
1970: 2a 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 61  * or it may be a
1980: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 49   NULL pointer. I
1990: 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
19a0: 2c 20 74 68 65 6e 20 61 6c 6c 20 65 6e 74 72 69  , then all entri
19b0: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c  es in.** the sql
19c0: 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 28 69  ite_stat1 and (i
19d0: 66 20 61 70 70 6c 69 63 61 62 6c 65 29 20 73 71  f applicable) sq
19e0: 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65  lite_stat4 table
19f0: 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
1a00: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
1a10: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
1a20: 2e 20 49 66 20 7a 57 68 65 72 65 3d 3d 30 2c 20  . If zWhere==0, 
1a30: 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
1a40: 65 72 61 74 65 64 0a 2a 2a 20 74 6f 20 64 65 6c  erated.** to del
1a50: 65 74 65 20 61 6c 6c 20 73 74 61 74 20 74 61 62  ete all stat tab
1a60: 6c 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  le entries..*/.s
1a70: 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 53  tatic void openS
1a80: 74 61 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  tatTable(.  Pars
1a90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1aa0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1ab0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1ac0: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
1ad0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1ae0: 61 73 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ase we are looki
1af0: 6e 67 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ng in */.  int i
1b00: 53 74 61 74 43 75 72 2c 20 20 20 20 20 20 20 20  StatCur,        
1b10: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
1b20: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
1b30: 65 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  e on this cursor
1b40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b50: 20 2a 7a 57 68 65 72 65 2c 20 20 20 20 20 2f 2a   *zWhere,     /*
1b60: 20 44 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20   Delete entries 
1b70: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 6f  for this table o
1b80: 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1b90: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 54  st char *zWhereT
1ba0: 79 70 65 20 20 2f 2a 20 45 69 74 68 65 72 20 22  ype  /* Either "
1bb0: 74 62 6c 22 20 6f 72 20 22 69 64 78 22 20 2a 2f  tbl" or "idx" */
1bc0: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
1bd0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1bf0: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1c00: 72 20 2a 7a 43 6f 6c 73 3b 0a 20 20 7d 20 61 54  r *zCols;.  } aT
1c10: 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  able[] = {.    {
1c20: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
1c30: 20 22 74 62 6c 2c 69 64 78 2c 73 74 61 74 22 20   "tbl,idx,stat" 
1c40: 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
1c50: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
1c60: 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74 61 74    { "sqlite_stat
1c70: 34 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71  4", "tbl,idx,neq
1c80: 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65  ,nlt,ndlt,sample
1c90: 22 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b  " },.#endif.  };
1ca0: 0a 0a 20 20 69 6e 74 20 61 52 6f 6f 74 5b 5d 20  ..  int aRoot[] 
1cb0: 3d 20 7b 30 2c 20 30 7d 3b 0a 20 20 75 38 20 61  = {0, 0};.  u8 a
1cc0: 43 72 65 61 74 65 54 62 6c 5b 5d 20 3d 20 7b 30  CreateTbl[] = {0
1cd0: 2c 20 30 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a  , 0};..  int i;.
1ce0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1cf0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
1d00: 20 2a 70 44 62 3b 0a 20 20 56 64 62 65 20 2a 76   *pDb;.  Vdbe *v
1d10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1d20: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1d30: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
1d40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d50: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
1d60: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 61  texes(db) );.  a
1d70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
1d80: 62 65 44 62 28 76 29 3d 3d 64 62 20 29 3b 0a 20  beDb(v)==db );. 
1d90: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
1da0: 69 44 62 5d 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  iDb];..  /* Crea
1db0: 74 65 20 6e 65 77 20 73 74 61 74 69 73 74 69 63  te new statistic
1dc0: 20 74 61 62 6c 65 73 20 69 66 20 74 68 65 79 20   tables if they 
1dd0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72  do not exist, or
1de0: 20 63 6c 65 61 72 20 74 68 65 6d 0a 20 20 2a 2a   clear them.  **
1df0: 20 69 66 20 74 68 65 79 20 64 6f 20 61 6c 72 65   if they do alre
1e00: 61 64 79 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a  ady exist..  */.
1e10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
1e20: 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 3b 20  aySize(aTable); 
1e30: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1e40: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 61 54 61  char *zTab = aTa
1e50: 62 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ble[i].zName;.  
1e60: 20 20 54 61 62 6c 65 20 2a 70 53 74 61 74 3b 0a    Table *pStat;.
1e70: 20 20 20 20 69 66 28 20 28 70 53 74 61 74 20 3d      if( (pStat =
1e80: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1e90: 65 28 64 62 2c 20 7a 54 61 62 2c 20 70 44 62 2d  e(db, zTab, pDb-
1ea0: 3e 7a 4e 61 6d 65 29 29 3d 3d 30 20 29 7b 0a 20  >zName))==0 ){. 
1eb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c 69       /* The sqli
1ec0: 74 65 5f 73 74 61 74 5b 31 32 5d 20 74 61 62 6c  te_stat[12] tabl
1ed0: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1ee0: 2e 20 43 72 65 61 74 65 20 69 74 2e 20 4e 6f 74  . Create it. Not
1ef0: 65 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20  e that a .      
1f00: 2a 2a 20 73 69 64 65 2d 65 66 66 65 63 74 20 6f  ** side-effect o
1f10: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
1f20: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
1f30: 74 6f 20 6c 65 61 76 65 20 74 68 65 20 72 6f 6f  to leave the roo
1f40: 74 70 61 67 65 20 0a 20 20 20 20 20 20 2a 2a 20  tpage .      ** 
1f50: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
1f60: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
1f70: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 20 54 68  rse->regRoot. Th
1f80: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
1f90: 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73  .      ** becaus
1fa0: 65 20 74 68 65 20 4f 70 65 6e 57 72 69 74 65 20  e the OpenWrite 
1fb0: 6f 70 63 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c  opcode below wil
1fc0: 6c 20 62 65 20 6e 65 65 64 69 6e 67 20 69 74 2e  l be needing it.
1fd0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1fe0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1ff0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
2000: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
2010: 25 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a 4e  %s(%s)", pDb->zN
2020: 61 6d 65 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c  ame, zTab, aTabl
2030: 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20  e[i].zCols.     
2040: 20 29 3b 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b   );.      aRoot[
2050: 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  i] = pParse->reg
2060: 52 6f 6f 74 3b 0a 20 20 20 20 20 20 61 43 72 65  Root;.      aCre
2070: 61 74 65 54 62 6c 5b 69 5d 20 3d 20 4f 50 46 4c  ateTbl[i] = OPFL
2080: 41 47 5f 50 32 49 53 52 45 47 3b 0a 20 20 20 20  AG_P2ISREG;.    
2090: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
20a0: 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  The table alread
20b0: 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a 57 68  y exists. If zWh
20c0: 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ere is not NULL,
20d0: 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72   delete all entr
20e0: 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20 61 73  ies .      ** as
20f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2100: 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65 2e 20  e table zWhere. 
2110: 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e 55 4c  If zWhere is NUL
2120: 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  L, delete the.  
2130: 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20 63 6f      ** entire co
2140: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 61  ntents of the ta
2150: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 52  ble. */.      aR
2160: 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74 2d 3e  oot[i] = pStat->
2170: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  tnum;.      sqli
2180: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2190: 72 73 65 2c 20 69 44 62 2c 20 61 52 6f 6f 74 5b  rse, iDb, aRoot[
21a0: 69 5d 2c 20 31 2c 20 7a 54 61 62 29 3b 0a 20 20  i], 1, zTab);.  
21b0: 20 20 20 20 69 66 28 20 7a 57 68 65 72 65 20 29      if( zWhere )
21c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21d0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
21e0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
21f0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
2200: 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c  %s WHERE %s=%Q",
2210: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61   pDb->zName, zTa
2220: 62 2c 20 7a 57 68 65 72 65 54 79 70 65 2c 20 7a  b, zWhereType, z
2230: 57 68 65 72 65 0a 20 20 20 20 20 20 20 20 29 3b  Where.        );
2240: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2250: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c        /* The sql
2260: 69 74 65 5f 73 74 61 74 5b 31 32 5d 20 74 61 62  ite_stat[12] tab
2270: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
2280: 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20 72  s.  Delete all r
2290: 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ows. */.        
22a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22b0: 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61  2(v, OP_Clear, a
22c0: 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20  Root[i], iDb);. 
22d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22e0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
22f0: 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 34 5d 20  sqlite_stat[14] 
2300: 74 61 62 6c 65 73 20 66 6f 72 20 77 72 69 74 69  tables for writi
2310: 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ng. */.  for(i=0
2320: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
2330: 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  able); i++){.   
2340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2350: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
2360: 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69 2c 20  te, iStatCur+i, 
2370: 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b 0a  aRoot[i], iDb);.
2380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2390: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
23a0: 63 68 61 72 20 2a 29 33 2c 20 50 34 5f 49 4e 54  char *)3, P4_INT
23b0: 33 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  32);.    sqlite3
23c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
23d0: 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b 0a  aCreateTbl[i]);.
23e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
23f0: 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65 72 20  ommended number 
2400: 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72 20 73  of samples for s
2410: 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f 0a 23  qlite_stat4.*/.#
2420: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 54  ifndef SQLITE_ST
2430: 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20 64 65  AT4_SAMPLES.# de
2440: 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54 41 54  fine SQLITE_STAT
2450: 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23 65 6e  4_SAMPLES 24.#en
2460: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 65  dif../*.** Three
2470: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 2d   SQL functions -
2480: 20 73 74 61 74 34 5f 69 6e 69 74 28 29 2c 20 73   stat4_init(), s
2490: 74 61 74 34 5f 70 75 73 68 28 29 2c 20 61 6e 64  tat4_push(), and
24a0: 20 73 74 61 74 34 5f 70 6f 70 28 29 20 2d 0a 2a   stat4_pop() -.*
24b0: 2a 20 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61  * share an insta
24c0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
24d0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 74  wing structure t
24e0: 6f 20 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61  o hold their sta
24f0: 74 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  te.** informatio
2500: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
2510: 72 75 63 74 20 53 74 61 74 34 41 63 63 75 6d 20  ruct Stat4Accum 
2520: 53 74 61 74 34 41 63 63 75 6d 3b 0a 73 74 72 75  Stat4Accum;.stru
2530: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 7b 0a  ct Stat4Accum {.
2540: 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20    tRowcnt nRow; 
2550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2560: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2570: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
2580: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
2590: 50 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  PSample;        
25a0: 20 2f 2a 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f   /* How often to
25b0: 20 64 6f 20 61 20 70 65 72 69 6f 64 69 63 20 73   do a periodic s
25c0: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  ample */.  int i
25d0: 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Min;            
25e0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25f0: 20 65 6e 74 72 79 20 77 69 74 68 20 6d 69 6e 69   entry with mini
2600: 6d 75 6d 20 6e 45 71 20 61 6e 64 20 68 61 73 68  mum nEq and hash
2610: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 53 61 6d 70   */.  int mxSamp
2620: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2630: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2640: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20  r of samples to 
2650: 61 63 63 75 6d 75 6c 61 74 65 20 2a 2f 0a 20 20  accumulate */.  
2660: 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20 20 20 20  int nSample;    
2670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2680: 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73  rent number of s
2690: 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  amples */.  int 
26a0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
26b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
26d0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 33 32  e index */.  u32
26e0: 20 69 50 72 6e 3b 20 20 20 20 20 20 20 20 20 20   iPrn;          
26f0: 20 20 20 20 20 20 20 2f 2a 20 50 73 65 75 64 6f         /* Pseudo
2700: 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75  -random number u
2710: 73 65 64 20 66 6f 72 20 73 61 6d 70 6c 69 6e 67  sed for sampling
2720: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 74 61   */.  struct Sta
2730: 74 34 53 61 6d 70 6c 65 20 7b 0a 20 20 20 20 69  t4Sample {.    i
2740: 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
2750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2760: 69 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65  id in main table
2770: 20 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   of the key */. 
2780: 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71     tRowcnt *anEq
2790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 2e 6e 45   sqlite_stat4.nE
27b0: 71 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74  q */.    tRowcnt
27c0: 20 2a 61 6e 4c 74 3b 20 20 20 20 20 20 20 20 20   *anLt;         
27d0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74      /* sqlite_st
27e0: 61 74 34 2e 6e 4c 74 20 2a 2f 0a 20 20 20 20 74  at4.nLt */.    t
27f0: 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 3b 20 20  Rowcnt *anDLt;  
2800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2810: 69 74 65 5f 73 74 61 74 34 2e 6e 44 4c 74 20 2a  ite_stat4.nDLt *
2820: 2f 0a 20 20 20 20 75 38 20 69 73 50 53 61 6d 70  /.    u8 isPSamp
2830: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2840: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70 65   /* True if a pe
2850: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 2a 2f  riodic sample */
2860: 0a 20 20 20 20 75 33 32 20 69 48 61 73 68 3b 20  .    u32 iHash; 
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 2f 2a 20 54 69 65 62 72 65 61 6b 65 72 20 68 61  /* Tiebreaker ha
2890: 73 68 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 20 20  sh */.  } *a;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
28c0: 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a   samples */.};..
28d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
28e0: 41 42 4c 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  ABLE_STAT4./*.**
28f0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2900: 6f 66 20 74 68 65 20 73 74 61 74 34 5f 69 6e 69  of the stat4_ini
2910: 74 28 43 2c 4e 2c 53 29 20 53 51 4c 20 66 75 6e  t(C,N,S) SQL fun
2920: 63 74 69 6f 6e 2e 20 54 68 65 20 74 68 72 65 65  ction. The three
2930: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
2940: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
2950: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2960: 6c 65 20 6f 72 20 69 6e 64 65 78 20 28 43 29 2c  le or index (C),
2970: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
2980: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
2990: 20 69 6e 64 65 78 20 28 4e 29 20 61 6e 64 20 74   index (N) and t
29a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  he number of sam
29b0: 70 6c 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61  ples to accumula
29c0: 74 65 20 28 53 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  te (S)..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
29e0: 61 74 65 73 20 74 68 65 20 53 74 61 74 34 41 63  ates the Stat4Ac
29f0: 63 75 6d 20 6f 62 6a 65 63 74 20 69 6e 20 68 65  cum object in he
2a00: 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 72  ap memory. The r
2a10: 65 74 75 72 6e 20 0a 2a 2a 20 76 61 6c 75 65 20  eturn .** value 
2a20: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2a30: 74 68 65 20 74 68 65 20 53 74 61 74 34 41 63 63  the the Stat4Acc
2a40: 75 6d 20 6f 62 6a 65 63 74 20 65 6e 63 6f 64 65  um object encode
2a50: 64 20 61 73 20 61 20 62 6c 6f 62 20 28 69 2e 65  d as a blob (i.e
2a60: 2e 20 0a 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f  . .** the size o
2a70: 66 20 74 68 65 20 62 6c 6f 62 20 69 73 20 73 69  f the blob is si
2a80: 7a 65 6f 66 28 76 6f 69 64 2a 29 20 62 79 74 65  zeof(void*) byte
2a90: 73 29 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  s). .*/.static v
2aa0: 6f 69 64 20 73 74 61 74 34 49 6e 69 74 28 0a 20  oid stat4Init(. 
2ab0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2ac0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
2ad0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
2ae0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
2af0: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
2b00: 3b 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20  ;.  u8 *pSpace; 
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
2b30: 20 73 70 61 63 65 20 6e 6f 74 20 79 65 74 20 61   space not yet a
2b40: 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 74 52 6f  ssigned */.  tRo
2b50: 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20  wcnt nRow;      
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b70: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
2b80: 6e 20 74 61 62 6c 65 20 28 43 29 20 2a 2f 0a 20  n table (C) */. 
2b90: 20 69 6e 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20   int mxSample;  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2bc0: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 63 6f  er of samples co
2bd0: 6c 6c 65 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  llected */.  int
2be0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c00: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
2c10: 73 20 69 6e 20 69 6e 64 65 78 20 62 65 69 6e 67  s in index being
2c20: 20 73 61 6d 70 6c 65 64 20 2a 2f 0a 20 20 69 6e   sampled */.  in
2c30: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c50: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
2c60: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
2c70: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2ca0: 61 74 65 20 74 68 72 6f 75 67 68 20 70 2d 3e 61  ate through p->a
2cb0: 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 2f  Sample[] */..  /
2cc0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 74 68 72  * Decode the thr
2cd0: 65 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  ee function argu
2ce0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45  ments */.  UNUSE
2cf0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
2d00: 29 3b 0a 20 20 6e 52 6f 77 20 3d 20 28 74 52 6f  );.  nRow = (tRo
2d10: 77 63 6e 74 29 73 71 6c 69 74 65 33 5f 76 61 6c  wcnt)sqlite3_val
2d20: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
2d30: 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  );.  nCol = sqli
2d40: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
2d50: 67 76 5b 31 5d 29 3b 0a 20 20 6d 78 53 61 6d 70  gv[1]);.  mxSamp
2d60: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  le = sqlite3_val
2d70: 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b  ue_int(argv[2]);
2d80: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3e  .  assert( nCol>
2d90: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  0 );..  /* Alloc
2da0: 61 74 65 20 74 68 65 20 73 70 61 63 65 20 72 65  ate the space re
2db0: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 53  quired for the S
2dc0: 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74  tat4Accum object
2dd0: 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a 65 6f 66   */.  n = sizeof
2de0: 28 2a 70 29 20 2b 20 28 73 69 7a 65 6f 66 28 70  (*p) + (sizeof(p
2df0: 2d 3e 61 5b 30 5d 29 20 2b 20 33 2a 73 69 7a 65  ->a[0]) + 3*size
2e00: 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c  of(tRowcnt)*nCol
2e10: 29 2a 6d 78 53 61 6d 70 6c 65 3b 0a 20 20 70 20  )*mxSample;.  p 
2e20: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
2e30: 65 72 6f 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  ero( n );.  if( 
2e40: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
2e50: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2e60: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
2e70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2e80: 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20  ..  /* Populate 
2e90: 74 68 65 20 6e 65 77 20 53 74 61 74 34 41 63 63  the new Stat4Acc
2ea0: 75 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70  um object */.  p
2eb0: 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ->nRow = nRow;. 
2ec0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b   p->nCol = nCol;
2ed0: 0a 20 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 3d  .  p->mxSample =
2ee0: 20 6d 78 53 61 6d 70 6c 65 3b 0a 20 20 70 2d 3e   mxSample;.  p->
2ef0: 6e 50 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 6e 52  nPSample = p->nR
2f00: 6f 77 2f 28 6d 78 53 61 6d 70 6c 65 2f 33 2b 31  ow/(mxSample/3+1
2f10: 29 20 2b 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  ) + 1;.  sqlite3
2f20: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
2f30: 6f 66 28 70 2d 3e 69 50 72 6e 29 2c 20 26 70 2d  of(p->iPrn), &p-
2f40: 3e 69 50 72 6e 29 3b 0a 20 20 70 2d 3e 61 20 3d  >iPrn);.  p->a =
2f50: 20 28 73 74 72 75 63 74 20 53 74 61 74 34 53 61   (struct Stat4Sa
2f60: 6d 70 6c 65 2a 29 26 70 5b 31 5d 3b 0a 20 20 70  mple*)&p[1];.  p
2f70: 53 70 61 63 65 20 3d 20 28 75 38 2a 29 28 26 70  Space = (u8*)(&p
2f80: 2d 3e 61 5b 6d 78 53 61 6d 70 6c 65 5d 29 3b 0a  ->a[mxSample]);.
2f90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 53    for(i=0; i<mxS
2fa0: 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ample; i++){.   
2fb0: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 20 3d 20   p->a[i].anEq = 
2fc0: 28 74 52 6f 77 63 6e 74 20 2a 29 70 53 70 61 63  (tRowcnt *)pSpac
2fd0: 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 28 73 69  e; pSpace += (si
2fe0: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20  zeof(tRowcnt) * 
2ff0: 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 5b  nCol);.    p->a[
3000: 69 5d 2e 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63  i].anLt = (tRowc
3010: 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70  nt *)pSpace; pSp
3020: 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74  ace += (sizeof(t
3030: 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 29 3b  Rowcnt) * nCol);
3040: 0a 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 44  .    p->a[i].anD
3050: 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29  Lt = (tRowcnt *)
3060: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
3070: 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  = (sizeof(tRowcn
3080: 74 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  t) * nCol);.  }.
3090: 20 20 61 73 73 65 72 74 28 20 28 70 53 70 61 63    assert( (pSpac
30a0: 65 20 2d 20 28 75 38 2a 29 70 29 3d 3d 6e 20 29  e - (u8*)p)==n )
30b0: 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  ;..  /* Return a
30c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30d0: 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74  allocated object
30e0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   to the caller *
30f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
3100: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
3110: 20 70 2c 20 73 69 7a 65 6f 66 28 70 29 2c 20 73   p, sizeof(p), s
3120: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a  qlite3_free);.}.
3130: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e  static const Fun
3140: 63 44 65 66 20 73 74 61 74 34 49 6e 69 74 46 75  cDef stat4InitFu
3150: 6e 63 64 65 66 20 3d 20 7b 0a 20 20 33 2c 20 20  ncdef = {.  3,  
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3170: 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54   nArg */.  SQLIT
3180: 45 5f 55 54 46 38 2c 20 20 20 20 20 20 2f 2a 20  E_UTF8,      /* 
3190: 69 50 72 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c  iPrefEnc */.  0,
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 2f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c  /* flags */.  0,
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
31e0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
31f0: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
3200: 20 20 73 74 61 74 34 49 6e 69 74 2c 20 20 20 20    stat4Init,    
3210: 20 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a      /* xFunc */.
3220: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
3230: 20 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a      /* xStep */.
3240: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
3250: 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65      /* xFinalize
3260: 20 2a 2f 0a 20 20 22 73 74 61 74 34 5f 69 6e 69   */.  "stat4_ini
3270: 74 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65  t",     /* zName
3280: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
3290: 20 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73 68          /* pHash
32a0: 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
32b0: 20 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74          /* pDest
32c0: 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  ructor */.};.../
32d0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
32e0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 34  ion of the stat4
32f0: 5f 70 75 73 68 20 53 51 4c 20 66 75 6e 63 74 69  _push SQL functi
3300: 6f 6e 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  on. The argument
3310: 73 20 64 65 73 63 72 69 62 65 20 61 0a 2a 2a 20  s describe a.** 
3320: 73 69 6e 67 6c 65 20 6b 65 79 20 69 6e 73 74 61  single key insta
3330: 6e 63 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  nce. This routin
3340: 65 20 6d 61 6b 65 73 20 74 68 65 20 64 65 63 69  e makes the deci
3350: 73 69 6f 6e 20 61 62 6f 75 74 20 77 68 65 74 68  sion about wheth
3360: 65 72 20 6f 72 20 0a 2a 2a 20 6e 6f 74 20 74 6f  er or .** not to
3370: 20 72 65 74 61 69 6e 20 74 68 69 73 20 6b 65 79   retain this key
3380: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 5f   for the sqlite_
3390: 73 74 61 74 34 20 74 61 62 6c 65 2e 0a 2a 2a 20  stat4 table..** 
33a0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
33b0: 63 6f 6e 76 65 6e 74 69 6f 6e 20 69 73 3a 0a 2a  convention is:.*
33c0: 2a 0a 2a 2a 20 20 20 20 20 73 74 61 74 34 5f 70  *.**     stat4_p
33d0: 75 73 68 28 50 2c 20 72 6f 77 69 64 2c 20 2e 2e  ush(P, rowid, ..
33e0: 2e 6e 45 71 20 61 72 67 73 2e 2e 2e 2c 20 2e 2e  .nEq args..., ..
33f0: 2e 6e 4c 74 20 61 72 67 73 2e 2e 2e 2c 20 2e 2e  .nLt args..., ..
3400: 2e 6e 44 4c 74 20 61 72 67 73 2e 2e 2e 29 0a 2a  .nDLt args...).*
3410: 2a 0a 2a 2a 20 77 68 65 72 65 20 65 61 63 68 20  *.** where each 
3420: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3430: 22 2e 2e 2e 6e 58 58 20 61 72 67 73 2e 2e 2e 22  "...nXX args..."
3440: 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
3450: 61 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 6e  an array of.** n
3460: 43 6f 6c 20 61 72 67 75 6d 65 6e 74 73 2c 20 77  Col arguments, w
3470: 68 65 72 65 20 6e 43 6f 6c 20 69 73 20 74 68 65  here nCol is the
3480: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
3490: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
34a0: 62 65 69 6e 67 0a 2a 2a 20 73 61 6d 70 6c 65 64  being.** sampled
34b0: 20 28 69 66 20 74 68 65 20 69 6e 64 65 78 20 62   (if the index b
34c0: 65 69 6e 67 20 73 61 6d 70 6c 65 64 20 69 73 20  eing sampled is 
34d0: 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 20  "CREATE INDEX i 
34e0: 4f 4e 20 74 28 61 2c 20 62 29 22 2c 20 61 20 0a  ON t(a, b)", a .
34f0: 2a 2a 20 74 6f 74 61 6c 20 6f 66 20 38 20 61 72  ** total of 8 ar
3500: 67 75 6d 65 6e 74 73 20 61 72 65 20 70 61 73 73  guments are pass
3510: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
3520: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
3530: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  )..**.** The ret
3540: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 6c 77  urn value is alw
3550: 61 79 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  ays NULL..*/.sta
3560: 74 69 63 20 76 6f 69 64 20 73 74 61 74 34 50 75  tic void stat4Pu
3570: 73 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  sh(.  sqlite3_co
3580: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3590: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
35a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
35b0: 67 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63 63  gv.){.  Stat4Acc
35c0: 75 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63  um *p = (Stat4Ac
35d0: 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  cum*)sqlite3_val
35e0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
35f0: 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20  ;.  i64 rowid = 
3600: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
3610: 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  t64(argv[1]);.  
3620: 69 36 34 20 6e 53 75 6d 45 71 20 3d 20 30 3b 20  i64 nSumEq = 0; 
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 2f 2a 20 53 75 6d 20 6f 66 20 61 6c 6c 20 6e 45  /* Sum of all nE
3650: 71 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  q parameters */.
3660: 20 20 73 74 72 75 63 74 20 53 74 61 74 34 53 61    struct Stat4Sa
3670: 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 3b 0a 20  mple *pSample;. 
3680: 20 75 33 32 20 68 3b 0a 20 20 69 6e 74 20 69 4d   u32 h;.  int iM
3690: 69 6e 20 3d 20 70 2d 3e 69 4d 69 6e 3b 0a 20 20  in = p->iMin;.  
36a0: 69 6e 74 20 69 3b 0a 20 20 75 38 20 69 73 50 53  int i;.  u8 isPS
36b0: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 75 38 20  ample = 0;.  u8 
36c0: 64 6f 49 6e 73 65 72 74 20 3d 20 30 3b 0a 0a 20  doInsert = 0;.. 
36d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
36e0: 2a 61 45 71 20 3d 20 26 61 72 67 76 5b 32 5d 3b  *aEq = &argv[2];
36f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3700: 20 2a 2a 61 4c 74 20 3d 20 26 61 72 67 76 5b 32   **aLt = &argv[2
3710: 2b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 73 71 6c  +p->nCol];.  sql
3720: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 44 4c  ite3_value **aDL
3730: 74 20 3d 20 26 61 72 67 76 5b 32 2b 70 2d 3e 6e  t = &argv[2+p->n
3740: 43 6f 6c 2b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20  Col+p->nCol];.. 
3750: 20 69 36 34 20 6e 45 71 20 3d 20 73 71 6c 69 74   i64 nEq = sqlit
3760: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
3770: 45 71 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  Eq[p->nCol-1]);.
3780: 20 20 69 36 34 20 6e 4c 74 20 3d 20 73 71 6c 69    i64 nLt = sqli
3790: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
37a0: 61 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  aLt[p->nCol-1]);
37b0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
37c0: 45 54 45 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ETER(context);. 
37d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
37e0: 52 28 61 72 67 63 29 3b 0a 0a 20 20 61 73 73 65  R(argc);..  asse
37f0: 72 74 28 20 70 2d 3e 6e 43 6f 6c 3e 30 20 29 3b  rt( p->nCol>0 );
3800: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
3810: 3d 28 32 20 2b 20 33 2a 70 2d 3e 6e 43 6f 6c 29  =(2 + 3*p->nCol)
3820: 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   );..  /* Figure
3830: 20 6f 75 74 20 69 66 20 74 68 69 73 20 73 61 6d   out if this sam
3840: 70 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ple will be used
3850: 2e 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  . There are thre
3860: 65 20 72 65 61 73 6f 6e 73 20 61 0a 20 20 2a 2a  e reasons a.  **
3870: 20 73 61 6d 70 6c 65 20 6d 61 79 20 62 65 20 75   sample may be u
3880: 73 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  sed:.  **.  **  
3890: 20 31 2e 20 49 74 20 6d 61 79 20 62 65 20 61 20   1. It may be a 
38a0: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e  periodic sample.
38b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 65   In this case se
38c0: 74 20 69 73 50 53 61 6d 70 6c 65 20 74 6f 20 74  t isPSample to t
38d0: 72 75 65 0a 20 20 2a 2a 20 20 20 20 20 20 61 73  rue.  **      as
38e0: 20 77 65 6c 6c 2e 20 4f 72 2c 0a 20 20 2a 2a 0a   well. Or,.  **.
38f0: 20 20 2a 2a 20 20 20 32 2e 20 4c 65 73 73 20 74    **   2. Less t
3900: 68 61 6e 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 20  han p->mxSample 
3910: 73 61 6d 70 6c 65 73 20 68 61 76 65 20 62 65 65  samples have bee
3920: 6e 20 63 6f 6c 6c 65 63 74 65 64 20 73 6f 20 66  n collected so f
3930: 61 72 2c 20 6f 72 0a 20 20 2a 2a 0a 20 20 2a 2a  ar, or.  **.  **
3940: 20 20 20 33 2e 20 49 74 20 69 73 20 6d 6f 72 65     3. It is more
3950: 20 64 65 73 69 72 61 62 6c 65 20 74 68 61 6e 20   desirable than 
3960: 73 6f 6d 65 20 6f 74 68 65 72 20 6e 6f 6e 2d 70  some other non-p
3970: 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20 74  eriodic sample t
3980: 68 61 74 20 68 61 73 0a 20 20 2a 2a 20 20 20 20  hat has.  **    
3990: 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63    already been c
39a0: 6f 6c 6c 65 63 74 65 64 2e 20 53 61 6d 70 6c 65  ollected. Sample
39b0: 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 62  s are compared b
39c0: 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
39d0: 65 73 0a 20 20 2a 2a 20 20 20 20 20 20 69 6e 20  es.  **      in 
39e0: 74 68 65 20 61 6e 45 71 20 61 72 72 61 79 2c 20  the anEq array, 
39f0: 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 6c 61  starting from la
3a00: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 20 69  st (right-most i
3a10: 6e 64 65 78 20 63 6f 6c 75 6d 6e 29 0a 20 20 2a  ndex column).  *
3a20: 2a 20 20 20 20 20 20 74 6f 20 66 69 72 73 74 20  *      to first 
3a30: 28 6c 65 66 74 2d 6d 6f 73 74 20 69 6e 64 65 78  (left-most index
3a40: 20 63 6f 6c 75 6d 6e 29 2e 20 49 66 20 61 6c 6c   column). If all
3a50: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
3a60: 20 61 6e 45 71 0a 20 20 2a 2a 20 20 20 20 20 20   anEq.  **      
3a70: 61 72 72 61 79 20 61 72 65 20 65 71 75 61 6c 2c  array are equal,
3a80: 20 73 61 6d 70 6c 65 73 20 61 72 65 20 63 6f 6d   samples are com
3a90: 70 61 72 65 64 20 62 79 20 68 61 73 68 20 76 61  pared by hash va
3aa0: 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  lue..  **.  **  
3ab0: 20 20 20 20 46 6f 72 20 62 6f 74 68 20 74 68 65      For both the
3ac0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3ad0: 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 61 6e   anEq[] array an
3ae0: 64 20 74 68 65 20 68 61 73 68 20 76 61 6c 75 65  d the hash value
3af0: 2c 0a 20 20 2a 2a 20 20 20 20 20 20 6c 61 72 67  ,.  **      larg
3b00: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  er values are co
3b10: 6e 73 69 64 65 72 65 64 20 6d 6f 72 65 20 64 65  nsidered more de
3b20: 73 69 72 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  sirable..  */.  
3b30: 68 20 3d 20 70 2d 3e 69 50 72 6e 20 3d 20 70 2d  h = p->iPrn = p-
3b40: 3e 69 50 72 6e 2a 31 31 30 33 35 31 35 32 34 35  >iPrn*1103515245
3b50: 20 2b 20 31 32 33 34 35 3b 0a 20 20 69 66 28 20   + 12345;.  if( 
3b60: 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65  (nLt/p->nPSample
3b70: 29 21 3d 28 28 6e 45 71 2b 6e 4c 74 29 2f 70 2d  )!=((nEq+nLt)/p-
3b80: 3e 6e 50 53 61 6d 70 6c 65 29 20 29 7b 0a 20 20  >nPSample) ){.  
3b90: 20 20 64 6f 49 6e 73 65 72 74 20 3d 20 69 73 50    doInsert = isP
3ba0: 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 7d 65  Sample = 1;.  }e
3bb0: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  lse if( p->nSamp
3bc0: 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29  le<p->mxSample )
3bd0: 7b 0a 20 20 20 20 64 6f 49 6e 73 65 72 74 20 3d  {.    doInsert =
3be0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3bf0: 20 74 52 6f 77 63 6e 74 20 2a 61 4d 69 6e 45 71   tRowcnt *aMinEq
3c00: 20 3d 20 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 61 6e   = p->a[iMin].an
3c10: 45 71 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d  Eq;.    for(i=p-
3c20: 3e 6e 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  >nCol-1; i>=0; i
3c30: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  --){.      i64 n
3c40: 45 71 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  Eq = sqlite3_val
3c50: 75 65 5f 69 6e 74 36 34 28 61 45 71 5b 69 5d 29  ue_int64(aEq[i])
3c60: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3c  ;.      if( nEq<
3c70: 61 4d 69 6e 45 71 5b 69 5d 20 29 20 62 72 65 61  aMinEq[i] ) brea
3c80: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  k;.      if( nEq
3c90: 3e 61 4d 69 6e 45 71 5b 69 5d 20 29 7b 0a 20 20  >aMinEq[i] ){.  
3ca0: 20 20 20 20 20 20 64 6f 49 6e 73 65 72 74 20 3d        doInsert =
3cb0: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
3cc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3cd0: 0a 20 20 20 20 69 66 28 20 69 3c 30 20 26 26 20  .    if( i<0 && 
3ce0: 68 3e 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 69 48 61  h>p->a[iMin].iHa
3cf0: 73 68 20 29 7b 0a 20 20 20 20 20 20 64 6f 49 6e  sh ){.      doIn
3d00: 73 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  sert = 1;.    }.
3d10: 20 20 7d 0a 20 20 69 66 28 20 21 64 6f 49 6e 73    }.  if( !doIns
3d20: 65 72 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ert ) return;.. 
3d30: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
3d40: 6e 65 77 20 53 74 61 74 34 53 61 6d 70 6c 65 20  new Stat4Sample 
3d50: 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
3d60: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 70 2d 3e   p->nSample==p->
3d70: 6d 78 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  mxSample ){.    
3d80: 73 74 72 75 63 74 20 53 74 61 74 34 53 61 6d 70  struct Stat4Samp
3d90: 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61  le *pMin = &p->a
3da0: 5b 69 4d 69 6e 5d 3b 0a 20 20 20 20 74 52 6f 77  [iMin];.    tRow
3db0: 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70 4d 69 6e  cnt *anEq = pMin
3dc0: 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74 52 6f 77  ->anEq;.    tRow
3dd0: 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20 70 4d 69  cnt *anDLt = pMi
3de0: 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20 20 74 52  n->anDLt;.    tR
3df0: 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70 4d  owcnt *anLt = pM
3e00: 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 61 73  in->anLt;.    as
3e10: 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
3e20: 20 2d 20 69 4d 69 6e 20 2d 20 31 20 3e 3d 20 30   - iMin - 1 >= 0
3e30: 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28   );.    memmove(
3e40: 70 4d 69 6e 2c 20 26 70 4d 69 6e 5b 31 5d 2c 20  pMin, &pMin[1], 
3e50: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 2a  sizeof(p->a[0])*
3e60: 28 70 2d 3e 6e 53 61 6d 70 6c 65 2d 69 4d 69 6e  (p->nSample-iMin
3e70: 2d 31 29 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c  -1));.    pSampl
3e80: 65 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61  e = &p->a[p->nSa
3e90: 6d 70 6c 65 2d 31 5d 3b 0a 20 20 20 20 70 53 61  mple-1];.    pSa
3ea0: 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20 61 6e 45  mple->anEq = anE
3eb0: 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e  q;.    pSample->
3ec0: 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74 3b 0a 20  anDLt = anDLt;. 
3ed0: 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74     pSample->anLt
3ee0: 20 3d 20 61 6e 4c 74 3b 0a 20 20 7d 65 6c 73 65   = anLt;.  }else
3ef0: 7b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20  {.    pSample = 
3f00: 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65  &p->a[p->nSample
3f10: 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 70 53 61 6d 70  ++];.  }.  pSamp
3f20: 6c 65 2d 3e 69 52 6f 77 69 64 20 3d 20 72 6f 77  le->iRowid = row
3f30: 69 64 3b 0a 20 20 70 53 61 6d 70 6c 65 2d 3e 69  id;.  pSample->i
3f40: 48 61 73 68 20 3d 20 68 3b 0a 20 20 70 53 61 6d  Hash = h;.  pSam
3f50: 70 6c 65 2d 3e 69 73 50 53 61 6d 70 6c 65 20 3d  ple->isPSample =
3f60: 20 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 66 6f   isPSample;.  fo
3f70: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
3f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 61 6d  ; i++){.    pSam
3f90: 70 6c 65 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20 73  ple->anEq[i] = s
3fa0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3fb0: 36 34 28 61 45 71 5b 69 5d 29 3b 0a 20 20 20 20  64(aEq[i]);.    
3fc0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74 5b 69 5d  pSample->anLt[i]
3fd0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
3fe0: 5f 69 6e 74 36 34 28 61 4c 74 5b 69 5d 29 3b 0a  _int64(aLt[i]);.
3ff0: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 44      pSample->anD
4000: 4c 74 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  Lt[i] = sqlite3_
4010: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 44 4c 74  value_int64(aDLt
4020: 5b 69 5d 29 2d 31 3b 0a 20 20 20 20 61 73 73 65  [i])-1;.    asse
4030: 72 74 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rt( sqlite3_valu
4040: 65 5f 69 6e 74 36 34 28 61 44 4c 74 5b 69 5d 29  e_int64(aDLt[i])
4050: 3e 30 20 29 3b 0a 20 20 7d 20 0a 0a 20 20 2f 2a  >0 );.  } ..  /*
4060: 20 46 69 6e 64 20 74 68 65 20 6e 65 77 20 6d 69   Find the new mi
4070: 6e 69 6d 75 6d 20 2a 2f 0a 20 20 69 66 28 20 70  nimum */.  if( p
4080: 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 70 2d 3e 6d 78  ->nSample==p->mx
4090: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69 4d  Sample ){.    iM
40a0: 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  in = -1;.    for
40b0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d  (i=0; i<p->mxSam
40c0: 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
40d0: 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50   if( p->a[i].isP
40e0: 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75  Sample ) continu
40f0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d 69  e;.      if( iMi
4100: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n<0 ){.        i
4110: 4d 69 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d  Min = i;.      }
4120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
4130: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
4140: 28 6a 3d 70 2d 3e 6e 43 6f 6c 2d 31 3b 20 6a 3e  (j=p->nCol-1; j>
4150: 3d 30 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; j++){.      
4160: 20 20 20 20 69 36 34 20 69 43 6d 70 20 3d 20 28      i64 iCmp = (
4170: 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 61 6e 45 71 5b  p->a[iMin].anEq[
4180: 6a 5d 20 2d 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45  j] - p->a[i].anE
4190: 71 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  q[j]);.         
41a0: 20 69 66 28 20 69 43 6d 70 3c 30 20 29 7b 20 69   if( iCmp<0 ){ i
41b0: 4d 69 6e 20 3d 20 69 3b 20 7d 0a 20 20 20 20 20  Min = i; }.     
41c0: 20 20 20 20 20 69 66 28 20 69 43 6d 70 20 29 20       if( iCmp ) 
41d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
41e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
41f0: 30 20 26 26 20 70 2d 3e 61 5b 69 4d 69 6e 5d 2e  0 && p->a[iMin].
4200: 69 48 61 73 68 3c 70 2d 3e 61 5b 69 5d 2e 69 48  iHash<p->a[i].iH
4210: 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ash ){.         
4220: 20 69 4d 69 6e 20 3d 20 69 3b 0a 20 20 20 20 20   iMin = i;.     
4230: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4240: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
4250: 4d 69 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d  Min>=0 );.    p-
4260: 3e 69 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20  >iMin = iMin;.  
4270: 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
4280: 20 46 75 6e 63 44 65 66 20 73 74 61 74 34 50 75   FuncDef stat4Pu
4290: 73 68 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20  shFuncdef = {.  
42a0: 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  -1,             
42b0: 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53    /* nArg */.  S
42c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20  QLITE_UTF8,     
42d0: 20 2f 2a 20 69 50 72 65 66 45 6e 63 20 2a 2f 0a   /* iPrefEnc */.
42e0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
42f0: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 2a 2f 0a      /* flags */.
4300: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4310: 20 20 20 20 2f 2a 20 70 55 73 65 72 44 61 74 61      /* pUserData
4320: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
4330: 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
4340: 20 2a 2f 0a 20 20 73 74 61 74 34 50 75 73 68 2c   */.  stat4Push,
4350: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6e 63          /* xFunc
4360: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
4370: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 74 65 70          /* xStep
4380: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
4390: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61          /* xFina
43a0: 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74 34  lize */.  "stat4
43b0: 5f 70 75 73 68 22 2c 20 20 20 20 20 2f 2a 20 7a  _push",     /* z
43c0: 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Name */.  0,    
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
43e0: 48 61 73 68 20 2a 2f 0a 20 20 30 20 20 20 20 20  Hash */.  0     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
4400: 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b  Destructor */.};
4410: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
4420: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  tation of the st
4430: 61 74 33 5f 67 65 74 28 50 2c 4e 2c 2e 2e 2e 29  at3_get(P,N,...)
4440: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
4450: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  This routine is.
4460: 2a 2a 20 75 73 65 64 20 74 6f 20 71 75 65 72 79  ** used to query
4470: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 43   the results.  C
4480: 6f 6e 74 65 6e 74 20 69 73 20 72 65 74 75 72 6e  ontent is return
4490: 65 64 20 66 6f 72 20 74 68 65 20 4e 74 68 20 73  ed for the Nth s
44a0: 71 6c 69 74 65 5f 73 74 61 74 33 0a 2a 2a 20 72  qlite_stat3.** r
44b0: 6f 77 20 77 68 65 72 65 20 4e 20 69 73 20 62 65  ow where N is be
44c0: 74 77 65 65 6e 20 30 20 61 6e 64 20 53 2d 31 20  tween 0 and S-1 
44d0: 61 6e 64 20 53 20 69 73 20 74 68 65 20 6e 75 6d  and S is the num
44e0: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2e 20  ber of samples. 
44f0: 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 72 65   The.** value re
4500: 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
4510: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4520: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  arguments..**.**
4530: 20 20 20 61 72 67 63 3d 3d 32 20 20 20 20 72 65     argc==2    re
4540: 73 75 6c 74 3a 20 20 72 6f 77 69 64 0a 2a 2a 20  sult:  rowid.** 
4550: 20 20 61 72 67 63 3d 3d 33 20 20 20 20 72 65 73    argc==3    res
4560: 75 6c 74 3a 20 20 6e 45 71 0a 2a 2a 20 20 20 61  ult:  nEq.**   a
4570: 72 67 63 3d 3d 34 20 20 20 20 72 65 73 75 6c 74  rgc==4    result
4580: 3a 20 20 6e 4c 74 0a 2a 2a 20 20 20 61 72 67 63  :  nLt.**   argc
4590: 3d 3d 35 20 20 20 20 72 65 73 75 6c 74 3a 20 20  ==5    result:  
45a0: 6e 44 4c 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nDLt.*/.static v
45b0: 6f 69 64 20 73 74 61 74 34 47 65 74 28 0a 20 20  oid stat4Get(.  
45c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
45d0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
45e0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
45f0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
4600: 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70 20    Stat4Accum *p 
4610: 3d 20 28 53 74 61 74 34 41 63 63 75 6d 2a 29 73  = (Stat4Accum*)s
4620: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
4630: 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  b(argv[0]);.  in
4640: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t n = sqlite3_va
4650: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
4660: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
4670: 30 20 29 3b 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  0 );.  if( n<p->
4680: 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 74  nSample ){.    t
4690: 52 6f 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20 30  Rowcnt *aCnt = 0
46a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74  ;.    char *zRet
46b0: 3b 0a 20 0a 20 20 20 20 73 77 69 74 63 68 28 20  ;. .    switch( 
46c0: 61 72 67 63 20 29 7b 0a 20 20 20 20 20 20 63 61  argc ){.      ca
46d0: 73 65 20 32 3a 20 20 0a 20 20 20 20 20 20 20 20  se 2:  .        
46e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
46f0: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2d  nt64(context, p-
4700: 3e 61 5b 6e 5d 2e 69 52 6f 77 69 64 29 3b 0a 20  >a[n].iRowid);. 
4710: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
4720: 20 20 20 20 20 63 61 73 65 20 33 3a 20 20 61 43       case 3:  aC
4730: 6e 74 20 3d 20 70 2d 3e 61 5b 6e 5d 2e 61 6e 45  nt = p->a[n].anE
4740: 71 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  q; break;.      
4750: 63 61 73 65 20 34 3a 20 20 61 43 6e 74 20 3d 20  case 4:  aCnt = 
4760: 70 2d 3e 61 5b 6e 5d 2e 61 6e 4c 74 3b 20 62 72  p->a[n].anLt; br
4770: 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
4780: 6c 74 3a 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b  lt: aCnt = p->a[
4790: 6e 5d 2e 61 6e 44 4c 74 3b 20 62 72 65 61 6b 3b  n].anDLt; break;
47a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 52 65 74  .    }..    zRet
47b0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
47c0: 5a 65 72 6f 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32  Zero(p->nCol * 2
47d0: 35 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74  5);.    if( zRet
47e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
47f0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4800: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
4810: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4820: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
4830: 63 68 61 72 20 2a 7a 20 3d 20 7a 52 65 74 3b 0a  char *z = zRet;.
4840: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
4850: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
4860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4870: 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20  snprintf(24, z, 
4880: 22 25 6c 6c 64 20 22 2c 20 61 43 6e 74 5b 69 5d  "%lld ", aCnt[i]
4890: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  );.        z += 
48a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
48b0: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
48c0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d    assert( z[0]==
48d0: 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74 20 29  '\0' && z>zRet )
48e0: 3b 0a 20 20 20 20 20 20 7a 5b 2d 31 5d 20 3d 20  ;.      z[-1] = 
48f0: 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71 6c 69  '\0';.      sqli
4900: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4910: 63 6f 6e 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d  context, zRet, -
4920: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
4930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
4940: 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44  atic const FuncD
4950: 65 66 20 73 74 61 74 34 47 65 74 46 75 6e 63 64  ef stat4GetFuncd
4960: 65 66 20 3d 20 7b 0a 20 20 2d 31 2c 20 20 20 20  ef = {.  -1,    
4970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 41             /* nA
4980: 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55  rg */.  SQLITE_U
4990: 54 46 38 2c 20 20 20 20 20 20 2f 2a 20 69 50 72  TF8,      /* iPr
49a0: 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  efEnc */.  0,   
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49c0: 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20  flags */.  0,   
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49e0: 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30  pUserData */.  0
49f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4a00: 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73   /* pNext */.  s
4a10: 74 61 74 34 47 65 74 2c 20 20 20 20 20 20 20 20  tat4Get,        
4a20: 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20 30   /* xFunc */.  0
4a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4a40: 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20 30   /* xStep */.  0
4a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4a60: 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f   /* xFinalize */
4a70: 0a 20 20 22 73 74 61 74 34 5f 67 65 74 22 2c 20  .  "stat4_get", 
4a80: 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
4a90: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4aa0: 20 20 20 20 2f 2a 20 70 48 61 73 68 20 2a 2f 0a      /* pHash */.
4ab0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
4ac0: 20 20 20 20 2f 2a 20 70 44 65 73 74 72 75 63 74      /* pDestruct
4ad0: 6f 72 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20  or */.};.#endif 
4ae0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
4af0: 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 0a 0a 2f 2a  _STAT4 */...../*
4b00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
4b10: 65 20 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79  e to do an analy
4b20: 73 69 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63  sis of all indic
4b30: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4b40: 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74  th.** a single t
4b50: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
4b60: 76 6f 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54  void analyzeOneT
4b70: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
4b80: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
4b90: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4ba0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
4bb0: 20 2f 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20   /* Table whose 
4bc0: 69 6e 64 69 63 65 73 20 61 72 65 20 74 6f 20 62  indices are to b
4bd0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
4be0: 49 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 2c  Index *pOnlyIdx,
4bf0: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
4c00: 20 6f 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74 68   only analyze th
4c10: 69 73 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f 0a  is one index */.
4c20: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20    int iStatCur, 
4c30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56     /* Index of V
4c40: 64 62 65 43 75 72 73 6f 72 20 74 68 61 74 20 77  dbeCursor that w
4c50: 72 69 74 65 73 20 74 68 65 20 73 71 6c 69 74 65  rites the sqlite
4c60: 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a  _stat1 table */.
4c70: 20 20 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20 20    int iMem,     
4c80: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
4c90: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
4ca0: 20 62 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 20   begin here */. 
4cb0: 20 69 6e 74 20 69 54 61 62 20 20 20 20 20 20 20   int iTab       
4cc0: 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
4cd0: 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  ble cursor */.){
4ce0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4cf0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
4d00: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
4d10: 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  le */.  Index *p
4d20: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
4d30: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
4d40: 20 74 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a   to being analyz
4d50: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ed */.  int iIdx
4d60: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
4d70: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
4d80: 70 65 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65 69  pen on index bei
4d90: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
4da0: 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20   int iTabCur;   
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4dc0: 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f   Table cursor */
4dd0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
4e00: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69  achine being bui
4e10: 6c 74 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69  lt up */.  int i
4e20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4e30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
4e40: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
4e50: 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b   jZeroRows = -1;
4e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4e70: 70 20 66 72 6f 6d 20 68 65 72 65 20 69 66 20 6e  p from here if n
4e80: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 73  umber of rows is
4e90: 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   zero */.  int i
4ea0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
4eb0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
4ec0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
4ed0: 74 61 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a  taining pTab */.
4ee0: 20 20 75 38 20 6e 65 65 64 54 61 62 6c 65 43 6e    u8 needTableCn
4ef0: 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f  t = 1;         /
4f00: 2a 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20  * True to count 
4f10: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
4f20: 6e 74 20 72 65 67 54 61 62 6e 61 6d 65 20 3d 20  nt regTabname = 
4f30: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52  iMem++;     /* R
4f40: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
4f50: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ng table name */
4f60: 0a 20 20 69 6e 74 20 72 65 67 49 64 78 6e 61 6d  .  int regIdxnam
4f70: 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  e = iMem++;     
4f80: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
4f90: 61 69 6e 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d  aining index nam
4fa0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74  e */.  int regSt
4fb0: 61 74 31 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  at1 = iMem++;   
4fc0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 20      /* The stat 
4fd0: 63 6f 6c 75 6d 6e 20 6f 66 20 73 71 6c 69 74 65  column of sqlite
4fe0: 5f 73 74 61 74 31 20 2a 2f 0a 23 69 66 64 65 66  _stat1 */.#ifdef
4ff0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5000: 54 41 54 34 0a 20 20 69 6e 74 20 72 65 67 4e 75  TAT4.  int regNu
5010: 6d 45 71 20 3d 20 72 65 67 53 74 61 74 31 3b 20  mEq = regStat1; 
5020: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5030: 20 69 6e 73 74 61 6e 63 65 73 2e 20 20 53 61 6d   instances.  Sam
5040: 65 20 61 73 20 72 65 67 53 74 61 74 31 20 2a 2f  e as regStat1 */
5050: 0a 20 20 69 6e 74 20 72 65 67 4e 75 6d 4c 74 20  .  int regNumLt 
5060: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
5070: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79  /* Number of key
5080: 73 20 6c 65 73 73 20 74 68 61 6e 20 72 65 67 53  s less than regS
5090: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  ample */.  int r
50a0: 65 67 4e 75 6d 44 4c 74 20 3d 20 69 4d 65 6d 2b  egNumDLt = iMem+
50b0: 2b 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  +;      /* Numbe
50c0: 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 6b 65  r of distinct ke
50d0: 79 73 20 6c 65 73 73 20 74 68 61 6e 20 72 65 67  ys less than reg
50e0: 53 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  Sample */.  int 
50f0: 72 65 67 53 61 6d 70 6c 65 20 3d 20 69 4d 65 6d  regSample = iMem
5100: 2b 2b 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ++;      /* The 
5110: 6e 65 78 74 20 73 61 6d 70 6c 65 20 76 61 6c 75  next sample valu
5120: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 6f  e */.  int regLo
5130: 6f 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  op = iMem++;    
5140: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
5150: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f  ter */.  int sho
5160: 72 74 4a 75 6d 70 20 3d 20 30 3b 20 20 20 20 20  rtJump = 0;     
5170: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
5180: 74 69 6f 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  tion address */.
5190: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65 67  #endif.  int reg
51a0: 43 6f 6c 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  Col = iMem++;   
51b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
51c0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
51d0: 61 6e 61 6c 79 7a 65 64 20 74 61 62 6c 65 20 2a  analyzed table *
51e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 20 3d  /.  int regRec =
51f0: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20   iMem++;        
5200: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
5210: 64 69 6e 67 20 63 6f 6d 70 6c 65 74 65 64 20 72  ding completed r
5220: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72  ecord */.  int r
5230: 65 67 54 65 6d 70 20 3d 20 69 4d 65 6d 2b 2b 3b  egTemp = iMem++;
5240: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
5250: 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65  rary use registe
5260: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65  r */.  int regNe
5270: 77 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b  wRowid = iMem++;
5280: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
5290: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 72 65   the inserted re
52a0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  cord */.  int re
52b0: 67 45 6f 66 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  gEof = iMem++;  
52c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 6f         /* True o
52d0: 6e 63 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  nce cursors are 
52e0: 61 6c 6c 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20  all at EOF */.  
52f0: 69 6e 74 20 72 65 67 43 6e 74 20 3d 20 69 4d 65  int regCnt = iMe
5300: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  m++;         /* 
5310: 52 6f 77 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  Row counter */..
5320: 20 20 69 6e 74 20 72 65 67 53 74 61 74 34 20 3d    int regStat4 =
5330: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f   iMem++;       /
5340: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f  * Register to ho
5350: 6c 64 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62  ld Stat4Accum ob
5360: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ject */.  int re
5370: 67 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b  gRowid = iMem++;
5380: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
5390: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
53a0: 74 6f 20 73 74 61 74 34 5f 70 75 73 68 28 29 20  to stat4_push() 
53b0: 2a 2f 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  */..  pParse->nM
53c0: 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d  em = MAX(pParse-
53d0: 3e 6e 4d 65 6d 2c 20 72 65 67 52 6f 77 69 64 29  >nMem, regRowid)
53e0: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
53f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
5400: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 4e 45    if( v==0 || NE
5410: 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 7b 0a  VER(pTab==0) ){.
5420: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5430: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
5440: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ==0 ){.    /* Do
5450: 20 6e 6f 74 20 67 61 74 68 65 72 20 73 74 61 74   not gather stat
5460: 69 73 74 69 63 73 20 6f 6e 20 76 69 65 77 73 20  istics on views 
5470: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
5480: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  s */.    return;
5490: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
54a0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 54 61 62  e3_strnicmp(pTab
54b0: 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
54c0: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
54d0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68 65   /* Do not gathe
54e0: 72 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20  r statistics on 
54f0: 73 79 73 74 65 6d 20 74 61 62 6c 65 73 20 2a 2f  system tables */
5500: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5510: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5520: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
5530: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
5540: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
5550: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
5560: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
5570: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
5580: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5590: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
55a0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
55b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
55c0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
55d0: 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
55e0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
55f0: 73 65 2c 20 53 51 4c 49 54 45 5f 41 4e 41 4c 59  se, SQLITE_ANALY
5600: 5a 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  ZE, pTab->zName,
5610: 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
5620: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
5630: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
5640: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
5650: 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 2d  stablish a read-
5660: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
5670: 65 20 61 74 20 74 68 65 20 73 68 61 72 65 64 2d  e at the shared-
5680: 63 61 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20 20  cache level. .  
5690: 2a 2a 20 41 6c 73 6f 20 6f 70 65 6e 20 61 20 72  ** Also open a r
56a0: 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
56b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 2a  on the table.  *
56c0: 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
56d0: 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
56e0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
56f0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
5700: 20 69 54 61 62 43 75 72 20 3d 20 69 54 61 62 2b   iTabCur = iTab+
5710: 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  +;.  pParse->nTa
5720: 62 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e  b = MAX(pParse->
5730: 6e 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20 73  nTab, iTab);.  s
5740: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
5750: 70 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c  pParse, iTabCur,
5760: 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
5770: 70 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c 69  penRead);.  sqli
5780: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
5790: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
57a0: 72 65 67 54 61 62 6e 61 6d 65 2c 20 30 2c 20 70  regTabname, 0, p
57b0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
57c0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
57d0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
57e0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
57f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  ){.    int nCol;
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5820: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 64 65 78 65  f columns indexe
5830: 64 20 62 79 20 70 49 64 78 20 2a 2f 0a 20 20 20  d by pIdx */.   
5840: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5860: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
5870: 75 72 65 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ure for pIdx */.
5880: 20 20 20 20 69 6e 74 20 2a 61 43 68 6e 67 41 64      int *aChngAd
5890: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
58a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6a 75    /* Array of ju
58b0: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  mp instruction a
58c0: 64 64 72 65 73 73 65 73 20 2a 2f 0a 0a 20 20 20  ddresses */..   
58d0: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
58f0: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
5900: 20 6f 66 20 70 72 65 76 69 6f 75 73 20 76 61 6c   of previous val
5910: 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ues */.    int r
5920: 65 67 44 4c 74 65 3b 20 20 20 20 20 20 20 20 20  egDLte;         
5930: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5940: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6e 44  t in array of nD
5950: 6c 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  lt registers */.
5960: 20 20 20 20 69 6e 74 20 72 65 67 4c 74 3b 20 20      int regLt;  
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
5990: 72 61 79 20 6f 66 20 6e 4c 74 20 72 65 67 69 73  ray of nLt regis
59a0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
59b0: 72 65 67 45 71 3b 20 20 20 20 20 20 20 20 20 20  regEq;          
59c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
59d0: 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6e  st in array of n
59e0: 45 71 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  Eq registers */.
59f0: 20 20 20 20 69 6e 74 20 65 6e 64 4f 66 53 63 61      int endOfSca
5a00: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
5a10: 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 6a 75    /* Label to ju
5a20: 6d 70 20 74 6f 20 6f 6e 63 65 20 73 63 61 6e 20  mp to once scan 
5a30: 69 73 20 66 69 6e 69 73 68 65 64 20 2a 2f 0a 0a  is finished */..
5a40: 20 20 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78      if( pOnlyIdx
5a50: 20 26 26 20 70 4f 6e 6c 79 49 64 78 21 3d 70 49   && pOnlyIdx!=pI
5a60: 64 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  dx ) continue;. 
5a70: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
5a80: 72 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20  rtIdxWhere==0 ) 
5a90: 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 30  needTableCnt = 0
5aa0: 3b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  ;.    VdbeNoopCo
5ab0: 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
5ac0: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 25 73 22   analysis of %s"
5ad0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
5ae0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78  .    nCol = pIdx
5af0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 61  ->nColumn;.    a
5b00: 43 68 6e 67 41 64 64 72 20 3d 20 73 71 6c 69 74  ChngAddr = sqlit
5b10: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
5b20: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43  , sizeof(int)*nC
5b30: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 61 43 68  ol);.    if( aCh
5b40: 6e 67 41 64 64 72 3d 3d 30 20 29 20 63 6f 6e 74  ngAddr==0 ) cont
5b50: 69 6e 75 65 3b 0a 20 20 20 20 70 4b 65 79 20 3d  inue;.    pKey =
5b60: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
5b70: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
5b80: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  x);..    /* Popu
5b90: 6c 61 74 65 20 74 68 65 20 72 65 67 69 73 74 65  late the registe
5ba0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
5bb0: 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a   index name. */.
5bc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5bd0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
5be0: 6e 67 38 2c 20 30 2c 20 72 65 67 49 64 78 6e 61  ng8, 0, regIdxna
5bf0: 6d 65 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61  me, 0, pIdx->zNa
5c00: 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 0a  me, 0);..    /*.
5c10: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
5c20: 77 69 6e 67 20 70 73 65 75 64 6f 2d 63 6f 64 65  wing pseudo-code
5c30: 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68   demonstrates th
5c40: 65 20 77 61 79 20 74 68 65 20 56 4d 20 73 63 61  e way the VM sca
5c50: 6e 73 20 61 6e 20 69 6e 64 65 78 20 0a 20 20 20  ns an index .   
5c60: 20 2a 2a 20 74 6f 20 63 61 6c 6c 20 73 74 61 74   ** to call stat
5c70: 34 5f 70 75 73 68 28 29 20 61 6e 64 20 63 6f 6c  4_push() and col
5c80: 6c 65 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  lect the values 
5c90: 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 5f 73  for the sqlite_s
5ca0: 74 61 74 31 20 0a 20 20 20 20 2a 2a 20 65 6e 74  tat1 .    ** ent
5cb0: 72 79 2e 20 54 68 65 20 63 6f 64 65 20 62 65 6c  ry. The code bel
5cc0: 6f 77 20 69 73 20 66 6f 72 20 61 6e 20 69 6e 64  ow is for an ind
5cd0: 65 78 20 77 69 74 68 20 32 20 63 6f 6c 75 6d 6e  ex with 2 column
5ce0: 73 2e 20 54 68 65 20 61 63 74 75 61 6c 0a 20 20  s. The actual.  
5cf0: 20 20 2a 2a 20 56 4d 20 63 6f 64 65 20 67 65 6e    ** VM code gen
5d00: 65 72 61 74 65 64 20 6d 61 79 20 62 65 20 66 6f  erated may be fo
5d10: 72 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20  r any number of 
5d20: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2a 0a  columns..    **.
5d30: 20 20 20 20 2a 2a 20 4f 6e 65 20 63 75 72 73 6f      ** One curso
5d40: 72 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20  r is opened for 
5d50: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  each column in t
5d60: 68 65 20 69 6e 64 65 78 20 28 6e 43 6f 6c 29 2e  he index (nCol).
5d70: 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 0a 20 20   All cursors .  
5d80: 20 20 2a 2a 20 73 63 61 6e 20 63 6f 6e 63 75 72    ** scan concur
5d90: 72 65 6e 74 6c 79 20 74 68 65 20 69 6e 64 65 78  rently the index
5da0: 20 66 72 6f 6d 20 73 74 61 72 74 20 74 6f 20 65   from start to e
5db0: 6e 64 2e 20 41 6c 6c 20 76 61 72 69 61 62 6c 65  nd. All variable
5dc0: 73 20 75 73 65 64 20 69 6e 0a 20 20 20 20 2a 2a  s used in.    **
5dd0: 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65   the pseudo-code
5de0: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
5df0: 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a   to zero..    **
5e00: 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e 64  .    **   Rewind
5e10: 20 63 73 72 28 30 29 0a 20 20 20 20 2a 2a 20 20   csr(0).    **  
5e20: 20 52 65 77 69 6e 64 20 63 73 72 28 31 29 0a 20   Rewind csr(1). 
5e30: 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 6e     ** .    **  n
5e40: 65 78 74 5f 30 3a 0a 20 20 20 20 2a 2a 20 20 20  ext_0:.    **   
5e50: 72 65 67 50 72 65 76 28 30 29 20 3d 20 63 73 72  regPrev(0) = csr
5e60: 28 30 29 5b 30 5d 0a 20 20 20 20 2a 2a 20 20 20  (0)[0].    **   
5e70: 72 65 67 44 4c 74 65 28 30 29 20 2b 3d 20 31 0a  regDLte(0) += 1.
5e80: 20 20 20 20 2a 2a 20 20 20 72 65 67 4c 74 28 30      **   regLt(0
5e90: 29 20 2b 3d 20 72 65 67 45 71 28 30 29 0a 20 20  ) += regEq(0).  
5ea0: 20 20 2a 2a 20 20 20 72 65 67 45 71 28 30 29 20    **   regEq(0) 
5eb0: 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 64 6f 20  = 0.    **   do 
5ec0: 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 65 67  {.    **     reg
5ed0: 45 71 28 30 29 20 2b 3d 20 31 0a 20 20 20 20 2a  Eq(0) += 1.    *
5ee0: 2a 20 20 20 20 20 4e 65 78 74 20 63 73 72 28 30  *     Next csr(0
5ef0: 29 0a 20 20 20 20 2a 2a 20 20 20 7d 77 68 69 6c  ).    **   }whil
5f00: 65 20 28 20 63 73 72 28 30 29 5b 30 5d 20 3d 3d  e ( csr(0)[0] ==
5f10: 20 72 65 67 50 72 65 76 28 30 29 20 29 0a 20 20   regPrev(0) ).  
5f20: 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 6e 65    ** .    **  ne
5f30: 78 74 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20 72  xt_1:.    **   r
5f40: 65 67 50 72 65 76 28 31 29 20 3d 20 63 73 72 28  egPrev(1) = csr(
5f50: 31 29 5b 31 5d 0a 20 20 20 20 2a 2a 20 20 20 72  1)[1].    **   r
5f60: 65 67 44 4c 74 65 28 31 29 20 2b 3d 20 31 0a 20  egDLte(1) += 1. 
5f70: 20 20 20 2a 2a 20 20 20 72 65 67 4c 74 28 31 29     **   regLt(1)
5f80: 20 2b 3d 20 72 65 67 45 71 28 31 29 0a 20 20 20   += regEq(1).   
5f90: 20 2a 2a 20 20 20 72 65 67 45 71 28 31 29 20 3d   **   regEq(1) =
5fa0: 20 30 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52   0.    **   regR
5fb0: 6f 77 69 64 20 3d 20 63 73 72 28 31 29 5b 72 6f  owid = csr(1)[ro
5fc0: 77 69 64 5d 20 20 20 20 20 20 20 20 2f 2f 20 69  wid]        // i
5fd0: 6e 6e 65 72 6d 6f 73 74 20 63 75 72 73 6f 72 20  nnermost cursor 
5fe0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 64 6f  only.    **   do
5ff0: 20 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 65   {.    **     re
6000: 67 45 71 28 31 29 20 2b 3d 20 31 0a 20 20 20 20  gEq(1) += 1.    
6010: 2a 2a 20 20 20 20 20 72 65 67 43 6e 74 20 2b 3d  **     regCnt +=
6020: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
6030: 20 20 20 20 20 2f 2f 20 69 6e 6e 65 72 6d 6f 73       // innermos
6040: 74 20 63 75 72 73 6f 72 20 6f 6e 6c 79 0a 20 20  t cursor only.  
6050: 20 20 2a 2a 20 20 20 20 20 4e 65 78 74 20 63 73    **     Next cs
6060: 72 28 31 29 0a 20 20 20 20 2a 2a 20 20 20 7d 77  r(1).    **   }w
6070: 68 69 6c 65 20 28 20 63 73 72 28 31 29 5b 30 2e  hile ( csr(1)[0.
6080: 2e 31 5d 20 3d 3d 20 72 65 67 50 72 65 76 28 30  .1] == regPrev(0
6090: 2e 2e 31 29 20 29 0a 20 20 20 20 2a 2a 20 0a 20  ..1) ).    ** . 
60a0: 20 20 20 2a 2a 20 20 20 73 74 61 74 34 5f 70 75     **   stat4_pu
60b0: 73 68 28 72 65 67 52 6f 77 69 64 2c 20 72 65 67  sh(regRowid, reg
60c0: 45 71 2c 20 72 65 67 4c 74 2c 20 72 65 67 44 4c  Eq, regLt, regDL
60d0: 74 65 29 3b 0a 20 20 20 20 2a 2a 20 0a 20 20 20  te);.    ** .   
60e0: 20 2a 2a 20 20 20 69 66 28 20 65 6f 66 28 20 63   **   if( eof( c
60f0: 73 72 28 31 29 20 29 20 29 20 67 6f 74 6f 20 65  sr(1) ) ) goto e
6100: 6e 64 4f 66 53 63 61 6e 0a 20 20 20 20 2a 2a 20  ndOfScan.    ** 
6110: 20 20 69 66 28 20 63 73 72 28 31 29 5b 30 5d 20    if( csr(1)[0] 
6120: 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20  != regPrev(0) ) 
6130: 67 6f 74 6f 20 6e 65 78 74 5f 30 0a 20 20 20 20  goto next_0.    
6140: 2a 2a 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 31  **   goto next_1
6150: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
6160: 65 6e 64 4f 66 53 63 61 6e 3a 0a 20 20 20 20 2a  endOfScan:.    *
6170: 2a 20 20 20 2f 2f 20 64 6f 6e 65 21 0a 20 20 20  *   // done!.   
6180: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6c   **.    ** The l
6190: 61 73 74 20 74 77 6f 20 6c 69 6e 65 73 20 61 62  ast two lines ab
61a0: 6f 76 65 20 6d 6f 64 69 66 79 20 74 68 65 20 63  ove modify the c
61b0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
61c0: 65 67 44 4c 74 65 20 61 72 72 61 79 0a 20 20 20  egDLte array.   
61d0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 65 61 63 68   ** so that each
61e0: 20 65 6c 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e   element contain
61f0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6200: 64 69 73 74 69 6e 63 74 20 6b 65 79 20 70 72 65  distinct key pre
6210: 66 69 78 65 73 0a 20 20 20 20 2a 2a 20 6f 66 20  fixes.    ** of 
6220: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
6230: 67 20 6c 65 6e 67 74 68 2e 20 41 73 20 72 65 71  g length. As req
6240: 75 69 72 65 64 20 74 6f 20 63 61 6c 63 75 6c 61  uired to calcula
6250: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  te the contents.
6260: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
6270: 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79  lite_stat1 entry
6280: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6290: 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65 20 6c  Currently, the l
62a0: 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ast memory cell 
62b0: 61 6c 6c 6f 63 61 74 65 64 20 28 74 68 61 74 20  allocated (that 
62c0: 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
62d0: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
62e0: 20 69 64 65 6e 74 69 66 69 65 72 29 20 69 73 20   identifier) is 
62f0: 72 65 67 53 74 61 74 34 2e 20 49 6d 6d 65 64 69  regStat4. Immedi
6300: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
6310: 72 65 67 53 74 61 74 34 0a 20 20 20 20 2a 2a 20  regStat4.    ** 
6320: 77 65 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  we allocate the 
6330: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a  following:.    *
6340: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 65 67  *.    **     reg
6350: 45 71 20 2d 20 20 20 20 6e 43 6f 6c 20 72 65 67  Eq -    nCol reg
6360: 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 20 20  isters.    **   
6370: 20 20 72 65 67 4c 74 20 2d 20 20 20 20 6e 43 6f    regLt -    nCo
6380: 6c 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  l registers.    
6390: 2a 2a 20 20 20 20 20 72 65 67 44 4c 74 65 20 2d  **     regDLte -
63a0: 20 20 6e 43 6f 6c 20 72 65 67 69 73 74 65 72 73    nCol registers
63b0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 65 67 50  .    **     regP
63c0: 72 65 76 20 2d 20 20 6e 43 6f 6c 20 72 65 67 69  rev -  nCol regi
63d0: 73 74 65 72 73 0a 20 20 20 20 2a 2a 0a 20 20 20  sters.    **.   
63e0: 20 2a 2a 20 54 68 65 20 72 65 67 52 6f 77 69 64   ** The regRowid
63f0: 2c 20 72 65 67 45 71 2c 20 72 65 67 4c 74 20 61  , regEq, regLt a
6400: 6e 64 20 72 65 67 44 4c 74 65 20 72 65 67 69 73  nd regDLte regis
6410: 74 65 72 73 20 6d 75 73 74 20 62 65 20 70 6f 73  ters must be pos
6420: 69 74 69 6f 6e 65 64 20 69 6e 20 0a 20 20 20 20  itioned in .    
6430: 2a 2a 20 74 68 61 74 20 6f 72 64 65 72 20 69 6d  ** that order im
6440: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
6450: 69 6e 67 20 72 65 67 53 74 61 74 34 20 73 6f 20  ing regStat4 so 
6460: 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
6470: 20 70 61 73 73 65 64 0a 20 20 20 20 2a 2a 20 74   passed.    ** t
6480: 6f 20 74 68 65 20 73 74 61 74 34 5f 70 75 73 68  o the stat4_push
6490: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  () function..   
64a0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 6f   **.    ** All o
64b0: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
64c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 63  initialized to c
64d0: 6f 6e 74 61 69 6e 20 69 6e 74 65 67 65 72 20 76  ontain integer v
64e0: 61 6c 75 65 20 30 2e 0a 20 20 20 20 2a 2f 0a 20  alue 0..    */. 
64f0: 20 20 20 72 65 67 45 71 20 3d 20 72 65 67 52 6f     regEq = regRo
6500: 77 69 64 2b 31 3b 20 20 20 20 20 20 20 20 20 20  wid+1;          
6510: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
6520: 61 79 20 6f 66 20 6e 45 71 20 76 61 6c 75 65 20  ay of nEq value 
6530: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20  registers */.   
6540: 20 72 65 67 4c 74 20 3d 20 72 65 67 45 71 2b 6e   regLt = regEq+n
6550: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Col;           /
6560: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
6570: 20 6f 66 20 6e 4c 74 20 76 61 6c 75 65 20 72 65   of nLt value re
6580: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 72  gisters */.    r
6590: 65 67 44 4c 74 65 20 3d 20 72 65 67 4c 74 2b 6e  egDLte = regLt+n
65a0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Col;         /* 
65b0: 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f  First in array o
65c0: 66 20 6e 44 4c 74 20 76 61 6c 75 65 20 72 65 67  f nDLt value reg
65d0: 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 72 65  isters */.    re
65e0: 67 50 72 65 76 20 3d 20 72 65 67 44 4c 74 65 2b  gPrev = regDLte+
65f0: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 2f 2a 20 46  nCol;       /* F
6600: 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66  irst in array of
6610: 20 70 72 65 76 2e 20 76 61 6c 75 65 20 72 65 67   prev. value reg
6620: 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 70 50  isters */.    pP
6630: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58  arse->nMem = MAX
6640: 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72  (pParse->nMem, r
6650: 65 67 50 72 65 76 2b 6e 43 6f 6c 29 3b 0a 0a 20  egPrev+nCol);.. 
6660: 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
6670: 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f  d-only cursor fo
6680: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
6690: 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20   the index. */. 
66a0: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
66b0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
66c0: 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70  ndex(db, pIdx->p
66d0: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 69  Schema) );.    i
66e0: 49 64 78 43 75 72 20 3d 20 69 54 61 62 3b 0a 20  IdxCur = iTab;. 
66f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
6700: 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 54  = MAX(pParse->nT
6710: 61 62 2c 20 69 54 61 62 2b 6e 43 6f 6c 29 3b 0a  ab, iTab+nCol);.
6720: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6730: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6740: 20 69 6e 74 20 69 4d 6f 64 65 20 3d 20 28 69 3d   int iMode = (i=
6750: 3d 30 20 3f 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  =0 ? P4_KEYINFO_
6760: 48 41 4e 44 4f 46 46 20 3a 20 50 34 5f 4b 45 59  HANDOFF : P4_KEY
6770: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c  INFO);.      sql
6780: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6790: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
67a0: 49 64 78 43 75 72 2b 69 2c 20 70 49 64 78 2d 3e  IdxCur+i, pIdx->
67b0: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
67c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
67d0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
67e0: 61 72 2a 29 70 4b 65 79 2c 20 69 4d 6f 64 65 29  ar*)pKey, iMode)
67f0: 3b 20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  ; .      VdbeCom
6800: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6810: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
6820: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
6830: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
6840: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68      /* Invoke th
6850: 65 20 73 74 61 74 34 5f 69 6e 69 74 28 29 20 66  e stat4_init() f
6860: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 61 72 67  unction. The arg
6870: 75 6d 65 6e 74 73 20 61 72 65 3a 0a 20 20 20 20  uments are:.    
6880: 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 2a  ** .    **     *
6890: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
68a0: 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
68b0: 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 2a 20 74  ,.    **     * t
68c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
68d0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
68e0: 78 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 2a 20  x,.    **     * 
68f0: 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  the recommended 
6900: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
6910: 73 20 66 6f 72 20 74 68 65 20 73 74 61 74 34 20  s for the stat4 
6920: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
6930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6940: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c  Op2(v, OP_Count,
6950: 20 69 49 64 78 43 75 72 2c 20 72 65 67 53 74 61   iIdxCur, regSta
6960: 74 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  t4+1);.    sqlit
6970: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6980: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6c  OP_Integer, nCol
6990: 2c 20 72 65 67 53 74 61 74 34 2b 32 29 3b 0a 20  , regStat4+2);. 
69a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
69b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
69c0: 65 72 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 34  er, SQLITE_STAT4
69d0: 5f 53 41 4d 50 4c 45 53 2c 20 72 65 67 53 74 61  _SAMPLES, regSta
69e0: 74 34 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  t4+3);.    sqlit
69f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6a00: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  OP_Function, 0, 
6a10: 72 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67 53  regStat4+1, regS
6a20: 74 61 74 34 29 3b 0a 20 20 20 20 73 71 6c 69 74  tat4);.    sqlit
6a30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
6a40: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 26 73 74  , -1, (char*)&st
6a50: 61 74 34 49 6e 69 74 46 75 6e 63 64 65 66 2c 20  at4InitFuncdef, 
6a60: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
6a70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6a80: 67 65 50 35 28 76 2c 20 33 29 3b 0a 23 65 6e 64  geP5(v, 3);.#end
6a90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
6aa0: 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20  BLE_STAT4 */..  
6ab0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
6ac0: 61 6c 6c 20 74 68 65 20 6d 65 6d 6f 72 79 20 72  all the memory r
6ad0: 65 67 69 73 74 65 72 73 20 61 6c 6c 6f 63 61 74  egisters allocat
6ae0: 65 64 20 61 62 6f 76 65 20 74 6f 20 30 2e 20 2a  ed above to 0. *
6af0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 72 65 67 45  /.    for(i=regE
6b00: 71 3b 20 69 3c 72 65 67 44 4c 74 65 2b 6e 43 6f  q; i<regDLte+nCo
6b10: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
6b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6b30: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6b40: 30 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, i);.    }.   
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 49 6e 74 65 67 65 72  p2(v, OP_Integer
6b70: 2c 20 30 2c 20 72 65 67 43 6e 74 29 3b 0a 20 20  , 0, regCnt);.  
6b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6b90: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6ba0: 72 2c 20 30 2c 20 72 65 67 45 6f 66 29 3b 0a 0a  r, 0, regEof);..
6bb0: 20 20 20 20 2f 2a 20 52 65 77 69 6e 64 20 61 6c      /* Rewind al
6bc0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  l cursors open o
6bd0: 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20  n the index. If 
6be0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6e 74  the table is ent
6bf0: 72 79 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ry, this.    ** 
6c00: 77 69 6c 6c 20 63 61 75 73 65 20 63 6f 6e 74 72  will cause contr
6c10: 6f 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 61 64  ol to jump to ad
6c20: 64 72 65 73 73 20 65 6e 64 4f 66 53 63 61 6e 20  dress endOfScan 
6c30: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 2a 2f  immediately.  */
6c40: 0a 20 20 20 20 65 6e 64 4f 66 53 63 61 6e 20 3d  .    endOfScan =
6c50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
6c60: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 66 6f  Label(v);.    fo
6c70: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
6c80: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6c90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6ca0: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43  OP_Rewind, iIdxC
6cb0: 75 72 2b 69 2c 20 65 6e 64 4f 66 53 63 61 6e 29  ur+i, endOfScan)
6cc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
6cd0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
6ce0: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
6cf0: 70 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29 73  pColl = (char*)s
6d00: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
6d10: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78  Seq(pParse, pIdx
6d20: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  ->azColl[i]);.  
6d30: 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d 20 69      int iCsr = i
6d40: 49 64 78 43 75 72 2b 69 3b 0a 20 20 20 20 20 20  IdxCur+i;.      
6d50: 69 6e 74 20 69 44 6f 3b 0a 20 20 20 20 20 20 69  int iDo;.      i
6d60: 6e 74 20 69 4e 65 3b 20 20 20 20 20 20 20 20 20  nt iNe;         
6d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
6d80: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
6d90: 64 6f 7b 2e 2e 2e 7d 77 68 69 6c 65 20 6c 6f 6f  do{...}while loo
6da0: 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  p */.      int j
6db0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 49 6e 6e  ;.      int bInn
6dc0: 65 72 20 3d 20 28 69 3d 3d 28 6e 43 6f 6c 2d 31  er = (i==(nCol-1
6dd0: 29 29 3b 20 2f 2a 20 54 72 75 65 20 66 6f 72 20  )); /* True for 
6de0: 69 6e 6e 65 72 6d 6f 73 74 20 63 75 72 73 6f 72  innermost cursor
6df0: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6d   */..      /* Im
6e00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
6e10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73  the following ps
6e20: 65 75 64 6f 2d 63 6f 64 65 3a 0a 20 20 20 20 20  eudo-code:.     
6e30: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72   **.      **   r
6e40: 65 67 50 72 65 76 28 69 29 20 3d 20 63 73 72 28  egPrev(i) = csr(
6e50: 69 29 5b 69 5d 0a 20 20 20 20 20 20 2a 2a 20 20  i)[i].      **  
6e60: 20 72 65 67 44 4c 74 65 28 69 29 20 2b 3d 20 31   regDLte(i) += 1
6e70: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 4c  .      **   regL
6e80: 74 28 69 29 20 2b 3d 20 72 65 67 45 71 28 69 29  t(i) += regEq(i)
6e90: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 45  .      **   regE
6ea0: 71 28 69 29 20 3d 20 30 0a 20 20 20 20 20 20 2a  q(i) = 0.      *
6eb0: 2a 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 63  *   regRowid = c
6ec0: 73 72 28 69 29 5b 72 6f 77 69 64 5d 20 20 20 20  sr(i)[rowid]    
6ed0: 20 20 20 20 2f 2f 20 69 6e 6e 65 72 6d 6f 73 74      // innermost
6ee0: 20 63 75 72 73 6f 72 20 6f 6e 6c 79 0a 20 20 20   cursor only.   
6ef0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 68 6e     */.      aChn
6f00: 67 41 64 64 72 5b 69 5d 20 3d 20 73 71 6c 69 74  gAddr[i] = sqlit
6f10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6f20: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c  OP_Column, iCsr,
6f30: 20 69 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a   i, regPrev+i);.
6f40: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
6f50: 74 28 28 76 2c 20 22 72 65 67 50 72 65 76 28 25  t((v, "regPrev(%
6f60: 64 29 20 3d 20 63 73 72 28 25 64 29 28 25 64 29  d) = csr(%d)(%d)
6f70: 22 2c 20 69 2c 20 69 2c 20 69 29 29 3b 0a 20 20  ", i, i, i));.  
6f80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6f90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
6fa0: 6d 6d 2c 20 72 65 67 44 4c 74 65 2b 69 2c 20 31  mm, regDLte+i, 1
6fb0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6fc0: 6d 65 6e 74 28 28 76 2c 20 22 72 65 67 44 4c 74  ment((v, "regDLt
6fd0: 65 28 25 64 29 20 2b 3d 20 31 22 2c 20 69 29 29  e(%d) += 1", i))
6fe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6ff0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7000: 41 64 64 2c 20 72 65 67 45 71 2b 69 2c 20 72 65  Add, regEq+i, re
7010: 67 4c 74 2b 69 2c 20 72 65 67 4c 74 2b 69 29 3b  gLt+i, regLt+i);
7020: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
7030: 6e 74 28 28 76 2c 20 22 72 65 67 4c 74 28 25 64  nt((v, "regLt(%d
7040: 29 20 2b 3d 20 72 65 67 45 71 28 25 64 29 22 2c  ) += regEq(%d)",
7050: 20 69 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 73   i, i));.      s
7060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7070: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7080: 30 2c 20 72 65 67 45 71 2b 69 29 3b 0a 20 20 20  0, regEq+i);.   
7090: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
70a0: 76 2c 20 22 72 65 67 45 71 28 25 64 29 20 3d 20  v, "regEq(%d) = 
70b0: 30 22 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 69  0", i));.      i
70c0: 66 28 20 62 49 6e 6e 65 72 20 29 20 73 71 6c 69  f( bInner ) sqli
70d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
70e0: 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 43   OP_IdxRowid, iC
70f0: 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  sr, regRowid);..
7100: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 69        /* This bi
7110: 74 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t:.      **.    
7120: 20 20 2a 2a 20 20 20 64 6f 20 7b 0a 20 20 20 20    **   do {.    
7130: 20 20 2a 2a 20 20 20 20 20 72 65 67 45 71 28 69    **     regEq(i
7140: 29 20 2b 3d 20 31 0a 20 20 20 20 20 20 2a 2a 20  ) += 1.      ** 
7150: 20 20 20 20 72 65 67 43 6e 74 20 2b 3d 20 31 20      regCnt += 1 
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 2f 2f 20 69 6e 6e 65 72 6d 6f 73 74 20 63    // innermost c
7180: 75 72 73 6f 72 20 6f 6e 6c 79 0a 20 20 20 20 20  ursor only.     
7190: 20 2a 2a 20 20 20 20 20 4e 65 78 74 20 63 73 72   **     Next csr
71a0: 28 69 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  (i).      **    
71b0: 20 69 66 28 20 45 6f 66 20 63 73 72 28 69 29 20   if( Eof csr(i) 
71c0: 29 7b 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ){.      **     
71d0: 20 20 72 65 67 45 6f 66 20 3d 20 31 20 20 20 20    regEof = 1    
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
71f0: 20 69 6e 6e 65 72 6d 6f 73 74 20 63 75 72 73 6f   innermost curso
7200: 72 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  r only.      ** 
7210: 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20        break.    
7220: 20 20 2a 2a 20 20 20 20 20 7d 0a 20 20 20 20 20    **     }.     
7230: 20 2a 2a 20 20 20 7d 77 68 69 6c 65 20 28 20 63   **   }while ( c
7240: 73 72 28 69 29 5b 30 2e 2e 69 5d 20 3d 3d 20 72  sr(i)[0..i] == r
7250: 65 67 50 72 65 76 28 30 2e 2e 69 29 20 29 0a 20  egPrev(0..i) ). 
7260: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 44       */.      iD
7270: 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
7280: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
7290: 6d 6d 2c 20 72 65 67 45 71 2b 69 2c 20 31 29 3b  mm, regEq+i, 1);
72a0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
72b0: 6e 74 28 28 76 2c 20 22 72 65 67 45 71 28 25 64  nt((v, "regEq(%d
72c0: 29 20 2b 3d 20 31 22 2c 20 69 29 29 3b 0a 20 20  ) += 1", i));.  
72d0: 20 20 20 20 69 66 28 20 62 49 6e 6e 65 72 20 29      if( bInner )
72e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
72f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7300: 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 43 6e 74  P_AddImm, regCnt
7310: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
7320: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
7330: 65 67 43 6e 74 20 2b 3d 20 31 22 29 29 3b 0a 20  egCnt += 1"));. 
7340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7360: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 43 73 72 2c  , OP_Next, iCsr,
7370: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7380: 65 6e 74 41 64 64 72 28 76 29 2b 32 2b 62 49 6e  entAddr(v)+2+bIn
7390: 6e 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ner);.      if( 
73a0: 62 49 6e 6e 65 72 20 29 20 73 71 6c 69 74 65 33  bInner ) sqlite3
73b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
73c0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
73d0: 45 6f 66 29 3b 0a 20 20 20 20 20 20 69 4e 65 20  Eof);.      iNe 
73e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
73f0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
7400: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7410: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
7420: 2c 20 69 4e 65 29 3b 0a 20 20 20 20 20 20 66 6f  , iNe);.      fo
7430: 72 28 6a 3d 30 3b 20 6a 3c 3d 69 3b 20 6a 2b 2b  r(j=0; j<=i; j++
7440: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7460: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c  OP_Column, iCsr,
7470: 20 6a 2c 20 72 65 67 43 6f 6c 29 3b 0a 20 20 20   j, regCol);.   
7480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7490: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp4(v, OP_Ne,
74a0: 20 72 65 67 43 6f 6c 2c 20 69 4e 65 2c 20 72 65   regCol, iNe, re
74b0: 67 50 72 65 76 2b 6a 2c 20 70 43 6f 6c 6c 2c 20  gPrev+j, pColl, 
74c0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
74d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
74e0: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
74f0: 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
7500: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
7510: 28 76 2c 20 22 69 66 28 20 72 65 67 50 72 65 76  (v, "if( regPrev
7520: 28 25 64 29 20 21 3d 20 63 73 72 28 25 64 29 28  (%d) != csr(%d)(
7530: 25 64 29 20 29 22 2c 20 6a 2c 20 69 2c 20 6a 29  %d) )", j, i, j)
7540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7560: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
7570: 2c 20 69 44 6f 29 3b 0a 20 20 20 20 20 20 73 71  , iDo);.      sq
7580: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7590: 4c 61 62 65 6c 28 76 2c 20 69 4e 65 29 3b 0a 20  Label(v, iNe);. 
75a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
75b0: 6f 6b 65 20 73 74 61 74 34 5f 70 75 73 68 28 29  oke stat4_push()
75c0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
75d0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
75e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
75f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp3(v, OP_Funct
7600: 69 6f 6e 2c 20 31 2c 20 72 65 67 53 74 61 74 34  ion, 1, regStat4
7610: 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20  , regTemp);.    
7620: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7630: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
7640: 2a 29 26 73 74 61 74 34 50 75 73 68 46 75 6e 63  *)&stat4PushFunc
7650: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
7660: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7670: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 20 2b  eChangeP5(v, 2 +
7680: 20 33 2a 6e 43 6f 6c 29 3b 0a 23 65 6e 64 69 66   3*nCol);.#endif
7690: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
76a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
76b0: 2c 20 72 65 67 45 6f 66 2c 20 65 6e 64 4f 66 53  , regEof, endOfS
76c0: 63 61 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  can);.    for(i=
76d0: 30 3b 20 69 3c 6e 43 6f 6c 2d 31 3b 20 69 2b 2b  0; i<nCol-1; i++
76e0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
76f0: 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29 73 71  Coll = (char*)sq
7700: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
7710: 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  eq(pParse, pIdx-
7720: 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  >azColl[i]);.   
7730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7740: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
7750: 6e 2c 20 69 49 64 78 43 75 72 2b 6e 43 6f 6c 2d  n, iIdxCur+nCol-
7760: 31 2c 20 69 2c 20 72 65 67 43 6f 6c 29 3b 0a 20  1, i, regCol);. 
7770: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7780: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp3(v, OP_Ne,
7790: 20 72 65 67 43 6f 6c 2c 20 61 43 68 6e 67 41 64   regCol, aChngAd
77a0: 64 72 5b 69 5d 2c 20 72 65 67 50 72 65 76 2b 69  dr[i], regPrev+i
77b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
77c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
77d0: 2d 31 2c 20 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  -1, pColl, P4_CO
77e0: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 73 71  LLSEQ);.      sq
77f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7800: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
7810: 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
7820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7830: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
7840: 61 43 68 6e 67 41 64 64 72 5b 6e 43 6f 6c 2d 31  aChngAddr[nCol-1
7850: 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ]);.    sqlite3D
7860: 62 46 72 65 65 28 64 62 2c 20 61 43 68 6e 67 41  bFree(db, aChngA
7870: 64 64 72 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  ddr);..    sqlit
7880: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
7890: 65 6c 28 76 2c 20 65 6e 64 4f 66 53 63 61 6e 29  el(v, endOfScan)
78a0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
78b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
78c0: 20 20 2f 2a 20 41 64 64 20 72 6f 77 73 20 74 6f    /* Add rows to
78d0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
78e0: 34 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72  4 table */.    r
78f0: 65 67 4c 6f 6f 70 20 3d 20 72 65 67 53 74 61 74  egLoop = regStat
7900: 34 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  4+1;.    sqlite3
7910: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7920: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65  _Integer, -1, re
7930: 67 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 68 6f 72  gLoop);.    shor
7940: 74 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  tJump = sqlite3V
7950: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7960: 41 64 64 49 6d 6d 2c 20 72 65 67 4c 6f 6f 70 2c  AddImm, regLoop,
7970: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
7980: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7990: 5f 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 72 65  _Function, 0, re
79a0: 67 53 74 61 74 34 2c 20 72 65 67 54 65 6d 70 29  gStat4, regTemp)
79b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
79c0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
79d0: 20 28 63 68 61 72 2a 29 26 73 74 61 74 34 47 65   (char*)&stat4Ge
79e0: 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e  tFuncdef, P4_FUN
79f0: 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
7a00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7a10: 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 2);.    sqlite
7a20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
7a30: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 54 65 6d  P_IsNull, regTem
7a40: 70 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  p);..    sqlite3
7a50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7a60: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 54 61 62  _NotExists, iTab
7a70: 43 75 72 2c 20 73 68 6f 72 74 4a 75 6d 70 2c 20  Cur, shortJump, 
7a80: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 66 6f  regTemp);.    fo
7a90: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
7aa0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
7ab0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
7ac0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 73  lumn[i];.      s
7ad0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
7ae0: 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
7af0: 2c 20 70 54 61 62 2c 20 69 54 61 62 43 75 72 2c  , pTab, iTabCur,
7b00: 20 69 43 6f 6c 2c 20 72 65 67 50 72 65 76 2b 69   iCol, regPrev+i
7b10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7b30: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7b40: 20 72 65 67 50 72 65 76 2c 20 6e 43 6f 6c 2c 20   regPrev, nCol, 
7b50: 72 65 67 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20  regSample);.    
7b60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7b70: 65 50 34 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d  eP4(v, -1, pIdx-
7b80: 3e 7a 43 6f 6c 41 66 66 2c 20 30 29 3b 0a 0a 20  >zColAff, 0);.. 
7b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ba0: 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp3(v, OP_Funct
7bb0: 69 6f 6e 2c 20 31 2c 20 72 65 67 53 74 61 74 34  ion, 1, regStat4
7bc0: 2c 20 72 65 67 4e 75 6d 45 71 29 3b 0a 20 20 20  , regNumEq);.   
7bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7be0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
7bf0: 72 2a 29 26 73 74 61 74 34 47 65 74 46 75 6e 63  r*)&stat4GetFunc
7c00: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
7c10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7c20: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 33 29 3b  eChangeP5(v, 3);
7c30: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
7c40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75  eAddOp3(v, OP_Fu
7c50: 6e 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 53 74  nction, 1, regSt
7c60: 61 74 34 2c 20 72 65 67 4e 75 6d 4c 74 29 3b 0a  at4, regNumLt);.
7c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7c80: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
7c90: 63 68 61 72 2a 29 26 73 74 61 74 34 47 65 74 46  char*)&stat4GetF
7ca0: 75 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44  uncdef, P4_FUNCD
7cb0: 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
7cc0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7cd0: 34 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  4);..    sqlite3
7ce0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7cf0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 31 2c 20 72 65  _Function, 1, re
7d00: 67 53 74 61 74 34 2c 20 72 65 67 4e 75 6d 44 4c  gStat4, regNumDL
7d10: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
7d20: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
7d30: 31 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 34  1, (char*)&stat4
7d40: 47 65 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46  GetFuncdef, P4_F
7d50: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
7d60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7d70: 28 76 2c 20 35 29 3b 0a 0a 20 20 20 20 73 71 6c  (v, 5);..    sql
7d80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7d90: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7da0: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 36 2c 20   regTabname, 6, 
7db0: 72 65 67 52 65 63 2c 20 22 62 62 62 62 62 62 22  regRec, "bbbbbb"
7dc0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7dd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7de0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
7df0: 74 43 75 72 2b 31 2c 20 72 65 67 4e 65 77 52 6f  tCur+1, regNewRo
7e00: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
7e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7e20: 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43  P_Insert, iStatC
7e30: 75 72 2b 31 2c 20 72 65 67 52 65 63 2c 20 72 65  ur+1, regRec, re
7e40: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
7e50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7e60: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
7e70: 20 73 68 6f 72 74 4a 75 6d 70 29 3b 0a 20 20 20   shortJump);.   
7e80: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7e90: 48 65 72 65 28 76 2c 20 73 68 6f 72 74 4a 75 6d  Here(v, shortJum
7ea0: 70 2b 32 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  p+2);.#endif    
7eb0: 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 53 74 6f      ..    /* Sto
7ec0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
7ed0: 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 0a  n sqlite_stat1..
7ee0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
7ef0: 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 69  e result is a si
7f00: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
7f10: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
7f20: 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 0a 20  le.  The first. 
7f30: 20 20 20 2a 2a 20 74 77 6f 20 63 6f 6c 75 6d 6e     ** two column
7f40: 73 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20  s are the names 
7f50: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
7f60: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 74 68 69   index.  The thi
7f70: 72 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a  rd column.    **
7f80: 20 69 73 20 61 20 73 74 72 69 6e 67 20 63 6f 6d   is a string com
7f90: 70 6f 73 65 64 20 6f 66 20 61 20 6c 69 73 74 20  posed of a list 
7fa0: 6f 66 20 69 6e 74 65 67 65 72 20 73 74 61 74 69  of integer stati
7fb0: 73 74 69 63 73 20 61 62 6f 75 74 20 74 68 65 0a  stics about the.
7fc0: 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 54      ** index.  T
7fd0: 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
7fe0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   in the list is 
7ff0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
8000: 20 6f 66 20 65 6e 74 72 69 65 73 0a 20 20 20 20   of entries.    
8010: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ** in the index.
8020: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 61    There is one a
8030: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65  dditional intege
8040: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 66 6f  r in the list fo
8050: 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 63 6f  r each.    ** co
8060: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
8070: 65 2e 20 20 54 68 69 73 20 61 64 64 69 74 69 6f  e.  This additio
8080: 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 73 20 61  nal integer is a
8090: 20 67 75 65 73 73 20 6f 66 20 68 6f 77 20 6d 61   guess of how ma
80a0: 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 73 20 6f  ny.    ** rows o
80b0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  f the table the 
80c0: 69 6e 64 65 78 20 77 69 6c 6c 20 73 65 6c 65 63  index will selec
80d0: 74 2e 20 20 49 66 20 44 20 69 73 20 74 68 65 20  t.  If D is the 
80e0: 63 6f 75 6e 74 20 6f 66 20 64 69 73 74 69 6e 63  count of distinc
80f0: 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  t.    ** values 
8100: 61 6e 64 20 4b 20 69 73 20 74 68 65 20 74 6f 74  and K is the tot
8110: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  al number of row
8120: 73 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  s, then the inte
8130: 67 65 72 20 69 73 20 63 6f 6d 70 75 74 65 64 0a  ger is computed.
8140: 20 20 20 20 2a 2a 20 61 73 3a 0a 20 20 20 20 2a      ** as:.    *
8150: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
8160: 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20  I = (K+D-1)/D.  
8170: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 4b    **.    ** If K
8180: 3d 3d 30 20 74 68 65 6e 20 6e 6f 20 65 6e 74 72  ==0 then no entr
8190: 79 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 74  y is made into t
81a0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
81b0: 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2a 20  table.  .    ** 
81c0: 49 66 20 4b 3e 30 20 74 68 65 6e 20 69 74 20 69  If K>0 then it i
81d0: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
81e0: 65 20 74 68 65 20 44 3e 30 20 73 6f 20 64 69 76  e the D>0 so div
81f0: 69 73 69 6f 6e 20 62 79 20 7a 65 72 6f 0a 20 20  ision by zero.  
8200: 20 20 2a 2a 20 69 73 20 6e 65 76 65 72 20 70 6f    ** is never po
8210: 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  ssible..    */. 
8220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8230: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
8240: 2c 20 72 65 67 43 6e 74 2c 20 72 65 67 53 74 61  , regCnt, regSta
8250: 74 31 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f  t1);.    jZeroRo
8260: 77 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ws = sqlite3Vdbe
8270: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
8280: 6f 74 2c 20 72 65 67 43 6e 74 29 3b 0a 20 20 20  ot, regCnt);.   
8290: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
82a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
82b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
82c0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
82d0: 2c 20 72 65 67 54 65 6d 70 2c 20 30 2c 20 22 20  , regTemp, 0, " 
82e0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 0);.      sql
82f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8300: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 72 65 67  , OP_Concat, reg
8310: 54 65 6d 70 2c 20 72 65 67 53 74 61 74 31 2c 20  Temp, regStat1, 
8320: 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 20  regStat1);.     
8330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8340: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 72 65  p3(v, OP_Add, re
8350: 67 43 6e 74 2c 20 72 65 67 44 4c 74 65 2b 69 2c  gCnt, regDLte+i,
8360: 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20   regTemp);.     
8370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8380: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
8390: 20 72 65 67 54 65 6d 70 2c 20 2d 31 29 3b 0a 20   regTemp, -1);. 
83a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
83b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 69 76  AddOp3(v, OP_Div
83c0: 69 64 65 2c 20 72 65 67 44 4c 74 65 2b 69 2c 20  ide, regDLte+i, 
83d0: 72 65 67 54 65 6d 70 2c 20 72 65 67 54 65 6d 70  regTemp, regTemp
83e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
83f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
8400: 5f 54 6f 49 6e 74 2c 20 72 65 67 54 65 6d 70 29  _ToInt, regTemp)
8410: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8420: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8430: 43 6f 6e 63 61 74 2c 20 72 65 67 54 65 6d 70 2c  Concat, regTemp,
8440: 20 72 65 67 53 74 61 74 31 2c 20 72 65 67 53 74   regStat1, regSt
8450: 61 74 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  at1);.    }.    
8460: 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
8470: 64 78 57 68 65 72 65 21 3d 30 20 29 20 73 71 6c  dxWhere!=0 ) sql
8480: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
8490: 28 76 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a  (v, jZeroRows);.
84a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
84b0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
84c0: 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e 61  Record, regTabna
84d0: 6d 65 2c 20 33 2c 20 72 65 67 52 65 63 2c 20 22  me, 3, regRec, "
84e0: 61 61 61 22 2c 20 30 29 3b 0a 20 20 20 20 73 71  aaa", 0);.    sq
84f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8500: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
8510: 69 53 74 61 74 43 75 72 2c 20 72 65 67 4e 65 77  iStatCur, regNew
8520: 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Rowid);.    sqli
8530: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8540: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61   OP_Insert, iSta
8550: 74 43 75 72 2c 20 72 65 67 52 65 63 2c 20 72 65  tCur, regRec, re
8560: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
8570: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8580: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
8590: 50 45 4e 44 29 3b 0a 20 20 20 20 69 66 28 20 70  PEND);.    if( p
85a0: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
85b0: 72 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  re==0 ) sqlite3V
85c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
85d0: 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 0a  ZeroRows);.  }..
85e0: 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 73 69    /* Create a si
85f0: 6e 67 6c 65 20 73 71 6c 69 74 65 5f 73 74 61 74  ngle sqlite_stat
8600: 31 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69  1 entry containi
8610: 6e 67 20 4e 55 4c 4c 20 61 73 20 74 68 65 20 69  ng NULL as the i
8620: 6e 64 65 78 0a 20 20 2a 2a 20 6e 61 6d 65 20 61  ndex.  ** name a
8630: 6e 64 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74  nd the row count
8640: 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   as the content.
8650: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 6e 6c  .  */.  if( pOnl
8660: 79 49 64 78 3d 3d 30 20 26 26 20 6e 65 65 64 54  yIdx==0 && needT
8670: 61 62 6c 65 43 6e 74 20 29 7b 0a 20 20 20 20 56  ableCnt ){.    V
8680: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
8690: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
86a0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
86b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
86c0: 43 6f 75 6e 74 2c 20 69 54 61 62 43 75 72 2c 20  Count, iTabCur, 
86d0: 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 6a  regStat1);.    j
86e0: 5a 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69 74  ZeroRows = sqlit
86f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8700: 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 53 74 61  OP_IfNot, regSta
8710: 74 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t1);.    sqlite3
8720: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8730: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 64 78  _Null, 0, regIdx
8740: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
8750: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
8760: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
8770: 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65  egTabname, 3, re
8780: 67 52 65 63 2c 20 22 61 61 61 22 2c 20 30 29 3b  gRec, "aaa", 0);
8790: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
87a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
87b0: 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72 2c  Rowid, iStatCur,
87c0: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
87d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
87e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
87f0: 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  t, iStatCur, reg
8800: 52 65 63 2c 20 72 65 67 4e 65 77 52 6f 77 69 64  Rec, regNewRowid
8810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8820: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8830: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
8840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
8850: 70 48 65 72 65 28 76 2c 20 6a 5a 65 72 6f 52 6f  pHere(v, jZeroRo
8860: 77 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ws);.  }.}.../*.
8870: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8880: 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65   that will cause
8890: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
88a0: 20 69 6e 64 65 78 20 61 6e 61 6c 79 73 69 73 20   index analysis 
88b0: 74 6f 0a 2a 2a 20 62 65 20 6c 6f 61 64 65 64 20  to.** be loaded 
88c0: 69 6e 74 6f 20 69 6e 74 65 72 6e 61 6c 20 68 61  into internal ha
88d0: 73 68 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  sh tables where 
88e0: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  is can be used..
88f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
8900: 6f 61 64 41 6e 61 6c 79 73 69 73 28 50 61 72 73  oadAnalysis(Pars
8910: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
8920: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
8930: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
8940: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
8950: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
8960: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8970: 4c 6f 61 64 41 6e 61 6c 79 73 69 73 2c 20 69 44  LoadAnalysis, iD
8980: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
8990: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
89a0: 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61  hat will do an a
89b0: 6e 61 6c 79 73 69 73 20 6f 66 20 61 6e 20 65 6e  nalysis of an en
89c0: 74 69 72 65 20 64 61 74 61 62 61 73 65 0a 2a 2f  tire database.*/
89d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
89e0: 6c 79 7a 65 44 61 74 61 62 61 73 65 28 50 61 72  lyzeDatabase(Par
89f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8a00: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
8a10: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8a20: 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  ;.  Schema *pSch
8a30: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
8a40: 62 5d 2e 70 53 63 68 65 6d 61 3b 20 20 20 20 2f  b].pSchema;    /
8a50: 2a 20 53 63 68 65 6d 61 20 6f 66 20 64 61 74 61  * Schema of data
8a60: 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 48 61  base iDb */.  Ha
8a70: 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20 20 69 6e 74  shElem *k;.  int
8a80: 20 69 53 74 61 74 43 75 72 3b 0a 20 20 69 6e 74   iStatCur;.  int
8a90: 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 69 54 61   iMem;.  int iTa
8aa0: 62 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67  b;..  sqlite3Beg
8ab0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
8ac0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
8ad0: 3b 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70  ;.  iStatCur = p
8ae0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70  Parse->nTab;.  p
8af0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33  Parse->nTab += 3
8b00: 3b 0a 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c  ;.  openStatTabl
8b10: 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69  e(pParse, iDb, i
8b20: 53 74 61 74 43 75 72 2c 20 30 2c 20 30 29 3b 0a  StatCur, 0, 0);.
8b30: 20 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    iMem = pParse-
8b40: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 54 61 62 20  >nMem+1;.  iTab 
8b50: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
8b60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8b70: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
8b80: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
8b90: 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
8ba0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
8bb0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b  ->tblHash); k; k
8bc0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8bd0: 6b 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  k)){.    Table *
8be0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
8bf0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
8c00: 3b 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f 6e 65  ;.    analyzeOne
8c10: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
8c20: 61 62 2c 20 30 2c 20 69 53 74 61 74 43 75 72 2c  ab, 0, iStatCur,
8c30: 20 69 4d 65 6d 2c 20 69 54 61 62 29 3b 0a 20 20   iMem, iTab);.  
8c40: 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73  }.  loadAnalysis
8c50: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d  (pParse, iDb);.}
8c60: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8c70: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
8c80: 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  do an analysis o
8c90: 66 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  f a single table
8ca0: 20 69 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73   in.** a databas
8cb0: 65 2e 20 20 49 66 20 70 4f 6e 6c 79 49 64 78 20  e.  If pOnlyIdx 
8cc0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
8cd0: 20 69 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20   it is a single 
8ce0: 69 6e 64 65 78 0a 2a 2a 20 69 6e 20 70 54 61 62  index.** in pTab
8cf0: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
8d00: 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61  analyzed..*/.sta
8d10: 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
8d20: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
8d30: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
8d40: 2c 20 49 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64  , Index *pOnlyId
8d50: 78 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  x){.  int iDb;. 
8d60: 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 0a   int iStatCur;..
8d70: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
8d80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8d90: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
8da0: 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73  AllMutexes(pPars
8db0: 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44 62 20  e->db) );.  iDb 
8dc0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
8dd0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
8de0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
8df0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
8e00: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
8e10: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
8e20: 0a 20 20 69 53 74 61 74 43 75 72 20 3d 20 70 50  .  iStatCur = pP
8e30: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50  arse->nTab;.  pP
8e40: 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b  arse->nTab += 3;
8e50: 0a 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 20  .  if( pOnlyIdx 
8e60: 29 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54  ){.    openStatT
8e70: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
8e80: 2c 20 69 53 74 61 74 43 75 72 2c 20 70 4f 6e 6c  , iStatCur, pOnl
8e90: 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 22 69 64  yIdx->zName, "id
8ea0: 78 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  x");.  }else{.  
8eb0: 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28    openStatTable(
8ec0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74  pParse, iDb, iSt
8ed0: 61 74 43 75 72 2c 20 70 54 61 62 2d 3e 7a 4e 61  atCur, pTab->zNa
8ee0: 6d 65 2c 20 22 74 62 6c 22 29 3b 0a 20 20 7d 0a  me, "tbl");.  }.
8ef0: 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c    analyzeOneTabl
8f00: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
8f10: 70 4f 6e 6c 79 49 64 78 2c 20 69 53 74 61 74 43  pOnlyIdx, iStatC
8f20: 75 72 2c 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  ur,pParse->nMem+
8f30: 31 2c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  1,pParse->nTab);
8f40: 0a 20 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28  .  loadAnalysis(
8f50: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a  pParse, iDb);.}.
8f60: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8f70: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 41 4e 41  code for the ANA
8f80: 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 20 20 54  LYZE command.  T
8f90: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
8fa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
8fb0: 77 68 65 6e 20 69 74 20 72 65 63 6f 67 6e 69 7a  when it recogniz
8fc0: 65 73 20 61 6e 20 41 4e 41 4c 59 5a 45 20 63 6f  es an ANALYZE co
8fd0: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
8fe0: 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 20 20 20      ANALYZE     
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
9010: 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3c        ANALYZE  <
9020: 64 61 74 61 62 61 73 65 3e 20 20 20 20 20 20 20  database>       
9030: 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
9040: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
9050: 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
9060: 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
9070: 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
9080: 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
9090: 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
90a0: 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
90b0: 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72  analyzed..** For
90c0: 6d 20 32 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 2 analyzes all
90d0: 20 69 6e 64 69 63 65 73 20 74 68 65 20 73 69 6e   indices the sin
90e0: 67 6c 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  gle database nam
90f0: 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 33 20 61 6e  ed..** Form 3 an
9100: 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63  alyzes all indic
9110: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
9120: 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
9130: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
9140: 74 65 33 41 6e 61 6c 79 7a 65 28 50 61 72 73 65  te3Analyze(Parse
9150: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
9160: 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
9170: 70 4e 61 6d 65 32 29 7b 0a 20 20 73 71 6c 69 74  pName2){.  sqlit
9180: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9190: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
91a0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
91b0: 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c  *z, *zDb;.  Tabl
91c0: 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
91d0: 20 2a 70 49 64 78 3b 0a 20 20 54 6f 6b 65 6e 20   *pIdx;.  Token 
91e0: 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 0a 20 20  *pTableName;..  
91f0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
9200: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
9210: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9220: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9230: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
9240: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
9250: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
9260: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
9270: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
9280: 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65  llMutexes(pParse
9290: 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53  ->db) );.  if( S
92a0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
92b0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
92c0: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
92d0: 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  n;.  }..  assert
92e0: 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70  ( pName2!=0 || p
92f0: 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66  Name1==0 );.  if
9300: 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
9310: 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41     /* Form 1:  A
9320: 6e 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e  nalyze everythin
9330: 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  g */.    for(i=0
9340: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9350: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
9360: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  1 ) continue;  /
9370: 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65  * Do not analyze
9380: 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
9390: 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c  se */.      anal
93a0: 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72  yzeDatabase(pPar
93b0: 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  se, i);.    }.  
93c0: 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
93d0: 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ->n==0 ){.    /*
93e0: 20 46 6f 72 6d 20 32 3a 20 20 41 6e 61 6c 79 7a   Form 2:  Analyz
93f0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  e the database o
9400: 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 2a 2f  r table named */
9410: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
9420: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
9430: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
9440: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 6e  b>=0 ){.      an
9450: 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50  alyzeDatabase(pP
9460: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
9470: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d  }else{.      z =
9480: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
9490: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 31  Token(db, pName1
94a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29  );.      if( z )
94b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
94c0: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
94d0: 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 30 29  dIndex(db, z, 0)
94e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
94f0: 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70    analyzeTable(p
9500: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61  Parse, pIdx->pTa
9510: 62 6c 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ble, pIdx);.    
9520: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
9530: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
9540: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
9550: 20 30 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b   0, z, 0))!=0 ){
9560: 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79  .          analy
9570: 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  zeTable(pParse, 
9580: 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pTab, 0);.      
9590: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
95a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
95b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
95c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
95d0: 46 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20  Form 3: Analyze 
95e0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
95f0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  ied table name *
9600: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
9610: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
9620: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
9630: 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61  Name2, &pTableNa
9640: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
9650: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  >=0 ){.      zDb
9660: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
9670: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a 20 3d  zName;.      z =
9680: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
9690: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
96a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
96b0: 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66   z ){.        if
96c0: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
96d0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
96e0: 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20  , zDb))!=0 ){.  
96f0: 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54          analyzeT
9700: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 49 64  able(pParse, pId
9710: 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64 78 29  x->pTable, pIdx)
9720: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
9730: 69 66 28 20 28 70 54 61 62 20 3d 20 73 71 6c 69  if( (pTab = sqli
9740: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
9750: 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 7a 44 62  Parse, 0, z, zDb
9760: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
9770: 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28     analyzeTable(
9780: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
9790: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
97a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
97b0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
97c0: 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 0a 7d  }.    }   .  }.}
97d0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20  ../*.** Used to 
97e0: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
97f0: 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a   from the analyz
9800: 65 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67  er reader throug
9810: 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  h to the.** call
9820: 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  back routine..*/
9830: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
9840: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61  analysisInfo ana
9850: 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63  lysisInfo;.struc
9860: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b  t analysisInfo {
9870: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
9880: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
9890: 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  atabase;.};../*.
98a0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
98b0: 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20  ument points to 
98c0: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
98d0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
98e0: 6e 67 20 61 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  ng a.** list of 
98f0: 73 70 61 63 65 20 73 65 70 61 72 61 74 65 64 20  space separated 
9900: 69 6e 74 65 67 65 72 73 2e 20 52 65 61 64 20 74  integers. Read t
9910: 68 65 20 66 69 72 73 74 20 6e 4f 75 74 20 6f 66  he first nOut of
9920: 20 74 68 65 73 65 20 69 6e 74 6f 0a 2a 2a 20 74   these into.** t
9930: 68 65 20 61 72 72 61 79 20 61 4f 75 74 5b 5d 2e  he array aOut[].
9940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9950: 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a  decodeIntArray(.
9960: 20 20 63 68 61 72 20 2a 7a 49 6e 74 41 72 72 61    char *zIntArra
9970: 79 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20  y, .  int nOut, 
9980: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 4f 75 74  .  tRowcnt *aOut
9990: 2c 20 0a 20 20 69 6e 74 20 2a 70 62 55 6e 6f 72  , .  int *pbUnor
99a0: 64 65 72 65 64 0a 29 7b 0a 20 20 63 68 61 72 20  dered.){.  char 
99b0: 2a 7a 20 3d 20 7a 49 6e 74 41 72 72 61 79 3b 0a  *z = zIntArray;.
99c0: 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69    int c;.  int i
99d0: 3b 0a 20 20 74 52 6f 77 63 6e 74 20 76 3b 0a 0a  ;.  tRowcnt v;..
99e0: 20 20 61 73 73 65 72 74 28 20 70 62 55 6e 6f 72    assert( pbUnor
99f0: 64 65 72 65 64 3d 3d 30 20 7c 7c 20 2a 70 62 55  dered==0 || *pbU
9a00: 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a 0a  nordered==0 );..
9a10: 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26    for(i=0; *z &&
9a20: 20 69 3c 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a 20   i<nOut; i++){. 
9a30: 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68     v = 0;.    wh
9a40: 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27  ile( (c=z[0])>='
9a50: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a  0' && c<='9' ){.
9a60: 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b        v = v*10 +
9a70: 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20   c - '0';.      
9a80: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  z++;.    }.    a
9a90: 4f 75 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20  Out[i] = v;.    
9aa0: 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b  if( *z==' ' ) z+
9ab0: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 55  +;.  }.  if( pbU
9ac0: 6e 6f 72 64 65 72 65 64 20 26 26 20 73 74 72 63  nordered && strc
9ad0: 6d 70 28 7a 2c 20 22 75 6e 6f 72 64 65 72 65 64  mp(z, "unordered
9ae0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 62  ")==0 ){.    *pb
9af0: 55 6e 6f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  Unordered = 1;. 
9b00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
9b10: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
9b20: 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  oked once for ea
9b30: 63 68 20 69 6e 64 65 78 20 77 68 65 6e 20 72 65  ch index when re
9b40: 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  ading the.** sql
9b50: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e  ite_stat1 table.
9b60: 20 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67    .**.**     arg
9b70: 76 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74  v[0] = name of t
9b80: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
9b90: 61 72 67 76 5b 31 5d 20 3d 20 6e 61 6d 65 20 6f  argv[1] = name o
9ba0: 66 20 74 68 65 20 69 6e 64 65 78 20 28 6d 69 67  f the index (mig
9bb0: 68 74 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 20  ht be NULL).**  
9bc0: 20 20 20 61 72 67 76 5b 32 5d 20 3d 20 72 65 73     argv[2] = res
9bd0: 75 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73 69 73  ults of analysis
9be0: 20 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20 66 6f   - on integer fo
9bf0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  r each column.**
9c00: 0a 2a 2a 20 45 6e 74 72 69 65 73 20 66 6f 72 20  .** Entries for 
9c10: 77 68 69 63 68 20 61 72 67 76 5b 31 5d 3d 3d 4e  which argv[1]==N
9c20: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 63 6f 72  ULL simply recor
9c30: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
9c40: 72 6f 77 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74  rows in.** the t
9c50: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
9c60: 69 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64  int analysisLoad
9c70: 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  er(void *pData, 
9c80: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
9c90: 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f  *argv, char **No
9ca0: 74 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c 79 73  tUsed){.  analys
9cb0: 69 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  isInfo *pInfo = 
9cc0: 28 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a 29 70  (analysisInfo*)p
9cd0: 44 61 74 61 3b 0a 20 20 49 6e 64 65 78 20 2a 70  Data;.  Index *p
9ce0: 49 6e 64 65 78 3b 0a 20 20 54 61 62 6c 65 20 2a  Index;.  Table *
9cf0: 70 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  pTable;.  const 
9d00: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
9d10: 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20  rt( argc==3 );. 
9d20: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9d30: 52 32 28 4e 6f 74 55 73 65 64 2c 20 61 72 67 63  R2(NotUsed, argc
9d40: 29 3b 0a 0a 20 20 69 66 28 20 61 72 67 76 3d 3d  );..  if( argv==
9d50: 30 20 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20  0 || argv[0]==0 
9d60: 7c 7c 20 61 72 67 76 5b 32 5d 3d 3d 30 20 29 7b  || argv[2]==0 ){
9d70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
9d80: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
9d90: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
9da0: 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 30  Info->db, argv[0
9db0: 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62  ], pInfo->zDatab
9dc0: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ase);.  if( pTab
9dd0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  le==0 ){.    ret
9de0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
9df0: 20 61 72 67 76 5b 31 5d 20 29 7b 0a 20 20 20 20   argv[1] ){.    
9e00: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
9e10: 46 69 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d  FindIndex(pInfo-
9e20: 3e 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70 49  >db, argv[1], pI
9e30: 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  nfo->zDatabase);
9e40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
9e50: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
9e60: 7a 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 0a 20 20  z = argv[2];..  
9e70: 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
9e80: 20 20 69 6e 74 20 62 55 6e 6f 72 64 65 72 65 64    int bUnordered
9e90: 20 3d 20 30 3b 0a 20 20 20 20 64 65 63 6f 64 65   = 0;.    decode
9ea0: 49 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29  IntArray((char*)
9eb0: 7a 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  z, pIndex->nColu
9ec0: 6d 6e 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 61 69  mn+1, pIndex->ai
9ed0: 52 6f 77 45 73 74 2c 20 26 62 55 6e 6f 72 64 65  RowEst, &bUnorde
9ee0: 72 65 64 29 3b 0a 20 20 20 20 69 66 28 20 70 49  red);.    if( pI
9ef0: 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
9f00: 65 72 65 3d 3d 30 20 29 20 70 54 61 62 6c 65 2d  ere==0 ) pTable-
9f10: 3e 6e 52 6f 77 45 73 74 20 3d 20 70 49 6e 64 65  >nRowEst = pInde
9f20: 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
9f30: 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f      pIndex->bUno
9f40: 72 64 65 72 65 64 20 3d 20 62 55 6e 6f 72 64 65  rdered = bUnorde
9f50: 72 65 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  red;.  }else{.  
9f60: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
9f70: 28 28 63 68 61 72 2a 29 7a 2c 20 31 2c 20 26 70  ((char*)z, 1, &p
9f80: 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 2c 20  Table->nRowEst, 
9f90: 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
9fa0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
9fb0: 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70   the Index.aSamp
9fc0: 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  le variable is n
9fd0: 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20  ot NULL, delete 
9fe0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9ff0: 72 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63  ray.** and its c
a000: 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  ontents..*/.void
a010: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
a020: 64 65 78 53 61 6d 70 6c 65 73 28 73 71 6c 69 74  dexSamples(sqlit
a030: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
a040: 49 64 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Idx){.#ifdef SQL
a050: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
a060: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61  .  if( pIdx->aSa
a070: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  mple ){.    int 
a080: 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  j;.    for(j=0; 
a090: 6a 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b  j<pIdx->nSample;
a0a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64   j++){.      Ind
a0b0: 65 78 53 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70  exSample *p = &p
a0c0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b  Idx->aSample[j];
a0d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a0e0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 29 3b 0a  Free(db, p->p);.
a0f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a100: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
a110: 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a  ->aSample);.  }.
a120: 20 20 69 66 28 20 64 62 20 26 26 20 64 62 2d 3e    if( db && db->
a130: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
a140: 29 7b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61  ){.    pIdx->nSa
a150: 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 49  mple = 0;.    pI
a160: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b  dx->aSample = 0;
a170: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55  .  }.#else.  UNU
a180: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
a190: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
a1a0: 4d 45 54 45 52 28 70 49 64 78 29 3b 0a 23 65 6e  METER(pIdx);.#en
a1b0: 64 69 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  dif.}..#ifdef SQ
a1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
a1d0: 34 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 63 6f 6e  4./*.** Load con
a1e0: 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 71  tent from the sq
a1f0: 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65  lite_stat4 table
a200: 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 2e   into the Index.
a210: 61 53 61 6d 70 6c 65 5b 5d 0a 2a 2a 20 61 72 72  aSample[].** arr
a220: 61 79 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63  ays of all indic
a230: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
a240: 74 20 6c 6f 61 64 53 74 61 74 34 28 73 71 6c 69  t loadStat4(sqli
a250: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
a260: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74  har *zDb){.  int
a270: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
a280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a290: 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d 20  sult codes from 
a2a0: 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
a2b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
a2c0: 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  Stmt = 0;      /
a2d0: 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
a2e0: 6e 74 20 62 65 69 6e 67 20 72 75 6e 20 2a 2f 0a  nt being run */.
a2f0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 53  /* Text of the S
a320: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
a330: 20 20 49 6e 64 65 78 20 2a 70 50 72 65 76 49 64    Index *pPrevId
a340: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
a350: 2f 2a 20 50 72 65 76 69 6f 75 73 20 69 6e 64 65  /* Previous inde
a360: 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  x in the loop */
a370: 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 2f 2a 20 73 6c 6f 74 20 69 6e 20 70 49 64 78   /* slot in pIdx
a3a0: 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20  ->aSample[] for 
a3b0: 6e 65 78 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20  next sample */. 
a3c0: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 53   IndexSample *pS
a3d0: 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  ample;         /
a3e0: 2a 20 41 20 73 6c 6f 74 20 69 6e 20 70 49 64 78  * A slot in pIdx
a3f0: 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a  ->aSample[] */..
a400: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
a410: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
a420: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 73 71  ==0 );.  if( !sq
a430: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
a440: 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34  b, "sqlite_stat4
a450: 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 72  ", zDb) ){.    r
a460: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a470: 0a 20 20 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20 73  .  }..  zSql = s
a480: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
a490: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
a4a0: 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52   idx,count(*) FR
a4b0: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
a4c0: 74 34 22 0a 20 20 20 20 20 20 22 20 47 52 4f 55  t4".      " GROU
a4d0: 50 20 42 59 20 69 64 78 22 2c 20 7a 44 62 29 3b  P BY idx", zDb);
a4e0: 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a  .  if( !zSql ){.
a4f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a500: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
a510: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
a520: 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  are(db, zSql, -1
a530: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
a540: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a550: 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  , zSql);.  if( r
a560: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
a570: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
a580: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
a590: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
a5a0: 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20  char *zIndex;   
a5b0: 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f  /* Index name */
a5c0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
a5d0: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
a5e0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62 6a  to the index obj
a5f0: 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ect */.    int n
a600: 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 4e 75  Sample;    /* Nu
a610: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
a620: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
a630: 3b 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  ;      /* Bytes 
a640: 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65  of space require
a650: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20  d */.    int i; 
a660: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
a670: 73 20 6f 66 20 73 70 61 63 65 20 72 65 71 75 69  s of space requi
a680: 72 65 64 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63  red */.    tRowc
a690: 6e 74 20 2a 70 53 70 61 63 65 3b 0a 0a 20 20 20  nt *pSpace;..   
a6a0: 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20   zIndex = (char 
a6b0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
a6c0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
a6d0: 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d  .    if( zIndex=
a6e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
a6f0: 20 20 20 6e 53 61 6d 70 6c 65 20 3d 20 73 71 6c     nSample = sql
a700: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
a710: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70  pStmt, 1);.    p
a720: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Idx = sqlite3Fin
a730: 64 49 6e 64 65 78 28 64 62 2c 20 7a 49 6e 64 65  dIndex(db, zInde
a740: 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  x, zDb);.    if(
a750: 20 70 49 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69   pIdx==0 ) conti
a760: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
a770: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3d 3d   pIdx->nSample==
a780: 30 20 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 6e  0 );.    pIdx->n
a790: 53 61 6d 70 6c 65 20 3d 20 6e 53 61 6d 70 6c 65  Sample = nSample
a7a0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69  ;.    nByte = si
a7b0: 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d 70 6c 65  zeof(IndexSample
a7c0: 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20  ) * nSample;.   
a7d0: 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f 66   nByte += sizeof
a7e0: 28 74 52 6f 77 63 6e 74 29 20 2a 20 70 49 64 78  (tRowcnt) * pIdx
a7f0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 2a 20 33 20 2a 20  ->nColumn * 3 * 
a800: 6e 53 61 6d 70 6c 65 3b 0a 0a 20 20 20 20 70 49  nSample;..    pI
a810: 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 73 71  dx->aSample = sq
a820: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
a830: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
a840: 20 20 70 49 64 78 2d 3e 61 76 67 45 71 20 3d 20    pIdx->avgEq = 
a850: 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 31  pIdx->aiRowEst[1
a860: 5d 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  ];.    if( pIdx-
a870: 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20  >aSample==0 ){. 
a880: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
a890: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
a8a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a8b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
a8c0: 20 20 20 70 53 70 61 63 65 20 3d 20 28 74 52 6f     pSpace = (tRo
a8d0: 77 63 6e 74 2a 29 26 70 49 64 78 2d 3e 61 53 61  wcnt*)&pIdx->aSa
a8e0: 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65 5d 3b 0a 20  mple[nSample];. 
a8f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
a900: 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  dx->nSample; i++
a910: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
a920: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 20 3d  Sample[i].anEq =
a930: 20 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20   pSpace; pSpace 
a940: 2b 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  += pIdx->nColumn
a950: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53  ;.      pIdx->aS
a960: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 20 3d 20  ample[i].anLt = 
a970: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
a980: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
a990: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61  .      pIdx->aSa
a9a0: 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20  mple[i].anDLt = 
a9b0: 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b  pSpace; pSpace +
a9c0: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
a9d0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
a9e0: 74 28 20 28 28 75 38 2a 29 70 53 70 61 63 65 29  t( ((u8*)pSpace)
a9f0: 2d 6e 42 79 74 65 3d 3d 28 75 38 2a 29 28 70 49  -nByte==(u8*)(pI
aa00: 64 78 2d 3e 61 53 61 6d 70 6c 65 29 20 29 3b 0a  dx->aSample) );.
aa10: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
aa20: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
aa30: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
aa40: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 7a 53 71  eturn rc;..  zSq
aa50: 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
aa60: 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53  tf(db, .      "S
aa70: 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c  ELECT idx,neq,nl
aa80: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52  t,ndlt,sample FR
aa90: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
aaa0: 74 34 22 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  t4", zDb);.  if(
aab0: 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65   !zSql ){.    re
aac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
aad0: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
aae0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
aaf0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
ab00: 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
ab10: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
ab20: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
ab30: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
ab40: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
ab50: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
ab60: 4f 57 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  OW ){.    char *
ab70: 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64  zIndex;   /* Ind
ab80: 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49  ex name */.    I
ab90: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f  ndex *pIdx;    /
aba0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
abb0: 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
abc0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
abd0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
abe0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 74 52 6f 77  nter */.    tRow
abf0: 63 6e 74 20 73 75 6d 45 71 3b 20 20 2f 2a 20 53  cnt sumEq;  /* S
ac00: 75 6d 20 6f 66 20 74 68 65 20 6e 45 71 20 76 61  um of the nEq va
ac10: 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lues */.    int 
ac20: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4e  nCol;       /* N
ac30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ac40: 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20   in index */..  
ac50: 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72    zIndex = (char
ac60: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
ac70: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
ac80: 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78  ;.    if( zIndex
ac90: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
aca0: 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74      pIdx = sqlit
acb0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
acc0: 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20  zIndex, zDb);.  
acd0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
ace0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
acf0: 28 20 70 49 64 78 3d 3d 70 50 72 65 76 49 64 78  ( pIdx==pPrevIdx
ad00: 20 29 7b 0a 20 20 20 20 20 20 69 64 78 2b 2b 3b   ){.      idx++;
ad10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ad20: 20 20 70 50 72 65 76 49 64 78 20 3d 20 70 49 64    pPrevIdx = pId
ad30: 78 3b 0a 20 20 20 20 20 20 69 64 78 20 3d 20 30  x;.      idx = 0
ad40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
ad50: 72 74 28 20 69 64 78 3c 70 49 64 78 2d 3e 6e 53  rt( idx<pIdx->nS
ad60: 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 70 53 61  ample );.    pSa
ad70: 6d 70 6c 65 20 3d 20 26 70 49 64 78 2d 3e 61 53  mple = &pIdx->aS
ad80: 61 6d 70 6c 65 5b 69 64 78 5d 3b 0a 0a 20 20 20  ample[idx];..   
ad90: 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
ada0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 64 65 63 6f 64  olumn;.    decod
adb0: 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a  eIntArray((char*
adc0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
add0: 74 65 78 74 28 70 53 74 6d 74 2c 31 29 2c 20 6e  text(pStmt,1), n
ade0: 43 6f 6c 2c 20 70 53 61 6d 70 6c 65 2d 3e 61 6e  Col, pSample->an
adf0: 45 71 2c 20 30 29 3b 0a 20 20 20 20 64 65 63 6f  Eq, 0);.    deco
ae00: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
ae10: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
ae20: 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 20  _text(pStmt,2), 
ae30: 6e 43 6f 6c 2c 20 70 53 61 6d 70 6c 65 2d 3e 61  nCol, pSample->a
ae40: 6e 4c 74 2c 20 30 29 3b 0a 20 20 20 20 64 65 63  nLt, 0);.    dec
ae50: 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61  odeIntArray((cha
ae60: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
ae70: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 33 29 2c  n_text(pStmt,3),
ae80: 20 6e 43 6f 6c 2c 20 70 53 61 6d 70 6c 65 2d 3e   nCol, pSample->
ae90: 61 6e 44 4c 74 2c 30 29 3b 0a 0a 20 20 20 20 69  anDLt,0);..    i
aea0: 66 28 20 69 64 78 3d 3d 70 49 64 78 2d 3e 6e 53  f( idx==pIdx->nS
aeb0: 61 6d 70 6c 65 2d 31 20 29 7b 0a 20 20 20 20 20  ample-1 ){.     
aec0: 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e 61 6e   if( pSample->an
aed0: 44 4c 74 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  DLt[0]>0 ){.    
aee0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 73 75 6d      for(i=0, sum
aef0: 45 71 3d 30 3b 20 69 3c 3d 69 64 78 2d 31 3b 20  Eq=0; i<=idx-1; 
af00: 69 2b 2b 29 20 73 75 6d 45 71 20 2b 3d 20 70 49  i++) sumEq += pI
af10: 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  dx->aSample[i].a
af20: 6e 45 71 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  nEq[0];.        
af30: 70 49 64 78 2d 3e 61 76 67 45 71 20 3d 20 28 70  pIdx->avgEq = (p
af40: 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74 5b 30 5d 20  Sample->anLt[0] 
af50: 2d 20 73 75 6d 45 71 29 2f 70 53 61 6d 70 6c 65  - sumEq)/pSample
af60: 2d 3e 61 6e 44 4c 74 5b 30 5d 3b 0a 20 20 20 20  ->anDLt[0];.    
af70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
af80: 64 78 2d 3e 61 76 67 45 71 3c 3d 30 20 29 20 70  dx->avgEq<=0 ) p
af90: 49 64 78 2d 3e 61 76 67 45 71 20 3d 20 31 3b 0a  Idx->avgEq = 1;.
afa0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 61 6d 70      }..    pSamp
afb0: 6c 65 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 5f  le->n = sqlite3_
afc0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
afd0: 6d 74 2c 20 34 29 3b 0a 20 20 20 20 70 53 61 6d  mt, 4);.    pSam
afe0: 70 6c 65 2d 3e 70 20 3d 20 73 71 6c 69 74 65 33  ple->p = sqlite3
aff0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
b000: 20 70 53 61 6d 70 6c 65 2d 3e 6e 29 3b 0a 20 20   pSample->n);.  
b010: 20 20 69 66 28 20 70 53 61 6d 70 6c 65 2d 3e 70    if( pSample->p
b020: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
b030: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
b040: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tmt);.      retu
b050: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b060: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
b070: 79 28 70 53 61 6d 70 6c 65 2d 3e 70 2c 20 73 71  y(pSample->p, sq
b080: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
b090: 62 28 70 53 74 6d 74 2c 20 34 29 2c 20 70 53 61  b(pStmt, 4), pSa
b0a0: 6d 70 6c 65 2d 3e 6e 29 3b 0a 0a 20 20 7d 0a 20  mple->n);..  }. 
b0b0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
b0c0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
b0d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b0e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
b0f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20   */../*.** Load 
b100: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
b110: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
b120: 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 34  and sqlite_stat4
b130: 20 74 61 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20   tables. The.** 
b140: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69  contents of sqli
b150: 74 65 5f 73 74 61 74 31 20 61 72 65 20 75 73 65  te_stat1 are use
b160: 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  d to populate th
b170: 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
b180: 5b 5d 0a 2a 2a 20 61 72 72 61 79 73 2e 20 54 68  [].** arrays. Th
b190: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71  e contents of sq
b1a0: 6c 69 74 65 5f 73 74 61 74 34 20 61 72 65 20 75  lite_stat4 are u
b1b0: 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  sed to populate 
b1c0: 74 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61  the.** Index.aSa
b1d0: 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a  mple[] arrays..*
b1e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69  *.** If the sqli
b1f0: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69  te_stat1 table i
b200: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
b210: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53   the database, S
b220: 51 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69  QLITE_ERROR.** i
b230: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
b240: 68 69 73 20 63 61 73 65 2c 20 65 76 65 6e 20 69  his case, even i
b250: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b260: 53 54 41 54 34 20 77 61 73 20 64 65 66 69 6e 65  STAT4 was define
b270: 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d  d .** during com
b280: 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  pilation and the
b290: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61   sqlite_stat4 ta
b2a0: 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ble is present, 
b2b0: 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 72  no data is .** r
b2c0: 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a  ead from it..**.
b2d0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** If SQLITE_ENA
b2e0: 42 4c 45 5f 53 54 41 54 34 20 77 61 73 20 64 65  BLE_STAT4 was de
b2f0: 66 69 6e 65 64 20 64 75 72 69 6e 67 20 63 6f 6d  fined during com
b300: 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  pilation and the
b310: 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74   .** sqlite_stat
b320: 34 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 70  4 table is not p
b330: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61  resent in the da
b340: 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  tabase, SQLITE_E
b350: 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72  RROR is.** retur
b360: 6e 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e  ned. However, in
b370: 20 74 68 69 73 20 63 61 73 65 2c 20 64 61 74 61   this case, data
b380: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
b390: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 0a 2a  e sqlite_stat1.*
b3a0: 2a 20 74 61 62 6c 65 20 28 69 66 20 69 74 20 69  * table (if it i
b3b0: 73 20 70 72 65 73 65 6e 74 29 20 62 65 66 6f 72  s present) befor
b3c0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
b3d0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
b3e0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
b3f0: 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
b400: 73 65 74 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  sets db->mallocF
b410: 61 69 6c 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6d  ailed..** This m
b420: 65 61 6e 73 20 69 66 20 74 68 65 20 63 61 6c 6c  eans if the call
b430: 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 61 72 65  er does not care
b440: 20 61 62 6f 75 74 20 6f 74 68 65 72 20 65 72 72   about other err
b450: 6f 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 0a  ors, the return.
b460: 2a 2a 20 63 6f 64 65 20 6d 61 79 20 62 65 20 69  ** code may be i
b470: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
b480: 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f  qlite3AnalysisLo
b490: 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ad(sqlite3 *db, 
b4a0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 61 6e 61 6c  int iDb){.  anal
b4b0: 79 73 69 73 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a  ysisInfo sInfo;.
b4c0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
b4d0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
b4e0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
b4f0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
b500: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
b510: 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
b520: 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  ].pBt!=0 );..  /
b530: 2a 20 43 6c 65 61 72 20 61 6e 79 20 70 72 69 6f  * Clear any prio
b540: 72 20 73 74 61 74 69 73 74 69 63 73 20 2a 2f 0a  r statistics */.
b550: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b560: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
b570: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
b580: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
b590: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
b5a0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
b5b0: 64 78 48 61 73 68 29 3b 69 3b 69 3d 73 71 6c 69  dxHash);i;i=sqli
b5c0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
b5d0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
b5e0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
b5f0: 28 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (i);.    sqlite3
b600: 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
b610: 64 78 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  dx);.#ifdef SQLI
b620: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
b630: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
b640: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
b650: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 70 49 64  , pIdx);.    pId
b660: 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a  x->aSample = 0;.
b670: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
b680: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
b690: 75 72 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ure the sqlite_s
b6a0: 74 61 74 31 20 74 61 62 6c 65 20 65 78 69 73 74  tat1 table exist
b6b0: 73 20 2a 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20  s */.  sInfo.db 
b6c0: 3d 20 64 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44  = db;.  sInfo.zD
b6d0: 61 74 61 62 61 73 65 20 3d 20 64 62 2d 3e 61 44  atabase = db->aD
b6e0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
b6f0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
b700: 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
b710: 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a  _stat1", sInfo.z
b720: 44 61 74 61 62 61 73 65 29 3d 3d 30 20 29 7b 0a  Database)==0 ){.
b730: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b740: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
b750: 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61 74  /* Load new stat
b760: 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74 68  istics out of th
b770: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
b780: 61 62 6c 65 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d  able */.  zSql =
b790: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
b7a0: 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45  db, .      "SELE
b7b0: 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20  CT tbl,idx,stat 
b7c0: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
b7d0: 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61  tat1", sInfo.zDa
b7e0: 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 7a  tabase);.  if( z
b7f0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Sql==0 ){.    rc
b800: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
b810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
b820: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
b830: 64 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73  db, zSql, analys
b840: 69 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f  isLoader, &sInfo
b850: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b860: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
b870: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c 6f  );.  }...  /* Lo
b880: 61 64 20 74 68 65 20 73 74 61 74 69 73 74 69 63  ad the statistic
b890: 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
b8a0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20 2a  e_stat4 table. *
b8b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
b8c0: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69  ENABLE_STAT4.  i
b8d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b8e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b   ){.    int look
b8f0: 61 73 69 64 65 45 6e 61 62 6c 65 64 20 3d 20 64  asideEnabled = d
b900: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
b910: 61 62 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 6c  abled;.    db->l
b920: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
b930: 64 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  d = 0;.    rc = 
b940: 6c 6f 61 64 53 74 61 74 34 28 64 62 2c 20 73 49  loadStat4(db, sI
b950: 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  nfo.zDatabase);.
b960: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
b970: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 6c 6f 6f  e.bEnabled = loo
b980: 6b 61 73 69 64 65 45 6e 61 62 6c 65 64 3b 0a 20  kasideEnabled;. 
b990: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
b9a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
b9b0: 4d 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  M ){.    db->mal
b9c0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
b9d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b9e0: 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }...#endif /* SQ
b9f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
ba00: 45 20 2a 2f 0a                                   E */.