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

Artifact a0979f7fdc8cd724f8e646ba9ef6ca1e56fa7491:


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 53 75 6d 45 71 20 61 6e 64 20 68  mum nSumEq and h
2610: 61 73 68 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 53  ash */.  int mxS
2620: 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20  ample;          
2630: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
2640: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
2650: 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 2a 2f  to accumulate */
2660: 0a 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20  .  int nSample; 
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2680: 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
2690: 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69  f samples */.  i
26a0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
26b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26c0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
26d0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
26e0: 75 33 32 20 69 50 72 6e 3b 20 20 20 20 20 20 20  u32 iPrn;       
26f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 73 65            /* Pse
2700: 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  udo-random numbe
2710: 72 20 75 73 65 64 20 66 6f 72 20 73 61 6d 70 6c  r used for sampl
2720: 69 6e 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ing */.  struct 
2730: 53 74 61 74 34 53 61 6d 70 6c 65 20 7b 0a 20 20  Stat4Sample {.  
2740: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 52 6f 77 69 64 20 69 6e 20 6d 61 69 6e 20 74 61  Rowid in main ta
2770: 62 6c 65 20 6f 66 20 74 68 65 20 6b 65 79 20 2a  ble of the key *
2780: 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 53  /.    tRowcnt nS
2790: 75 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  umEq;           
27a0: 20 2f 2a 20 53 75 6d 20 6f 66 20 61 6e 45 71 5b   /* Sum of anEq[
27b0: 5d 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  ] values */.    
27c0: 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71 3b 20 20  tRowcnt *anEq;  
27d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
27e0: 6c 69 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a  lite_stat4.nEq *
27f0: 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61  /.    tRowcnt *a
2800: 6e 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nLt;            
2810: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34   /* sqlite_stat4
2820: 2e 6e 4c 74 20 2a 2f 0a 20 20 20 20 74 52 6f 77  .nLt */.    tRow
2830: 63 6e 74 20 2a 61 6e 44 4c 74 3b 20 20 20 20 20  cnt *anDLt;     
2840: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2850: 5f 73 74 61 74 34 2e 6e 44 4c 74 20 2a 2f 0a 20  _stat4.nDLt */. 
2860: 20 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b     u8 isPSample;
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2880: 20 54 72 75 65 20 69 66 20 61 20 70 65 72 69 6f   True if a perio
2890: 64 69 63 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20  dic sample */.  
28a0: 20 20 75 33 32 20 69 48 61 73 68 3b 20 20 20 20    u32 iHash;    
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28c0: 54 69 65 62 72 65 61 6b 65 72 20 68 61 73 68 20  Tiebreaker hash 
28d0: 2a 2f 0a 20 20 7d 20 2a 61 3b 20 20 20 20 20 20  */.  } *a;      
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f0: 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 73 61  * An array of sa
2900: 6d 70 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  mples */.};..#if
2910: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2920: 45 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 49 6d  E_STAT4./*.** Im
2930: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2940: 74 68 65 20 73 74 61 74 34 5f 69 6e 69 74 28 43  the stat4_init(C
2950: 2c 4e 2c 53 29 20 53 51 4c 20 66 75 6e 63 74 69  ,N,S) SQL functi
2960: 6f 6e 2e 20 54 68 65 20 74 68 72 65 65 20 70 61  on. The three pa
2970: 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72 65 20  rameters.** are 
2980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2990: 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
29a0: 6f 72 20 69 6e 64 65 78 20 28 43 29 2c 20 74 68  or index (C), th
29b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
29c0: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 69 6e  mns.** in the in
29d0: 64 65 78 20 28 4e 29 20 61 6e 64 20 74 68 65 20  dex (N) and the 
29e0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
29f0: 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  s to accumulate 
2a00: 28 53 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  (S)..**.** This 
2a10: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
2a20: 73 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d  s the Stat4Accum
2a30: 20 6f 62 6a 65 63 74 20 69 6e 20 68 65 61 70 20   object in heap 
2a40: 6d 65 6d 6f 72 79 2e 20 54 68 65 20 72 65 74 75  memory. The retu
2a50: 72 6e 20 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  rn .** value is 
2a60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2a70: 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 20   the Stat4Accum 
2a80: 6f 62 6a 65 63 74 20 65 6e 63 6f 64 65 64 20 61  object encoded a
2a90: 73 20 61 20 62 6c 6f 62 20 28 69 2e 65 2e 20 0a  s a blob (i.e. .
2aa0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
2ab0: 68 65 20 62 6c 6f 62 20 69 73 20 73 69 7a 65 6f  he blob is sizeo
2ac0: 66 28 76 6f 69 64 2a 29 20 62 79 74 65 73 29 2e  f(void*) bytes).
2ad0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2ae0: 20 73 74 61 74 34 49 6e 69 74 28 0a 20 20 73 71   stat4Init(.  sq
2af0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
2b00: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
2b10: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
2b20: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
2b30: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 3b 0a 20  Stat4Accum *p;. 
2b40: 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20   u8 *pSpace;    
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 70   /* Allocated sp
2b70: 61 63 65 20 6e 6f 74 20 79 65 74 20 61 73 73 69  ace not yet assi
2b80: 67 6e 65 64 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  gned */.  tRowcn
2b90: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
2ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2bb0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2bc0: 61 62 6c 65 20 28 43 29 20 2a 2f 0a 20 20 69 6e  able (C) */.  in
2bd0: 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20  t mxSample;     
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf0: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2c00: 6f 66 20 73 61 6d 70 6c 65 73 20 63 6f 6c 6c 65  of samples colle
2c10: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  cted */.  int nC
2c20: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
2c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c40: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
2c50: 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 61  n index being sa
2c60: 6d 70 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mpled */.  int n
2c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2c90: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
2ca0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
2cb0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cd0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
2ce0: 20 74 68 72 6f 75 67 68 20 70 2d 3e 61 53 61 6d   through p->aSam
2cf0: 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ple[] */..  /* D
2d00: 65 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20  ecode the three 
2d10: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
2d20: 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  ts */.  UNUSED_P
2d30: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
2d40: 20 20 6e 52 6f 77 20 3d 20 28 74 52 6f 77 63 6e    nRow = (tRowcn
2d50: 74 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  t)sqlite3_value_
2d60: 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a  int64(argv[0]);.
2d70: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
2d80: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
2d90: 31 5d 29 3b 0a 20 20 6d 78 53 61 6d 70 6c 65 20  1]);.  mxSample 
2da0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2db0: 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  int(argv[2]);.  
2dc0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 3e 30 20 29  assert( nCol>0 )
2dd0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2de0: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
2df0: 72 65 64 20 66 6f 72 20 74 68 65 20 53 74 61 74  red for the Stat
2e00: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 2a 2f  4Accum object */
2e10: 0a 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 2a 70  .  n = sizeof(*p
2e20: 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 2d 3e 61  ) + (sizeof(p->a
2e30: 5b 30 5d 29 20 2b 20 33 2a 73 69 7a 65 6f 66 28  [0]) + 3*sizeof(
2e40: 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 29 2a 6d  tRowcnt)*nCol)*m
2e50: 78 53 61 6d 70 6c 65 3b 0a 20 20 70 20 3d 20 73  xSample;.  p = s
2e60: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2e70: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  ( n );.  if( p==
2e80: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2e90: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2ea0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
2eb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2ec0: 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
2ed0: 20 6e 65 77 20 53 74 61 74 34 41 63 63 75 6d 20   new Stat4Accum 
2ee0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 2d 3e 6e  object */.  p->n
2ef0: 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 70 2d  Row = nRow;.  p-
2f00: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
2f10: 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 3d 20 6d 78  p->mxSample = mx
2f20: 53 61 6d 70 6c 65 3b 0a 20 20 70 2d 3e 6e 50 53  Sample;.  p->nPS
2f30: 61 6d 70 6c 65 20 3d 20 70 2d 3e 6e 52 6f 77 2f  ample = p->nRow/
2f40: 28 6d 78 53 61 6d 70 6c 65 2f 33 2b 31 29 20 2b  (mxSample/3+1) +
2f50: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61   1;.  sqlite3_ra
2f60: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
2f70: 70 2d 3e 69 50 72 6e 29 2c 20 26 70 2d 3e 69 50  p->iPrn), &p->iP
2f80: 72 6e 29 3b 0a 20 20 70 2d 3e 61 20 3d 20 28 73  rn);.  p->a = (s
2f90: 74 72 75 63 74 20 53 74 61 74 34 53 61 6d 70 6c  truct Stat4Sampl
2fa0: 65 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 53 70 61  e*)&p[1];.  pSpa
2fb0: 63 65 20 3d 20 28 75 38 2a 29 28 26 70 2d 3e 61  ce = (u8*)(&p->a
2fc0: 5b 6d 78 53 61 6d 70 6c 65 5d 29 3b 0a 20 20 66  [mxSample]);.  f
2fd0: 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 53 61 6d 70  or(i=0; i<mxSamp
2fe0: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  le; i++){.    p-
2ff0: 3e 61 5b 69 5d 2e 61 6e 45 71 20 3d 20 28 74 52  >a[i].anEq = (tR
3000: 6f 77 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20  owcnt *)pSpace; 
3010: 70 53 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f  pSpace += (sizeo
3020: 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f  f(tRowcnt) * nCo
3030: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  l);.    p->a[i].
3040: 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20  anLt = (tRowcnt 
3050: 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  *)pSpace; pSpace
3060: 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77   += (sizeof(tRow
3070: 63 6e 74 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20  cnt) * nCol);.  
3080: 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 44 4c 74 20    p->a[i].anDLt 
3090: 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29 70 53 70  = (tRowcnt *)pSp
30a0: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 28  ace; pSpace += (
30b0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20  sizeof(tRowcnt) 
30c0: 2a 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 61  * nCol);.  }.  a
30d0: 73 73 65 72 74 28 20 28 70 53 70 61 63 65 20 2d  ssert( (pSpace -
30e0: 20 28 75 38 2a 29 70 29 3d 3d 6e 20 29 3b 0a 0a   (u8*)p)==n );..
30f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
3100: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
3110: 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 20 74 6f  ocated object to
3120: 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
3130: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3140: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2c  blob(context, p,
3150: 20 73 69 7a 65 6f 66 28 70 29 2c 20 73 71 6c 69   sizeof(p), sqli
3160: 74 65 33 5f 66 72 65 65 29 3b 0a 7d 0a 73 74 61  te3_free);.}.sta
3170: 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65  tic const FuncDe
3180: 66 20 73 74 61 74 34 49 6e 69 74 46 75 6e 63 64  f stat4InitFuncd
3190: 65 66 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20  ef = {.  3,     
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 41             /* nA
31b0: 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55  rg */.  SQLITE_U
31c0: 54 46 38 2c 20 20 20 20 20 20 2f 2a 20 69 50 72  TF8,      /* iPr
31d0: 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  efEnc */.  0,   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31f0: 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20  flags */.  0,   
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3210: 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30  pUserData */.  0
3220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3230: 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73   /* pNext */.  s
3240: 74 61 74 34 49 6e 69 74 2c 20 20 20 20 20 20 20  tat4Init,       
3250: 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20 30   /* xFunc */.  0
3260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3270: 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20 20 30   /* xStep */.  0
3280: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3290: 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f   /* xFinalize */
32a0: 0a 20 20 22 73 74 61 74 34 5f 69 6e 69 74 22 2c  .  "stat4_init",
32b0: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
32c0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
32d0: 20 20 20 20 20 2f 2a 20 70 48 61 73 68 20 2a 2f       /* pHash */
32e0: 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
32f0: 20 20 20 20 20 2f 2a 20 70 44 65 73 74 72 75 63       /* pDestruc
3300: 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  tor */.};.../*.*
3310: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3320: 20 6f 66 20 74 68 65 20 73 74 61 74 34 5f 70 75   of the stat4_pu
3330: 73 68 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  sh SQL function.
3340: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 64   The arguments d
3350: 65 73 63 72 69 62 65 20 61 0a 2a 2a 20 73 69 6e  escribe a.** sin
3360: 67 6c 65 20 6b 65 79 20 69 6e 73 74 61 6e 63 65  gle key instance
3370: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
3380: 61 6b 65 73 20 74 68 65 20 64 65 63 69 73 69 6f  akes the decisio
3390: 6e 20 61 62 6f 75 74 20 77 68 65 74 68 65 72 20  n about whether 
33a0: 6f 72 20 0a 2a 2a 20 6e 6f 74 20 74 6f 20 72 65  or .** not to re
33b0: 74 61 69 6e 20 74 68 69 73 20 6b 65 79 20 66 6f  tain this key fo
33c0: 72 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  r the sqlite_sta
33d0: 74 34 20 74 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a  t4 table..** .**
33e0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 63 6f 6e   The calling con
33f0: 76 65 6e 74 69 6f 6e 20 69 73 3a 0a 2a 2a 0a 2a  vention is:.**.*
3400: 2a 20 20 20 20 20 73 74 61 74 34 5f 70 75 73 68  *     stat4_push
3410: 28 50 2c 20 72 6f 77 69 64 2c 20 2e 2e 2e 6e 45  (P, rowid, ...nE
3420: 71 20 61 72 67 73 2e 2e 2e 2c 20 2e 2e 2e 6e 4c  q args..., ...nL
3430: 74 20 61 72 67 73 2e 2e 2e 2c 20 2e 2e 2e 6e 44  t args..., ...nD
3440: 4c 74 20 61 72 67 73 2e 2e 2e 29 0a 2a 2a 0a 2a  Lt args...).**.*
3450: 2a 20 77 68 65 72 65 20 65 61 63 68 20 69 6e 73  * where each ins
3460: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 22 2e 2e  tance of the "..
3470: 2e 6e 58 58 20 61 72 67 73 2e 2e 2e 22 20 69 73  .nXX args..." is
3480: 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 6e 20   replaced by an 
3490: 61 72 72 61 79 20 6f 66 0a 2a 2a 20 6e 43 6f 6c  array of.** nCol
34a0: 20 61 72 67 75 6d 65 6e 74 73 2c 20 77 68 65 72   arguments, wher
34b0: 65 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  e nCol is the nu
34c0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
34d0: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 62 65 69  in the index bei
34e0: 6e 67 0a 2a 2a 20 73 61 6d 70 6c 65 64 20 28 69  ng.** sampled (i
34f0: 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
3500: 67 20 73 61 6d 70 6c 65 64 20 69 73 20 22 43 52  g sampled is "CR
3510: 45 41 54 45 20 49 4e 44 45 58 20 69 20 4f 4e 20  EATE INDEX i ON 
3520: 74 28 61 2c 20 62 29 22 2c 20 61 20 0a 2a 2a 20  t(a, b)", a .** 
3530: 74 6f 74 61 6c 20 6f 66 20 38 20 61 72 67 75 6d  total of 8 argum
3540: 65 6e 74 73 20 61 72 65 20 70 61 73 73 65 64 20  ents are passed 
3550: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
3560: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 29 2e 0a  on is invoked)..
3570: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
3580: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
3590: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
35a0: 20 76 6f 69 64 20 73 74 61 74 34 50 75 73 68 28   void stat4Push(
35b0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
35c0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
35d0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
35e0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
35f0: 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20  ){.  Stat4Accum 
3600: 2a 70 20 3d 20 28 53 74 61 74 34 41 63 63 75 6d  *p = (Stat4Accum
3610: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
3620: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
3630: 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c   i64 rowid = sql
3640: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
3650: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 36 34  (argv[1]);.  i64
3660: 20 6e 53 75 6d 45 71 20 3d 20 30 3b 20 20 20 20   nSumEq = 0;    
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3680: 53 75 6d 20 6f 66 20 61 6c 6c 20 6e 45 71 20 70  Sum of all nEq p
3690: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 73  arameters */.  s
36a0: 74 72 75 63 74 20 53 74 61 74 34 53 61 6d 70 6c  truct Stat4Sampl
36b0: 65 20 2a 70 53 61 6d 70 6c 65 3b 0a 20 20 75 33  e *pSample;.  u3
36c0: 32 20 68 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 20  2 h;.  int iMin 
36d0: 3d 20 70 2d 3e 69 4d 69 6e 3b 0a 20 20 69 6e 74  = p->iMin;.  int
36e0: 20 69 3b 0a 20 20 75 38 20 69 73 50 53 61 6d 70   i;.  u8 isPSamp
36f0: 6c 65 20 3d 20 30 3b 0a 20 20 75 38 20 64 6f 49  le = 0;.  u8 doI
3700: 6e 73 65 72 74 20 3d 20 30 3b 0a 0a 20 20 73 71  nsert = 0;..  sq
3710: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 45  lite3_value **aE
3720: 71 20 3d 20 26 61 72 67 76 5b 32 5d 3b 0a 20 20  q = &argv[2];.  
3730: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3740: 61 4c 74 20 3d 20 26 61 72 67 76 5b 32 2b 70 2d  aLt = &argv[2+p-
3750: 3e 6e 43 6f 6c 5d 3b 0a 20 20 73 71 6c 69 74 65  >nCol];.  sqlite
3760: 33 5f 76 61 6c 75 65 20 2a 2a 61 44 4c 74 20 3d  3_value **aDLt =
3770: 20 26 61 72 67 76 5b 32 2b 70 2d 3e 6e 43 6f 6c   &argv[2+p->nCol
3780: 2b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 69 36  +p->nCol];..  i6
3790: 34 20 6e 45 71 20 3d 20 73 71 6c 69 74 65 33 5f  4 nEq = sqlite3_
37a0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 45 71 5b  value_int64(aEq[
37b0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 69  p->nCol-1]);.  i
37c0: 36 34 20 6e 4c 74 20 3d 20 73 71 6c 69 74 65 33  64 nLt = sqlite3
37d0: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 4c 74  _value_int64(aLt
37e0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 0a 20  [p->nCol-1]);.. 
37f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
3800: 52 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 55 4e  R(context);.  UN
3810: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
3820: 72 67 63 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  rgc);..  assert(
3830: 20 70 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20   p->nCol>0 );.  
3840: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 28 32  assert( argc==(2
3850: 20 2b 20 33 2a 70 2d 3e 6e 43 6f 6c 29 20 29 3b   + 3*p->nCol) );
3860: 0a 0a 20 20 2f 2a 20 53 65 74 20 6e 53 75 6d 45  ..  /* Set nSumE
3870: 71 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20  q to the sum of 
3880: 61 6c 6c 20 6e 45 71 20 70 61 72 61 6d 65 74 65  all nEq paramete
3890: 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  rs. */.  for(i=0
38a0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
38b0: 29 7b 0a 20 20 20 20 6e 53 75 6d 45 71 20 2b 3d  ){.    nSumEq +=
38c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
38d0: 6e 74 36 34 28 61 45 71 5b 69 5d 29 3b 0a 20 20  nt64(aEq[i]);.  
38e0: 7d 0a 20 20 69 66 28 20 6e 53 75 6d 45 71 3d 3d  }.  if( nSumEq==
38f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
3900: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
3910: 74 68 69 73 20 73 61 6d 70 6c 65 20 77 69 6c 6c  this sample will
3920: 20 62 65 20 75 73 65 64 2e 20 53 65 74 20 69 73   be used. Set is
3930: 50 53 61 6d 70 6c 65 20 74 6f 20 74 72 75 65 20  PSample to true 
3940: 69 66 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  if this.  ** is 
3950: 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c  a periodic sampl
3960: 65 2c 20 6f 72 20 66 61 6c 73 65 20 69 66 20 69  e, or false if i
3970: 74 20 69 73 20 62 65 69 6e 67 20 63 61 70 74 75  t is being captu
3980: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 61  red because of a
3990: 0a 20 20 2a 2a 20 6c 61 72 67 65 20 6e 53 75 6d  .  ** large nSum
39a0: 45 71 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65  Eq value. If the
39b0: 20 73 61 6d 70 6c 65 20 77 69 6c 6c 20 6e 6f 74   sample will not
39c0: 20 62 65 20 75 73 65 64 2c 20 72 65 74 75 72 6e   be used, return
39d0: 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 68 20   early.  */.  h 
39e0: 3d 20 70 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69  = p->iPrn = p->i
39f0: 50 72 6e 2a 31 31 30 33 35 31 35 32 34 35 20 2b  Prn*1103515245 +
3a00: 20 31 32 33 34 35 3b 0a 20 20 69 66 28 20 28 6e   12345;.  if( (n
3a10: 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 29 21  Lt/p->nPSample)!
3a20: 3d 28 28 6e 45 71 2b 6e 4c 74 29 2f 70 2d 3e 6e  =((nEq+nLt)/p->n
3a30: 50 53 61 6d 70 6c 65 29 20 29 7b 0a 20 20 20 20  PSample) ){.    
3a40: 64 6f 49 6e 73 65 72 74 20 3d 20 69 73 50 53 61  doInsert = isPSa
3a50: 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  mple = 1;.  }els
3a60: 65 20 69 66 28 20 28 70 2d 3e 6e 53 61 6d 70 6c  e if( (p->nSampl
3a70: 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 29 0a 20  e<p->mxSample). 
3a80: 20 20 20 20 20 20 20 20 7c 7c 20 28 6e 53 75 6d          || (nSum
3a90: 45 71 3e 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 6e 53  Eq>p->a[iMin].nS
3aa0: 75 6d 45 71 29 0a 20 20 20 20 20 20 20 20 20 7c  umEq).         |
3ab0: 7c 20 28 6e 53 75 6d 45 71 3d 3d 70 2d 3e 61 5b  | (nSumEq==p->a[
3ac0: 69 4d 69 6e 5d 2e 6e 53 75 6d 45 71 20 26 26 20  iMin].nSumEq && 
3ad0: 68 3e 70 2d 3e 61 5b 69 4d 69 6e 5d 2e 69 48 61  h>p->a[iMin].iHa
3ae0: 73 68 29 20 0a 20 20 29 7b 0a 20 20 20 20 64 6f  sh) .  ){.    do
3af0: 49 6e 73 65 72 74 20 3d 20 31 3b 0a 20 20 7d 0a  Insert = 1;.  }.
3b00: 20 20 69 66 28 20 21 64 6f 49 6e 73 65 72 74 20    if( !doInsert 
3b10: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
3b20: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 65 77 20  Fill in the new 
3b30: 53 74 61 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65  Stat4Sample obje
3b40: 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
3b50: 6e 53 61 6d 70 6c 65 3d 3d 70 2d 3e 6d 78 53 61  nSample==p->mxSa
3b60: 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mple ){.    stru
3b70: 63 74 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  ct Stat4Sample *
3b80: 70 4d 69 6e 20 3d 20 26 70 2d 3e 61 5b 69 4d 69  pMin = &p->a[iMi
3b90: 6e 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  n];.    tRowcnt 
3ba0: 2a 61 6e 45 71 20 3d 20 70 4d 69 6e 2d 3e 61 6e  *anEq = pMin->an
3bb0: 45 71 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  Eq;.    tRowcnt 
3bc0: 2a 61 6e 44 4c 74 20 3d 20 70 4d 69 6e 2d 3e 61  *anDLt = pMin->a
3bd0: 6e 44 4c 74 3b 0a 20 20 20 20 74 52 6f 77 63 6e  nDLt;.    tRowcn
3be0: 74 20 2a 61 6e 4c 74 20 3d 20 70 4d 69 6e 2d 3e  t *anLt = pMin->
3bf0: 61 6e 4c 74 3b 0a 20 20 20 20 61 73 73 65 72 74  anLt;.    assert
3c00: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 2d 20 69  ( p->nSample - i
3c10: 4d 69 6e 20 2d 20 31 20 3e 3d 20 30 20 29 3b 0a  Min - 1 >= 0 );.
3c20: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4d 69 6e      memmove(pMin
3c30: 2c 20 26 70 4d 69 6e 5b 31 5d 2c 20 73 69 7a 65  , &pMin[1], size
3c40: 6f 66 28 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e  of(p->a[0])*(p->
3c50: 6e 53 61 6d 70 6c 65 2d 69 4d 69 6e 2d 31 29 29  nSample-iMin-1))
3c60: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20  ;.    pSample = 
3c70: 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65  &p->a[p->nSample
3c80: 2d 31 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  -1];.    pSample
3c90: 2d 3e 61 6e 45 71 20 3d 20 61 6e 45 71 3b 0a 20  ->anEq = anEq;. 
3ca0: 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c     pSample->anDL
3cb0: 74 20 3d 20 61 6e 44 4c 74 3b 0a 20 20 20 20 70  t = anDLt;.    p
3cc0: 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74 20 3d 20 61  Sample->anLt = a
3cd0: 6e 4c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nLt;.  }else{.  
3ce0: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e    pSample = &p->
3cf0: 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 5d 3b  a[p->nSample++];
3d00: 0a 20 20 7d 0a 20 20 70 53 61 6d 70 6c 65 2d 3e  .  }.  pSample->
3d10: 69 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a  iRowid = rowid;.
3d20: 20 20 70 53 61 6d 70 6c 65 2d 3e 69 48 61 73 68    pSample->iHash
3d30: 20 3d 20 68 3b 0a 20 20 70 53 61 6d 70 6c 65 2d   = h;.  pSample-
3d40: 3e 69 73 50 53 61 6d 70 6c 65 20 3d 20 69 73 50  >isPSample = isP
3d50: 53 61 6d 70 6c 65 3b 0a 20 20 70 53 61 6d 70 6c  Sample;.  pSampl
3d60: 65 2d 3e 6e 53 75 6d 45 71 20 3d 20 6e 53 75 6d  e->nSumEq = nSum
3d70: 45 71 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Eq;.  for(i=0; i
3d80: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
3d90: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45      pSample->anE
3da0: 71 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  q[i] = sqlite3_v
3db0: 61 6c 75 65 5f 69 6e 74 36 34 28 61 45 71 5b 69  alue_int64(aEq[i
3dc0: 5d 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d  ]);.    pSample-
3dd0: 3e 61 6e 4c 74 5b 69 5d 20 3d 20 73 71 6c 69 74  >anLt[i] = sqlit
3de0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
3df0: 4c 74 5b 69 5d 29 3b 0a 20 20 20 20 70 53 61 6d  Lt[i]);.    pSam
3e00: 70 6c 65 2d 3e 61 6e 44 4c 74 5b 69 5d 20 3d 20  ple->anDLt[i] = 
3e10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
3e20: 74 36 34 28 61 44 4c 74 5b 69 5d 29 2d 31 3b 0a  t64(aDLt[i])-1;.
3e30: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3e40: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
3e50: 61 44 4c 74 5b 69 5d 29 3e 30 20 29 3b 0a 20 20  aDLt[i])>0 );.  
3e60: 7d 20 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  } ..  /* Find th
3e70: 65 20 6e 65 77 20 6d 69 6e 69 6d 75 6d 20 2a 2f  e new minimum */
3e80: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
3e90: 65 3d 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29  e==p->mxSample )
3ea0: 7b 0a 20 20 20 20 75 33 32 20 69 48 61 73 68 20  {.    u32 iHash 
3eb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
3ec0: 20 20 20 20 2f 2a 20 48 61 73 68 20 63 6f 72 72      /* Hash corr
3ed0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 69 4d 69  esponding to iMi
3ee0: 6e 2f 6e 53 75 6d 45 71 20 65 6e 74 72 79 20 2a  n/nSumEq entry *
3ef0: 2f 0a 20 20 20 20 69 36 34 20 6e 4d 69 6e 45 71  /.    i64 nMinEq
3f00: 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
3f10: 3b 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20  ;   /* Smallest 
3f20: 6e 53 75 6d 45 71 20 73 65 65 6e 20 73 6f 20 66  nSumEq seen so f
3f30: 61 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ar */.    assert
3f40: 28 20 69 4d 69 6e 20 3d 20 2d 31 20 29 3b 0a 0a  ( iMin = -1 );..
3f50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3f60: 2d 3e 6d 78 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  ->mxSample; i++)
3f70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  {.      if( p->a
3f80: 5b 69 5d 2e 69 73 50 53 61 6d 70 6c 65 20 29 20  [i].isPSample ) 
3f90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fa0: 69 66 28 20 28 70 2d 3e 61 5b 69 5d 2e 6e 53 75  if( (p->a[i].nSu
3fb0: 6d 45 71 3c 6e 4d 69 6e 45 71 29 0a 20 20 20 20  mEq<nMinEq).    
3fc0: 20 20 20 7c 7c 20 28 70 2d 3e 61 5b 69 5d 2e 6e     || (p->a[i].n
3fd0: 53 75 6d 45 71 3d 3d 6e 4d 69 6e 45 71 20 26 26  SumEq==nMinEq &&
3fe0: 20 70 2d 3e 61 5b 69 5d 2e 69 48 61 73 68 3c 69   p->a[i].iHash<i
3ff0: 48 61 73 68 29 0a 20 20 20 20 20 20 29 7b 0a 20  Hash).      ){. 
4000: 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 3b         iMin = i;
4010: 0a 20 20 20 20 20 20 20 20 6e 4d 69 6e 45 71 20  .        nMinEq 
4020: 3d 20 70 2d 3e 61 5b 69 5d 2e 6e 53 75 6d 45 71  = p->a[i].nSumEq
4030: 3b 0a 20 20 20 20 20 20 20 20 69 48 61 73 68 20  ;.        iHash 
4040: 3d 20 70 2d 3e 61 5b 69 5d 2e 69 48 61 73 68 3b  = p->a[i].iHash;
4050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4060: 20 20 20 61 73 73 65 72 74 28 20 69 4d 69 6e 3e     assert( iMin>
4070: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d 69  =0 );.    p->iMi
4080: 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d 0a  n = iMin;.  }.}.
4090: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e  static const Fun
40a0: 63 44 65 66 20 73 74 61 74 34 50 75 73 68 46 75  cDef stat4PushFu
40b0: 6e 63 64 65 66 20 3d 20 7b 0a 20 20 2d 31 2c 20  ncdef = {.  -1, 
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40d0: 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54   nArg */.  SQLIT
40e0: 45 5f 55 54 46 38 2c 20 20 20 20 20 20 2f 2a 20  E_UTF8,      /* 
40f0: 69 50 72 65 66 45 6e 63 20 2a 2f 0a 20 20 30 2c  iPrefEnc */.  0,
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 2f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 30 2c  /* flags */.  0,
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
4140: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4150: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
4160: 20 20 73 74 61 74 34 50 75 73 68 2c 20 20 20 20    stat4Push,    
4170: 20 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a      /* xFunc */.
4180: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4190: 20 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a      /* xStep */.
41a0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
41b0: 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65      /* xFinalize
41c0: 20 2a 2f 0a 20 20 22 73 74 61 74 34 5f 70 75 73   */.  "stat4_pus
41d0: 68 22 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65  h",     /* zName
41e0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 70 48 61 73 68          /* pHash
4200: 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
4210: 20 20 20 20 20 20 20 20 2f 2a 20 70 44 65 73 74          /* pDest
4220: 72 75 63 74 6f 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ructor */.};../*
4230: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
4240: 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 33 5f  on of the stat3_
4250: 67 65 74 28 50 2c 4e 2c 2e 2e 2e 29 20 53 51 4c  get(P,N,...) SQL
4260: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
4270: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 75   routine is.** u
4280: 73 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  sed to query the
4290: 20 72 65 73 75 6c 74 73 2e 20 20 43 6f 6e 74 65   results.  Conte
42a0: 6e 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  nt is returned f
42b0: 6f 72 20 74 68 65 20 4e 74 68 20 73 71 6c 69 74  or the Nth sqlit
42c0: 65 5f 73 74 61 74 33 0a 2a 2a 20 72 6f 77 20 77  e_stat3.** row w
42d0: 68 65 72 65 20 4e 20 69 73 20 62 65 74 77 65 65  here N is betwee
42e0: 6e 20 30 20 61 6e 64 20 53 2d 31 20 61 6e 64 20  n 0 and S-1 and 
42f0: 53 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  S is the number 
4300: 6f 66 20 73 61 6d 70 6c 65 73 2e 20 20 54 68 65  of samples.  The
4310: 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
4320: 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
4330: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
4340: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 61  ments..**.**   a
4350: 72 67 63 3d 3d 32 20 20 20 20 72 65 73 75 6c 74  rgc==2    result
4360: 3a 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61 72  :  rowid.**   ar
4370: 67 63 3d 3d 33 20 20 20 20 72 65 73 75 6c 74 3a  gc==3    result:
4380: 20 20 6e 45 71 0a 2a 2a 20 20 20 61 72 67 63 3d    nEq.**   argc=
4390: 3d 34 20 20 20 20 72 65 73 75 6c 74 3a 20 20 6e  =4    result:  n
43a0: 4c 74 0a 2a 2a 20 20 20 61 72 67 63 3d 3d 35 20  Lt.**   argc==5 
43b0: 20 20 20 72 65 73 75 6c 74 3a 20 20 6e 44 4c 74     result:  nDLt
43c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
43d0: 73 74 61 74 34 47 65 74 28 0a 20 20 73 71 6c 69  stat4Get(.  sqli
43e0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
43f0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4400: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4410: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74  e **argv.){.  St
4420: 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53  at4Accum *p = (S
4430: 74 61 74 34 41 63 63 75 6d 2a 29 73 71 6c 69 74  tat4Accum*)sqlit
4440: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
4450: 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 20  gv[0]);.  int n 
4460: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4470: 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20  int(argv[1]);.. 
4480: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
4490: 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 6e 53 61 6d  .  if( n<p->nSam
44a0: 70 6c 65 20 29 7b 0a 20 20 20 20 74 52 6f 77 63  ple ){.    tRowc
44b0: 6e 74 20 2a 61 43 6e 74 20 3d 20 30 3b 0a 20 20  nt *aCnt = 0;.  
44c0: 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 0a    char *zRet;. .
44d0: 20 20 20 20 73 77 69 74 63 68 28 20 61 72 67 63      switch( argc
44e0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 32   ){.      case 2
44f0: 3a 20 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  :  .        sqli
4500: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
4510: 28 63 6f 6e 74 65 78 74 2c 20 70 2d 3e 61 5b 6e  (context, p->a[n
4520: 5d 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ].iRowid);.     
4530: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
4540: 20 63 61 73 65 20 33 3a 20 20 61 43 6e 74 20 3d   case 3:  aCnt =
4550: 20 70 2d 3e 61 5b 6e 5d 2e 61 6e 45 71 3b 20 62   p->a[n].anEq; b
4560: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
4570: 20 34 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61   4:  aCnt = p->a
4580: 5b 6e 5d 2e 61 6e 4c 74 3b 20 62 72 65 61 6b 3b  [n].anLt; break;
4590: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
45a0: 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 6e 5d 2e 61  aCnt = p->a[n].a
45b0: 6e 44 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20  nDLt; break;.   
45c0: 20 7d 0a 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   }..    zRet = s
45d0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
45e0: 28 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a  (p->nCol * 25);.
45f0: 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20      if( zRet==0 
4600: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4610: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
4620: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
4630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4640: 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72  nt i;.      char
4650: 20 2a 7a 20 3d 20 7a 52 65 74 3b 0a 20 20 20 20   *z = zRet;.    
4660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4670: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
4680: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4690: 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22 25 6c 6c  intf(24, z, "%ll
46a0: 64 20 22 2c 20 61 43 6e 74 5b 69 5d 29 3b 0a 20  d ", aCnt[i]);. 
46b0: 20 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69         z += sqli
46c0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
46d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
46e0: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27  sert( z[0]=='\0'
46f0: 20 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 20 20   && z>zRet );.  
4700: 20 20 20 20 7a 5b 2d 31 5d 20 3d 20 27 5c 30 27      z[-1] = '\0'
4710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4720: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
4730: 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73  ext, zRet, -1, s
4740: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
4750: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
4760: 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73   const FuncDef s
4770: 74 61 74 34 47 65 74 46 75 6e 63 64 65 66 20 3d  tat4GetFuncdef =
4780: 20 7b 0a 20 20 2d 31 2c 20 20 20 20 20 20 20 20   {.  -1,        
4790: 20 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a         /* nArg *
47a0: 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  /.  SQLITE_UTF8,
47b0: 20 20 20 20 20 20 2f 2a 20 69 50 72 65 66 45 6e        /* iPrefEn
47c0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
47d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
47e0: 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  s */.  0,       
47f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
4800: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4820: 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 34  pNext */.  stat4
4830: 47 65 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Get,         /* 
4840: 78 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xFunc */.  0,   
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 78 53 74 65 70 20 2a 2f 0a 20 20 30 2c 20 20 20  xStep */.  0,   
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4880: 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22  xFinalize */.  "
4890: 73 74 61 74 34 5f 67 65 74 22 2c 20 20 20 20 20  stat4_get",     
48a0: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c  /* zName */.  0,
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 2f 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20 30 20  /* pHash */.  0 
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 2f 2a 20 70 44 65 73 74 72 75 63 74 6f 72 20 2a  /* pDestructor *
48f0: 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  /.};.#endif /* S
4900: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
4910: 54 34 20 2a 2f 0a 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  T4 */...../*.** 
4920: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
4930: 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   do an analysis 
4940: 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  of all indices a
4950: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
4960: 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  * a single table
4970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4980: 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65   analyzeOneTable
4990: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
49a0: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
49b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
49c0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
49d0: 54 61 62 6c 65 20 77 68 6f 73 65 20 69 6e 64 69  Table whose indi
49e0: 63 65 73 20 61 72 65 20 74 6f 20 62 65 20 61 6e  ces are to be an
49f0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65  alyzed */.  Inde
4a00: 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20  x *pOnlyIdx, /* 
4a10: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c  If not NULL, onl
4a20: 79 20 61 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f  y analyze this o
4a30: 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ne index */.  in
4a40: 74 20 69 53 74 61 74 43 75 72 2c 20 20 20 20 2f  t iStatCur,    /
4a50: 2a 20 49 6e 64 65 78 20 6f 66 20 56 64 62 65 43  * Index of VdbeC
4a60: 75 72 73 6f 72 20 74 68 61 74 20 77 72 69 74 65  ursor that write
4a70: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  s the sqlite_sta
4a80: 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  t1 table */.  in
4a90: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 2f  t iMem         /
4aa0: 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  * Available memo
4ab0: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67  ry locations beg
4ac0: 69 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  in here */.){.  
4ad0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4ae0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a 20  arse->db;    /* 
4af0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
4b00: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
4b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b20: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74 6f    /* An index to
4b30: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
4b40: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
4b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4b60: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
4b70: 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20   on index being 
4b80: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 56 64  analyzed */.  Vd
4b90: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
4ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4bb0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
4bc0: 65 20 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70  e being built up
4bd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
4c00: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 4f  er */.  int topO
4c10: 66 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  fLoop;          
4c20: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20       /* The top 
4c30: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
4c40: 20 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20   int endOfLoop; 
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c60: 20 54 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   The end of the 
4c70: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a  loop */.  int jZ
4c80: 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20 20  eroRows = -1;   
4c90: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 66         /* Jump f
4ca0: 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75 6d 62  rom here if numb
4cb0: 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20 7a 65  er of rows is ze
4cc0: 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ro */.  int iDb;
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
4cf0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
4d00: 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 75  ning pTab */.  u
4d10: 38 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 3d  8 needTableCnt =
4d20: 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   1;         /* T
4d30: 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 74 68 65  rue to count the
4d40: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4d50: 72 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d 65  regTabname = iMe
4d60: 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69  m++;     /* Regi
4d70: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
4d80: 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
4d90: 69 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20 3d  int regIdxname =
4da0: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20   iMem++;     /* 
4db0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
4dc0: 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20 2a  ing index name *
4dd0: 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 31  /.  int regStat1
4de0: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20   = iMem++;      
4df0: 20 2f 2a 20 54 68 65 20 73 74 61 74 20 63 6f 6c   /* The stat col
4e00: 75 6d 6e 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  umn of sqlite_st
4e10: 61 74 31 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  at1 */.#ifdef SQ
4e20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
4e30: 34 0a 20 20 69 6e 74 20 72 65 67 4e 75 6d 45 71  4.  int regNumEq
4e40: 20 3d 20 72 65 67 53 74 61 74 31 3b 20 20 20 20   = regStat1;    
4e50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
4e60: 73 74 61 6e 63 65 73 2e 20 20 53 61 6d 65 20 61  stances.  Same a
4e70: 73 20 72 65 67 53 74 61 74 31 20 2a 2f 0a 20 20  s regStat1 */.  
4e80: 69 6e 74 20 72 65 67 4e 75 6d 4c 74 20 3d 20 69  int regNumLt = i
4e90: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
4ea0: 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 73 20 6c  Number of keys l
4eb0: 65 73 73 20 74 68 61 6e 20 72 65 67 53 61 6d 70  ess than regSamp
4ec0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  le */.  int regN
4ed0: 75 6d 44 4c 74 20 3d 20 69 4d 65 6d 2b 2b 3b 20  umDLt = iMem++; 
4ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4ef0: 66 20 64 69 73 74 69 6e 63 74 20 6b 65 79 73 20  f distinct keys 
4f00: 6c 65 73 73 20 74 68 61 6e 20 72 65 67 53 61 6d  less than regSam
4f10: 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ple */.  int reg
4f20: 53 61 6d 70 6c 65 20 3d 20 69 4d 65 6d 2b 2b 3b  Sample = iMem++;
4f30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
4f40: 74 20 73 61 6d 70 6c 65 20 76 61 6c 75 65 20 2a  t sample value *
4f50: 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  /.  int regRowid
4f60: 20 3d 20 72 65 67 53 61 6d 70 6c 65 3b 20 20 20   = regSample;   
4f70: 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 61 20 73   /* Rowid of a s
4f80: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  ample */.  int r
4f90: 65 67 41 63 63 75 6d 20 3d 20 69 4d 65 6d 2b 2b  egAccum = iMem++
4fa0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
4fb0: 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74 61 74  ter to hold Stat
4fc0: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 2a 2f  4Accum object */
4fd0: 0a 20 20 69 6e 74 20 72 65 67 4c 6f 6f 70 20 3d  .  int regLoop =
4fe0: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20   iMem++;        
4ff0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
5000: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 6f 75 6e  */.  int regCoun
5010: 74 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20  t = iMem++;     
5020: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
5030: 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
5040: 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   or index */.  i
5050: 6e 74 20 72 65 67 54 65 6d 70 31 20 3d 20 69 4d  nt regTemp1 = iM
5060: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 49  em++;       /* I
5070: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 67 69  ntermediate regi
5080: 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
5090: 67 54 65 6d 70 32 20 3d 20 69 4d 65 6d 2b 2b 3b  gTemp2 = iMem++;
50a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 6d         /* Interm
50b0: 65 64 69 61 74 65 20 72 65 67 69 73 74 65 72 20  ediate register 
50c0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  */.  int once = 
50d0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
50e0: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 69 6e    /* One-time in
50f0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
5100: 20 20 69 6e 74 20 73 68 6f 72 74 4a 75 6d 70 20    int shortJump 
5110: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
5120: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  * Instruction ad
5130: 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 69  dress */.  int i
5140: 54 61 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d  TabCur = pParse-
5150: 3e 6e 54 61 62 2b 2b 3b 20 2f 2a 20 54 61 62 6c  >nTab++; /* Tabl
5160: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 23 65 6e 64  e cursor */.#end
5170: 69 66 0a 20 20 69 6e 74 20 72 65 67 43 6f 6c 20  if.  int regCol 
5180: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
5190: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
51a0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 61 6c  a column in anal
51b0: 79 7a 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  yzed table */.  
51c0: 69 6e 74 20 72 65 67 52 65 63 20 3d 20 69 4d 65  int regRec = iMe
51d0: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  m++;         /* 
51e0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
51f0: 20 63 6f 6d 70 6c 65 74 65 64 20 72 65 63 6f 72   completed recor
5200: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54 65  d */.  int regTe
5210: 6d 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  mp = iMem++;    
5220: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
5230: 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
5240: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 52 6f 77  .  int regNewRow
5250: 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  id = iMem++;    
5260: 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 65  /* Rowid for the
5270: 20 69 6e 73 65 72 74 65 64 20 72 65 63 6f 72 64   inserted record
5280: 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 53 74   */..  int regSt
5290: 61 74 34 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  at4 = iMem++;   
52a0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
52b0: 74 6f 20 68 6f 6c 64 20 53 74 61 74 34 41 63 63  to hold Stat4Acc
52c0: 75 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  um object */..  
52d0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
52e0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
52f0: 28 20 76 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( v==0 || NEVER(
5300: 70 54 61 62 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pTab==0) ){.    
5310: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
5320: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 30 20  ( pTab->tnum==0 
5330: 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
5340: 20 67 61 74 68 65 72 20 73 74 61 74 69 73 74 69   gather statisti
5350: 63 73 20 6f 6e 20 76 69 65 77 73 20 6f 72 20 76  cs on views or v
5360: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
5370: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5380: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
5390: 74 72 6e 69 63 6d 70 28 70 54 61 62 2d 3e 7a 4e  trnicmp(pTab->zN
53a0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
53b0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  7)==0 ){.    /* 
53c0: 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73 74  Do not gather st
53d0: 61 74 69 73 74 69 63 73 20 6f 6e 20 73 79 73 74  atistics on syst
53e0: 65 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  em tables */.   
53f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
5400: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
5410: 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
5420: 65 73 28 64 62 29 20 29 3b 0a 20 20 69 44 62 20  es(db) );.  iDb 
5430: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
5440: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
5450: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
5460: 65 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20  ert( iDb>=0 );. 
5470: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5480: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
5490: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 23  db, iDb, 0) );.#
54a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
54b0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
54c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
54d0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
54e0: 53 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c 20  SQLITE_ANALYZE, 
54f0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  pTab->zName, 0,.
5500: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
5510: 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20  b].zName ) ){.  
5520: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
5530: 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 73 74 61 62  ndif..  /* Estab
5540: 6c 69 73 68 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lish a read-lock
5550: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 61 74   on the table at
5560: 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68   the shared-cach
5570: 65 20 6c 65 76 65 6c 2e 20 0a 20 20 2a 2a 20 41  e level. .  ** A
5580: 6c 73 6f 20 6f 70 65 6e 20 61 20 72 65 61 64 2d  lso open a read-
5590: 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20 74  only cursor on t
55a0: 68 65 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  he table.  */.  
55b0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
55c0: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
55d0: 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
55e0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54 61  b->zName);.  iTa
55f0: 62 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  bCur = pParse->n
5600: 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
5610: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
5620: 2c 20 69 54 61 62 43 75 72 2c 20 69 44 62 2c 20  , iTabCur, iDb, 
5630: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
5640: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
5650: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
5660: 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 54 61 62  ring8, 0, regTab
5670: 6e 61 6d 65 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  name, 0, pTab->z
5680: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 66 6f 72  Name, 0);..  for
5690: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
56a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
56b0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
56c0: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
56e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
56f0: 6d 6e 73 20 69 6e 64 65 78 65 64 20 62 79 20 70  mns indexed by p
5700: 49 64 78 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  Idx */.    KeyIn
5710: 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20  fo *pKey;       
5720: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
5730: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
5740: 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e  r pIdx */.    in
5750: 74 20 61 64 64 72 49 66 4e 6f 74 20 3d 20 30 3b  t addrIfNot = 0;
5760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
5770: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 66 4e  ddress of OP_IfN
5780: 6f 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61  ot */.    int *a
5790: 43 68 6e 67 41 64 64 72 3b 20 20 20 20 20 20 20  ChngAddr;       
57a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
57b0: 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   of jump instruc
57c0: 74 69 6f 6e 20 61 64 64 72 65 73 73 65 73 20 2a  tion addresses *
57d0: 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  /..    int regRo
57e0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
57f0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
5800: 20 66 6f 72 20 72 6f 77 69 64 20 6f 66 20 63 75   for rowid of cu
5810: 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20  rrent row */.   
5820: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5840: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
5850: 20 6f 66 20 70 72 65 76 69 6f 75 73 20 76 61 6c   of previous val
5860: 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ues */.    int r
5870: 65 67 44 4c 74 65 3b 20 20 20 20 20 20 20 20 20  egDLte;         
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5890: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6e 44  t in array of nD
58a0: 6c 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  lt registers */.
58b0: 20 20 20 20 69 6e 74 20 72 65 67 4c 74 3b 20 20      int regLt;  
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
58e0: 72 61 79 20 6f 66 20 6e 4c 74 20 72 65 67 69 73  ray of nLt regis
58f0: 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
5900: 72 65 67 45 71 3b 20 20 20 20 20 20 20 20 20 20  regEq;          
5910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5920: 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6e  st in array of n
5930: 45 71 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  Eq registers */.
5940: 20 20 20 20 69 6e 74 20 72 65 67 43 6e 74 3b 20      int regCnt; 
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
5970: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 2a 2f 0a  ndex entries */.
5980: 20 20 20 20 69 6e 74 20 72 65 67 45 6f 66 3b 20      int regEof; 
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 2f 2a 20 54 72 75 65 20 6f 6e 63 65 20 63    /* True once c
59b0: 75 72 73 6f 72 73 20 61 72 65 20 61 6c 6c 20 61  ursors are all a
59c0: 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 6e 74  t EOF */.    int
59d0: 20 65 6e 64 4f 66 53 63 61 6e 3b 20 20 20 20 20   endOfScan;     
59e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
59f0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 6f  bel to jump to o
5a00: 6e 63 65 20 73 63 61 6e 20 69 73 20 66 69 6e 69  nce scan is fini
5a10: 73 68 65 64 20 2a 2f 0a 0a 20 20 20 20 69 66 28  shed */..    if(
5a20: 20 70 4f 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e   pOnlyIdx && pOn
5a30: 6c 79 49 64 78 21 3d 70 49 64 78 20 29 20 63 6f  lyIdx!=pIdx ) co
5a40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
5a50: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
5a60: 65 72 65 3d 3d 30 20 29 20 6e 65 65 64 54 61 62  ere==0 ) needTab
5a70: 6c 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 56  leCnt = 0;.    V
5a80: 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
5a90: 76 2c 20 22 42 65 67 69 6e 20 61 6e 61 6c 79 73  v, "Begin analys
5aa0: 69 73 20 6f 66 20 25 73 22 2c 20 70 49 64 78 2d  is of %s", pIdx-
5ab0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6e 43  >zName));.    nC
5ac0: 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
5ad0: 6d 6e 3b 0a 20 20 20 20 61 43 68 6e 67 41 64 64  mn;.    aChngAdd
5ae0: 72 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  r = sqlite3DbMal
5af0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
5b00: 66 28 69 6e 74 29 2a 6e 43 6f 6c 29 3b 0a 20 20  f(int)*nCol);.  
5b10: 20 20 69 66 28 20 61 43 68 6e 67 41 64 64 72 3d    if( aChngAddr=
5b20: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
5b30: 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
5b40: 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
5b50: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 0a 20 20  arse, pIdx);..  
5b60: 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
5b70: 65 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  e register conta
5b80: 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
5b90: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  name. */.    sql
5ba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5bb0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
5bc0: 20 72 65 67 49 64 78 6e 61 6d 65 2c 20 30 2c 20   regIdxname, 0, 
5bd0: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pIdx->zName, 0);
5be0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
5bf0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73  The following ps
5c00: 65 75 64 6f 2d 63 6f 64 65 20 64 65 6d 6f 6e 73  eudo-code demons
5c10: 74 72 61 74 65 73 20 74 68 65 20 77 61 79 20 74  trates the way t
5c20: 68 65 20 56 4d 20 73 63 61 6e 73 20 61 6e 20 69  he VM scans an i
5c30: 6e 64 65 78 20 0a 20 20 20 20 2a 2a 20 74 6f 20  ndex .    ** to 
5c40: 63 61 6c 6c 20 73 74 61 74 34 5f 70 75 73 68 28  call stat4_push(
5c50: 29 20 61 6e 64 20 63 6f 6c 6c 65 63 74 20 74 68  ) and collect th
5c60: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
5c70: 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 0a 20   sqlite_stat1 . 
5c80: 20 20 20 2a 2a 20 65 6e 74 72 79 2e 20 54 68 65     ** entry. The
5c90: 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 66   code below is f
5ca0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 77 69 74 68  or an index with
5cb0: 20 32 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 65 20   2 columns. The 
5cc0: 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 56 4d  actual.    ** VM
5cd0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
5ce0: 6d 61 79 20 62 65 20 66 6f 72 20 61 6e 79 20 6e  may be for any n
5cf0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5d00: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
5d10: 4f 6e 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  One cursor is op
5d20: 65 6e 65 64 20 66 6f 72 20 65 61 63 68 20 63 6f  ened for each co
5d30: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  lumn in the inde
5d40: 78 20 28 6e 43 6f 6c 29 2e 20 41 6c 6c 20 63 75  x (nCol). All cu
5d50: 72 73 6f 72 73 20 0a 20 20 20 20 2a 2a 20 73 63  rsors .    ** sc
5d60: 61 6e 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20  an concurrently 
5d70: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 73  the index from s
5d80: 74 61 72 74 20 74 6f 20 65 6e 64 2e 20 41 6c 6c  tart to end. All
5d90: 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20   variables used 
5da0: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 73  in.    ** the ps
5db0: 65 75 64 6f 2d 63 6f 64 65 20 61 72 65 20 69 6e  eudo-code are in
5dc0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
5dd0: 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  o..    **.    **
5de0: 20 20 20 52 65 77 69 6e 64 20 63 73 72 28 30 29     Rewind csr(0)
5df0: 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e 64  .    **   Rewind
5e00: 20 63 73 72 28 31 29 0a 20 20 20 20 2a 2a 20 0a   csr(1).    ** .
5e10: 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f 30 3a 0a      **  next_0:.
5e20: 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76      **   regPrev
5e30: 28 30 29 20 3d 20 63 73 72 28 30 29 5b 30 5d 0a  (0) = csr(0)[0].
5e40: 20 20 20 20 2a 2a 20 20 20 72 65 67 44 4c 74 65      **   regDLte
5e50: 28 30 29 20 2b 3d 20 31 0a 20 20 20 20 2a 2a 20  (0) += 1.    ** 
5e60: 20 20 72 65 67 4c 74 28 30 29 20 2b 3d 20 72 65    regLt(0) += re
5e70: 67 45 71 28 30 29 0a 20 20 20 20 2a 2a 20 20 20  gEq(0).    **   
5e80: 72 65 67 45 71 28 30 29 20 3d 20 30 0a 20 20 20  regEq(0) = 0.   
5e90: 20 2a 2a 20 20 20 64 6f 20 7b 0a 20 20 20 20 2a   **   do {.    *
5ea0: 2a 20 20 20 20 20 72 65 67 45 71 28 30 29 20 2b  *     regEq(0) +
5eb0: 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 4e  = 1.    **     N
5ec0: 65 78 74 20 63 73 72 28 30 29 0a 20 20 20 20 2a  ext csr(0).    *
5ed0: 2a 20 20 20 7d 77 68 69 6c 65 20 28 20 63 73 72  *   }while ( csr
5ee0: 28 30 29 5b 30 5d 20 3d 3d 20 72 65 67 50 72 65  (0)[0] == regPre
5ef0: 76 28 30 29 20 29 0a 20 20 20 20 2a 2a 20 0a 20  v(0) ).    ** . 
5f00: 20 20 20 2a 2a 20 20 6e 65 78 74 5f 31 3a 0a 20     **  next_1:. 
5f10: 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28     **   regPrev(
5f20: 31 29 20 3d 20 63 73 72 28 31 29 5b 31 5d 0a 20  1) = csr(1)[1]. 
5f30: 20 20 20 2a 2a 20 20 20 72 65 67 44 4c 74 65 28     **   regDLte(
5f40: 31 29 20 2b 3d 20 31 0a 20 20 20 20 2a 2a 20 20  1) += 1.    **  
5f50: 20 72 65 67 4c 74 28 31 29 20 2b 3d 20 72 65 67   regLt(1) += reg
5f60: 45 71 28 31 29 0a 20 20 20 20 2a 2a 20 20 20 72  Eq(1).    **   r
5f70: 65 67 45 71 28 31 29 20 3d 20 30 0a 20 20 20 20  egEq(1) = 0.    
5f80: 2a 2a 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  **   regRowid = 
5f90: 63 73 72 28 31 29 5b 72 6f 77 69 64 5d 20 20 20  csr(1)[rowid]   
5fa0: 20 20 20 20 20 2f 2f 20 69 6e 6e 65 72 6d 6f 73       // innermos
5fb0: 74 20 63 75 72 73 6f 72 20 6f 6e 6c 79 0a 20 20  t cursor only.  
5fc0: 20 20 2a 2a 20 20 20 64 6f 20 7b 0a 20 20 20 20    **   do {.    
5fd0: 2a 2a 20 20 20 20 20 72 65 67 45 71 28 31 29 20  **     regEq(1) 
5fe0: 2b 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20  += 1.    **     
5ff0: 72 65 67 43 6e 74 20 2b 3d 20 31 20 20 20 20 20  regCnt += 1     
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
6010: 20 69 6e 6e 65 72 6d 6f 73 74 20 63 75 72 73 6f   innermost curso
6020: 72 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20  r only.    **   
6030: 20 20 4e 65 78 74 20 63 73 72 28 31 29 0a 20 20    Next csr(1).  
6040: 20 20 2a 2a 20 20 20 7d 77 68 69 6c 65 20 28 20    **   }while ( 
6050: 63 73 72 28 31 29 5b 30 2e 2e 31 5d 20 3d 3d 20  csr(1)[0..1] == 
6060: 72 65 67 50 72 65 76 28 30 2e 2e 31 29 20 29 0a  regPrev(0..1) ).
6070: 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20      ** .    **  
6080: 20 73 74 61 74 34 5f 70 75 73 68 28 72 65 67 52   stat4_push(regR
6090: 6f 77 69 64 2c 20 72 65 67 45 71 2c 20 72 65 67  owid, regEq, reg
60a0: 4c 74 2c 20 72 65 67 44 4c 74 65 29 3b 0a 20 20  Lt, regDLte);.  
60b0: 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20 69    ** .    **   i
60c0: 66 28 20 65 6f 66 28 20 63 73 72 28 31 29 20 29  f( eof( csr(1) )
60d0: 20 29 20 67 6f 74 6f 20 65 6e 64 4f 66 53 63 61   ) goto endOfSca
60e0: 6e 0a 20 20 20 20 2a 2a 20 20 20 69 66 28 20 63  n.    **   if( c
60f0: 73 72 28 31 29 5b 30 5d 20 21 3d 20 72 65 67 50  sr(1)[0] != regP
6100: 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20 6e 65  rev(0) ) goto ne
6110: 78 74 5f 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f  xt_0.    **   go
6120: 74 6f 20 6e 65 78 74 5f 31 0a 20 20 20 20 2a 2a  to next_1.    **
6130: 0a 20 20 20 20 2a 2a 20 20 65 6e 64 4f 66 53 63  .    **  endOfSc
6140: 61 6e 3a 0a 20 20 20 20 2a 2a 20 20 20 2f 2f 20  an:.    **   // 
6150: 64 6f 6e 65 21 0a 20 20 20 20 2a 2a 0a 20 20 20  done!.    **.   
6160: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 74 77 6f   ** The last two
6170: 20 6c 69 6e 65 73 20 61 62 6f 76 65 20 6d 6f 64   lines above mod
6180: 69 66 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ify the contents
6190: 20 6f 66 20 74 68 65 20 72 65 67 44 4c 74 65 20   of the regDLte 
61a0: 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 73 6f 20  array.    ** so 
61b0: 74 68 61 74 20 65 61 63 68 20 65 6c 65 6d 65 6e  that each elemen
61c0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  t contains the n
61d0: 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69 6e 63  umber of distinc
61e0: 74 20 6b 65 79 20 70 72 65 66 69 78 65 73 0a 20  t key prefixes. 
61f0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 6f 72     ** of the cor
6200: 72 65 73 70 6f 6e 64 69 6e 67 20 6c 65 6e 67 74  responding lengt
6210: 68 2e 20 41 73 20 72 65 71 75 69 72 65 64 20 74  h. As required t
6220: 6f 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  o calculate the 
6230: 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20  contents.    ** 
6240: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  of the sqlite_st
6250: 61 74 31 20 65 6e 74 72 79 2e 0a 20 20 20 20 2a  at1 entry..    *
6260: 2a 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  *.    ** Current
6270: 6c 79 2c 20 74 68 65 20 6c 61 73 74 20 6d 65 6d  ly, the last mem
6280: 6f 72 79 20 63 65 6c 6c 20 61 6c 6c 6f 63 61 74  ory cell allocat
6290: 65 64 20 28 74 68 61 74 20 77 69 74 68 20 74 68  ed (that with th
62a0: 65 20 6c 61 72 67 65 73 74 20 0a 20 20 20 20 2a  e largest .    *
62b0: 2a 20 69 6e 74 65 67 65 72 20 69 64 65 6e 74 69  * integer identi
62c0: 66 69 65 72 29 20 69 73 20 72 65 67 53 74 61 74  fier) is regStat
62d0: 34 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 66  4. Immediately f
62e0: 6f 6c 6c 6f 77 69 6e 67 20 72 65 67 53 74 61 74  ollowing regStat
62f0: 34 0a 20 20 20 20 2a 2a 20 77 65 20 61 6c 6c 6f  4.    ** we allo
6300: 63 61 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  cate the followi
6310: 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ng:.    **.    *
6320: 2a 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 2d  *     regRowid -
6330: 20 20 20 20 31 20 72 65 67 69 73 74 65 72 0a 20      1 register. 
6340: 20 20 20 2a 2a 20 20 20 20 20 72 65 67 45 71 20     **     regEq 
6350: 2d 20 20 20 20 6e 43 6f 6c 20 72 65 67 69 73 74  -    nCol regist
6360: 65 72 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 72  ers.    **     r
6370: 65 67 4c 74 20 2d 20 20 20 20 6e 43 6f 6c 20 72  egLt -    nCol r
6380: 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
6390: 20 20 20 20 72 65 67 44 4c 74 65 20 2d 20 20 6e      regDLte -  n
63a0: 43 6f 6c 20 72 65 67 69 73 74 65 72 73 0a 20 20  Col registers.  
63b0: 20 20 2a 2a 20 20 20 20 20 72 65 67 43 6e 74 20    **     regCnt 
63c0: 2d 20 20 20 20 20 20 31 20 72 65 67 69 73 74 65  -      1 registe
63d0: 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 65 67  r.    **     reg
63e0: 50 72 65 76 20 2d 20 20 6e 43 6f 6c 20 72 65 67  Prev -  nCol reg
63f0: 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 20 20  isters.    **   
6400: 20 20 72 65 67 45 6f 66 20 2d 20 20 20 20 20 20    regEof -      
6410: 31 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 2a  1 register.    *
6420: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 67  *.    ** The reg
6430: 52 6f 77 69 64 2c 20 72 65 67 45 71 2c 20 72 65  Rowid, regEq, re
6440: 67 4c 74 20 61 6e 64 20 72 65 67 44 4c 74 65 20  gLt and regDLte 
6450: 72 65 67 69 73 74 65 72 73 20 6d 75 73 74 20 62  registers must b
6460: 65 20 70 6f 73 69 74 69 6f 6e 65 64 20 69 6e 20  e positioned in 
6470: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 72 64  .    ** that ord
6480: 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
6490: 6f 6c 6c 6f 77 69 6e 67 20 72 65 67 53 74 61 74  ollowing regStat
64a0: 34 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  4 so that they c
64b0: 61 6e 20 62 65 20 70 61 73 73 65 64 0a 20 20 20  an be passed.   
64c0: 20 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 74 34   ** to the stat4
64d0: 5f 70 75 73 68 28 29 20 66 75 6e 63 74 69 6f 6e  _push() function
64e0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
64f0: 41 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  All of the above
6500: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
6510: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69 6e 74 65   to contain inte
6520: 67 65 72 20 76 61 6c 75 65 20 30 2e 0a 20 20 20  ger value 0..   
6530: 20 2a 2f 0a 20 20 20 20 72 65 67 52 6f 77 69 64   */.    regRowid
6540: 20 3d 20 72 65 67 53 74 61 74 34 2b 31 3b 20 20   = regStat4+1;  
6550: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 61        /* Rowid a
6560: 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 72  rgument */.    r
6570: 65 67 45 71 20 3d 20 72 65 67 52 6f 77 69 64 2b  egEq = regRowid+
6580: 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
6590: 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f  First in array o
65a0: 66 20 6e 45 71 20 76 61 6c 75 65 20 72 65 67 69  f nEq value regi
65b0: 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 72 65 67  sters */.    reg
65c0: 4c 74 20 3d 20 72 65 67 45 71 2b 6e 43 6f 6c 3b  Lt = regEq+nCol;
65d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
65e0: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
65f0: 6e 4c 74 20 76 61 6c 75 65 20 72 65 67 69 73 74  nLt value regist
6600: 65 72 73 20 2a 2f 0a 20 20 20 20 72 65 67 44 4c  ers */.    regDL
6610: 74 65 20 3d 20 72 65 67 4c 74 2b 6e 43 6f 6c 3b  te = regLt+nCol;
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
6630: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6e 44  t in array of nD
6640: 4c 74 20 76 61 6c 75 65 20 72 65 67 69 73 74 65  Lt value registe
6650: 72 73 20 2a 2f 0a 20 20 20 20 72 65 67 43 6e 74  rs */.    regCnt
6660: 20 3d 20 72 65 67 44 4c 74 65 2b 6e 43 6f 6c 3b   = regDLte+nCol;
6670: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 20 63          /* Row c
6680: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 72 65  ounter */.    re
6690: 67 50 72 65 76 20 3d 20 72 65 67 43 6e 74 2b 31  gPrev = regCnt+1
66a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
66b0: 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66  irst in array of
66c0: 20 70 72 65 76 2e 20 76 61 6c 75 65 20 72 65 67   prev. value reg
66d0: 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 72 65  isters */.    re
66e0: 67 45 6f 66 20 3d 20 72 65 67 50 72 65 76 2b 6e  gEof = regPrev+n
66f0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Col;        /* T
6700: 72 75 65 20 6f 6e 63 65 20 6c 61 73 74 20 72 6f  rue once last ro
6710: 77 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 64 65  w read from inde
6720: 78 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 65 67  x */.    if( reg
6730: 45 6f 66 2b 31 3e 70 50 61 72 73 65 2d 3e 6e 4d  Eof+1>pParse->nM
6740: 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  em ){.      pPar
6750: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 72 65 67 50 72  se->nMem = regPr
6760: 65 76 2b 6e 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a  ev+nCol;.    }..
6770: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
6780: 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66  ad-only cursor f
6790: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
67a0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a  f the index. */.
67b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
67c0: 3d 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f  =sqlite3SchemaTo
67d0: 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e  Index(db, pIdx->
67e0: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
67f0: 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
6800: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50  ->nTab++;.    pP
6810: 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 28 6e  arse->nTab += (n
6820: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 66 6f 72 28  Col-1);.    for(
6830: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
6840: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 6f  ){.      int iMo
6850: 64 65 20 3d 20 28 69 3d 3d 30 20 3f 20 50 34 5f  de = (i==0 ? P4_
6860: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
6870: 3a 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  : P4_KEYINFO);. 
6880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6890: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
68a0: 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2b 69  nRead, iIdxCur+i
68b0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
68c0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
68d0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
68e0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 65 79   -1, (char*)pKey
68f0: 2c 20 69 4d 6f 64 65 29 3b 20 0a 20 20 20 20 20  , iMode); .     
6900: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6910: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
6920: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  me));.    }..#if
6930: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6940: 45 5f 53 54 41 54 34 0a 20 20 20 20 2f 2a 20 49  E_STAT4.    /* I
6950: 6e 76 6f 6b 65 20 74 68 65 20 73 74 61 74 34 5f  nvoke the stat4_
6960: 69 6e 69 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  init() function.
6970: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   The arguments a
6980: 72 65 3a 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  re:.    ** .    
6990: 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 6e 75 6d  **     * the num
69a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
69b0: 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a  he index,.    **
69c0: 20 20 20 20 20 2a 20 74 68 65 20 6e 75 6d 62 65       * the numbe
69d0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
69e0: 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
69f0: 2a 20 20 20 20 20 2a 20 74 68 65 20 72 65 63 6f  *     * the reco
6a00: 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65 72 20 6f  mmended number o
6a10: 66 20 73 61 6d 70 6c 65 73 20 66 6f 72 20 74 68  f samples for th
6a20: 65 20 73 74 61 74 34 20 74 61 62 6c 65 2e 0a 20  e stat4 table.. 
6a30: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
6a40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6a50: 50 5f 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72  P_Count, iIdxCur
6a60: 2c 20 72 65 67 53 74 61 74 34 2b 31 29 3b 0a 20  , regStat4+1);. 
6a70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6a90: 65 72 2c 20 6e 43 6f 6c 2c 20 72 65 67 53 74 61  er, nCol, regSta
6aa0: 74 34 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  t4+2);.    sqlit
6ab0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6ac0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 53 51 4c 49  OP_Integer, SQLI
6ad0: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
6ae0: 2c 20 72 65 67 53 74 61 74 34 2b 33 29 3b 0a 20  , regStat4+3);. 
6af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6b00: 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp3(v, OP_Funct
6b10: 69 6f 6e 2c 20 30 2c 20 72 65 67 53 74 61 74 34  ion, 0, regStat4
6b20: 2b 31 2c 20 72 65 67 53 74 61 74 34 29 3b 0a 20  +1, regStat4);. 
6b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6b40: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
6b50: 68 61 72 2a 29 26 73 74 61 74 34 49 6e 69 74 46  har*)&stat4InitF
6b60: 75 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44  uncdef, P4_FUNCD
6b70: 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
6b80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6b90: 33 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  3);.#endif /* SQ
6ba0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
6bb0: 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  4 */..    /* Ini
6bc0: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 74 68 65 20  tialize all the 
6bd0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
6be0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
6bf0: 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 66 6f   to 0. */.    fo
6c00: 72 28 69 3d 72 65 67 52 6f 77 69 64 3b 20 69 3c  r(i=regRowid; i<
6c10: 3d 72 65 67 45 6f 66 3b 20 69 2b 2b 29 7b 0a 20  =regEof; i++){. 
6c20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6c30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6c40: 65 67 65 72 2c 20 30 2c 20 69 29 3b 0a 20 20 20  eger, 0, i);.   
6c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 77 69 6e   }..    /* Rewin
6c60: 64 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  d all cursors op
6c70: 65 6e 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e  en on the index.
6c80: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   If the table is
6c90: 20 65 6e 74 72 79 2c 20 74 68 69 73 0a 20 20 20   entry, this.   
6ca0: 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 63   ** will cause c
6cb0: 6f 6e 74 72 6f 6c 20 74 6f 20 6a 75 6d 70 20 74  ontrol to jump t
6cc0: 6f 20 61 64 64 72 65 73 73 20 65 6e 64 4f 66 53  o address endOfS
6cd0: 63 61 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  can immediately.
6ce0: 20 20 2a 2f 0a 20 20 20 20 65 6e 64 4f 66 53 63    */.    endOfSc
6cf0: 61 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  an = sqlite3Vdbe
6d00: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6d10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
6d20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
6d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6d40: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
6d50: 49 64 78 43 75 72 2b 69 2c 20 65 6e 64 4f 66 53  IdxCur+i, endOfS
6d60: 63 61 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  can);.    }..   
6d70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
6d80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
6d90: 61 72 20 2a 70 43 6f 6c 6c 20 3d 20 28 63 68 61  ar *pColl = (cha
6da0: 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  r*)sqlite3Locate
6db0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
6dc0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29  pIdx->azColl[i])
6dd0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 73 72  ;.      int iCsr
6de0: 20 3d 20 69 49 64 78 43 75 72 2b 69 3b 0a 20 20   = iIdxCur+i;.  
6df0: 20 20 20 20 69 6e 74 20 69 44 6f 3b 0a 20 20 20      int iDo;.   
6e00: 20 20 20 69 6e 74 20 69 4e 65 3b 20 20 20 20 20     int iNe;     
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6e20: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
6e30: 78 69 74 20 64 6f 7b 2e 2e 2e 7d 77 68 69 6c 65  xit do{...}while
6e40: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
6e50: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt j;.      int 
6e60: 62 49 6e 6e 65 72 20 3d 20 28 69 3d 3d 28 6e 43  bInner = (i==(nC
6e70: 6f 6c 2d 31 29 29 3b 20 2f 2a 20 54 72 75 65 20  ol-1)); /* True 
6e80: 66 6f 72 20 69 6e 6e 65 72 6d 6f 73 74 20 63 75  for innermost cu
6e90: 72 73 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  rsor */..      /
6ea0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
6eb0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
6ec0: 67 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 20  g pseudo-code:. 
6ed0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
6ee0: 20 20 20 72 65 67 50 72 65 76 28 69 29 20 3d 20     regPrev(i) = 
6ef0: 63 73 72 28 69 29 5b 69 5d 0a 20 20 20 20 20 20  csr(i)[i].      
6f00: 2a 2a 20 20 20 72 65 67 44 4c 74 65 28 69 29 20  **   regDLte(i) 
6f10: 2b 3d 20 31 0a 20 20 20 20 20 20 2a 2a 20 20 20  += 1.      **   
6f20: 72 65 67 4c 74 28 69 29 20 2b 3d 20 72 65 67 45  regLt(i) += regE
6f30: 71 28 69 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  q(i).      **   
6f40: 72 65 67 45 71 28 69 29 20 3d 20 30 0a 20 20 20  regEq(i) = 0.   
6f50: 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64     **   regRowid
6f60: 20 3d 20 63 73 72 28 69 29 5b 72 6f 77 69 64 5d   = csr(i)[rowid]
6f70: 20 20 20 20 20 20 20 20 2f 2f 20 69 6e 6e 65 72          // inner
6f80: 6d 6f 73 74 20 63 75 72 73 6f 72 20 6f 6e 6c 79  most cursor only
6f90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6fa0: 61 43 68 6e 67 41 64 64 72 5b 69 5d 20 3d 20 73  aChngAddr[i] = s
6fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6fc0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
6fd0: 43 73 72 2c 20 69 2c 20 72 65 67 50 72 65 76 2b  Csr, i, regPrev+
6fe0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6ff0: 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 67 50 72  mment((v, "regPr
7000: 65 76 28 25 64 29 20 3d 20 63 73 72 28 25 64 29  ev(%d) = csr(%d)
7010: 28 25 64 29 22 2c 20 69 2c 20 69 2c 20 69 29 29  (%d)", i, i, i))
7020: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7030: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7040: 41 64 64 49 6d 6d 2c 20 72 65 67 44 4c 74 65 2b  AddImm, regDLte+
7050: 69 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  i, 1);.      Vdb
7060: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
7070: 67 44 4c 74 65 28 25 64 29 20 2b 3d 20 31 22 2c  gDLte(%d) += 1",
7080: 20 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   i));.      sqli
7090: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
70a0: 20 4f 50 5f 41 64 64 2c 20 72 65 67 45 71 2b 69   OP_Add, regEq+i
70b0: 2c 20 72 65 67 4c 74 2b 69 2c 20 72 65 67 4c 74  , regLt+i, regLt
70c0: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
70d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 67 4c  omment((v, "regL
70e0: 74 28 25 64 29 20 2b 3d 20 72 65 67 45 71 28 25  t(%d) += regEq(%
70f0: 64 29 22 2c 20 69 2c 20 69 29 29 3b 0a 20 20 20  d)", i, i));.   
7100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7110: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7120: 65 72 2c 20 30 2c 20 72 65 67 45 71 2b 69 29 3b  er, 0, regEq+i);
7130: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
7140: 6e 74 28 28 76 2c 20 22 72 65 67 45 71 28 25 64  nt((v, "regEq(%d
7150: 29 20 3d 20 30 22 2c 20 69 29 29 3b 0a 20 20 20  ) = 0", i));.   
7160: 20 20 20 69 66 28 20 62 49 6e 6e 65 72 20 29 20     if( bInner ) 
7170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7180: 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
7190: 2c 20 69 43 73 72 2c 20 72 65 67 52 6f 77 69 64  , iCsr, regRowid
71a0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
71b0: 73 20 62 69 74 3a 0a 20 20 20 20 20 20 2a 2a 0a  s bit:.      **.
71c0: 20 20 20 20 20 20 2a 2a 20 20 20 64 6f 20 7b 0a        **   do {.
71d0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 72 65 67        **     reg
71e0: 45 71 28 69 29 20 2b 3d 20 31 0a 20 20 20 20 20  Eq(i) += 1.     
71f0: 20 2a 2a 20 20 20 20 20 72 65 67 43 6e 74 20 2b   **     regCnt +
7200: 3d 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  = 1             
7210: 20 20 20 20 20 20 2f 2f 20 69 6e 6e 65 72 6d 6f        // innermo
7220: 73 74 20 63 75 72 73 6f 72 20 6f 6e 6c 79 0a 20  st cursor only. 
7230: 20 20 20 20 20 2a 2a 20 20 20 20 20 4e 65 78 74       **     Next
7240: 20 63 73 72 28 69 29 0a 20 20 20 20 20 20 2a 2a   csr(i).      **
7250: 20 20 20 20 20 69 66 28 20 45 6f 66 20 63 73 72       if( Eof csr
7260: 28 69 29 20 29 7b 0a 20 20 20 20 20 20 2a 2a 20  (i) ){.      ** 
7270: 20 20 20 20 20 20 72 65 67 45 6f 66 20 3d 20 31        regEof = 1
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 2f 2f 20 69 6e 6e 65 72 6d 6f 73 74 20 63    // innermost c
72a0: 75 72 73 6f 72 20 6f 6e 6c 79 0a 20 20 20 20 20  ursor only.     
72b0: 20 2a 2a 20 20 20 20 20 20 20 62 72 65 61 6b 0a   **       break.
72c0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 7d 0a 20        **     }. 
72d0: 20 20 20 20 20 2a 2a 20 20 20 7d 77 68 69 6c 65       **   }while
72e0: 20 28 20 63 73 72 28 69 29 5b 30 2e 2e 69 5d 20   ( csr(i)[0..i] 
72f0: 3d 3d 20 72 65 67 50 72 65 76 28 30 2e 2e 69 29  == regPrev(0..i)
7300: 20 29 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20   ).      */.    
7310: 20 20 69 44 6f 20 3d 20 73 71 6c 69 74 65 33 56    iDo = sqlite3V
7320: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7330: 41 64 64 49 6d 6d 2c 20 72 65 67 45 71 2b 69 2c  AddImm, regEq+i,
7340: 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
7350: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 67 45  omment((v, "regE
7360: 71 28 25 64 29 20 2b 3d 20 31 22 2c 20 69 29 29  q(%d) += 1", i))
7370: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 6e  ;.      if( bInn
7380: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  er ){.        sq
7390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
73a0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
73b0: 67 43 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  gCnt, 1);.      
73c0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
73d0: 2c 20 22 72 65 67 43 6e 74 20 2b 3d 20 31 22 29  , "regCnt += 1")
73e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
73f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7400: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
7410: 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  Csr, sqlite3Vdbe
7420: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
7430: 2b 62 49 6e 6e 65 72 29 3b 0a 20 20 20 20 20 20  +bInner);.      
7440: 69 66 28 20 62 49 6e 6e 65 72 20 29 20 73 71 6c  if( bInner ) sql
7450: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7460: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
7470: 20 72 65 67 45 6f 66 29 3b 0a 20 20 20 20 20 20   regEof);.      
7480: 69 4e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  iNe = sqlite3Vdb
7490: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
74a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
74b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
74c0: 6f 2c 20 30 2c 20 69 4e 65 29 3b 0a 20 20 20 20  o, 0, iNe);.    
74d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 69 3b    for(j=0; j<=i;
74e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   j++){.        s
74f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7500: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
7510: 43 73 72 2c 20 6a 2c 20 72 65 67 43 6f 6c 29 3b  Csr, j, regCol);
7520: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7530: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7540: 5f 4e 65 2c 20 72 65 67 43 6f 6c 2c 20 69 4e 65  _Ne, regCol, iNe
7550: 2c 20 72 65 67 50 72 65 76 2b 6a 2c 20 70 43 6f  , regPrev+j, pCo
7560: 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
7570: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7580: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7590: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
75a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
75b0: 65 6e 74 28 28 76 2c 20 22 69 66 28 20 72 65 67  ent((v, "if( reg
75c0: 50 72 65 76 28 25 64 29 20 21 3d 20 63 73 72 28  Prev(%d) != csr(
75d0: 25 64 29 28 25 64 29 20 29 22 2c 20 6a 2c 20 69  %d)(%d) )", j, i
75e0: 2c 20 6a 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , j));.      }. 
75f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7600: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
7610: 6f 2c 20 30 2c 20 69 44 6f 29 3b 0a 20 20 20 20  o, 0, iDo);.    
7620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
7630: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4e 65  olveLabel(v, iNe
7640: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7650: 20 49 6e 76 6f 6b 65 20 73 74 61 74 34 5f 70 75   Invoke stat4_pu
7660: 73 68 28 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69  sh() */.    sqli
7670: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7680: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 31 2c   OP_Function, 1,
7690: 20 72 65 67 53 74 61 74 34 2c 20 72 65 67 54 65   regStat4, regTe
76a0: 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mp2);.    sqlite
76b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
76c0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 26 73 74 61   -1, (char*)&sta
76d0: 74 34 50 75 73 68 46 75 6e 63 64 65 66 2c 20 50  t4PushFuncdef, P
76e0: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
76f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7700: 65 50 35 28 76 2c 20 32 20 2b 20 33 2a 6e 43 6f  eP5(v, 2 + 3*nCo
7710: 6c 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  l);..    sqlite3
7720: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7730: 5f 49 66 2c 20 72 65 67 45 6f 66 2c 20 65 6e 64  _If, regEof, end
7740: 4f 66 53 63 61 6e 29 3b 0a 20 20 20 20 66 6f 72  OfScan);.    for
7750: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 2d 31 3b 20  (i=0; i<nCol-1; 
7760: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
7770: 20 2a 70 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a   *pColl = (char*
7780: 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  )sqlite3LocateCo
7790: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
77a0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a  dx->azColl[i]);.
77b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
77c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
77d0: 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2b 6e 43  lumn, iIdxCur+nC
77e0: 6f 6c 2d 31 2c 20 69 2c 20 72 65 67 43 6f 6c 29  ol-1, i, regCol)
77f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7800: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7810: 4e 65 2c 20 72 65 67 43 6f 6c 2c 20 61 43 68 6e  Ne, regCol, aChn
7820: 67 41 64 64 72 5b 69 5d 2c 20 72 65 67 50 72 65  gAddr[i], regPre
7830: 76 2b 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  v+i);.      sqli
7840: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
7850: 76 2c 20 2d 31 2c 20 70 43 6f 6c 6c 2c 20 50 34  v, -1, pColl, P4
7860: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
7870: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7880: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
7890: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  ULLEQ);.    }.  
78a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
78b0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
78c0: 30 2c 20 61 43 68 6e 67 41 64 64 72 5b 6e 43 6f  0, aChngAddr[nCo
78d0: 6c 2d 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  l-1]);.    sqlit
78e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 68  e3DbFree(db, aCh
78f0: 6e 67 41 64 64 72 29 3b 0a 0a 20 20 20 20 73 71  ngAddr);..    sq
7900: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7910: 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 53 63  Label(v, endOfSc
7920: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f  an);..    /* Clo
7930: 73 65 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f  se all the curso
7940: 72 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  rs */.    for(i=
7950: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
7960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7970: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
7980: 6c 6f 73 65 2c 20 69 49 64 78 43 75 72 2b 69 29  lose, iIdxCur+i)
7990: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
79a0: 65 6e 74 28 28 76 2c 20 22 63 6c 6f 73 65 20 69  ent((v, "close i
79b0: 6e 64 65 78 20 63 75 72 73 6f 72 20 25 64 22 2c  ndex cursor %d",
79c0: 20 69 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66   i));.    }..#if
79d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
79e0: 45 5f 53 54 41 54 34 0a 20 20 20 20 2f 2a 20 41  E_STAT4.    /* A
79f0: 64 64 20 72 6f 77 73 20 74 6f 20 74 68 65 20 73  dd rows to the s
7a00: 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
7a10: 65 20 2a 2f 0a 20 20 20 20 72 65 67 4c 6f 6f 70  e */.    regLoop
7a20: 20 3d 20 72 65 67 53 74 61 74 34 2b 31 3b 0a 20   = regStat4+1;. 
7a30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7a40: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7a50: 65 72 2c 20 2d 31 2c 20 72 65 67 4c 6f 6f 70 29  er, -1, regLoop)
7a60: 3b 0a 20 20 20 20 73 68 6f 72 74 4a 75 6d 70 20  ;.    shortJump 
7a70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
7a80: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
7a90: 2c 20 72 65 67 4c 6f 6f 70 2c 20 31 29 3b 0a 20  , regLoop, 1);. 
7aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ab0: 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp3(v, OP_Funct
7ac0: 69 6f 6e 2c 20 30 2c 20 72 65 67 53 74 61 74 34  ion, 0, regStat4
7ad0: 2c 20 72 65 67 54 65 6d 70 31 29 3b 0a 20 20 20  , regTemp1);.   
7ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7af0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
7b00: 72 2a 29 26 73 74 61 74 34 47 65 74 46 75 6e 63  r*)&stat4GetFunc
7b10: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
7b20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7b30: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 29 3b  eChangeP5(v, 2);
7b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7b50: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
7b60: 75 6c 6c 2c 20 72 65 67 54 65 6d 70 31 29 3b 0a  ull, regTemp1);.
7b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7b80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
7b90: 45 78 69 73 74 73 2c 20 69 54 61 62 43 75 72 2c  Exists, iTabCur,
7ba0: 20 73 68 6f 72 74 4a 75 6d 70 2c 20 72 65 67 54   shortJump, regT
7bb0: 65 6d 70 31 29 3b 0a 20 20 20 20 66 6f 72 28 69  emp1);.    for(i
7bc0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
7bd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
7be0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
7bf0: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  n[i];.      sqli
7c00: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
7c10: 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
7c20: 54 61 62 2c 20 69 54 61 62 43 75 72 2c 20 69 43  Tab, iTabCur, iC
7c30: 6f 6c 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a  ol, regPrev+i);.
7c40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7c50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7c60: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7c70: 67 50 72 65 76 2c 20 6e 43 6f 6c 2c 20 72 65 67  gPrev, nCol, reg
7c80: 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 73 71 6c  Sample);.    sql
7c90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
7ca0: 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 43  (v, -1, pIdx->zC
7cb0: 6f 6c 41 66 66 2c 20 30 29 3b 0a 0a 20 20 20 20  olAff, 0);..    
7cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7cd0: 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  3(v, OP_Function
7ce0: 2c 20 31 2c 20 72 65 67 53 74 61 74 34 2c 20 72  , 1, regStat4, r
7cf0: 65 67 4e 75 6d 45 71 29 3b 0a 20 20 20 20 73 71  egNumEq);.    sq
7d00: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7d10: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
7d20: 26 73 74 61 74 34 47 65 74 46 75 6e 63 64 65 66  &stat4GetFuncdef
7d30: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
7d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7d50: 61 6e 67 65 50 35 28 76 2c 20 33 29 3b 0a 0a 20  angeP5(v, 3);.. 
7d60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d70: 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp3(v, OP_Funct
7d80: 69 6f 6e 2c 20 31 2c 20 72 65 67 53 74 61 74 34  ion, 1, regStat4
7d90: 2c 20 72 65 67 4e 75 6d 4c 74 29 3b 0a 20 20 20  , regNumLt);.   
7da0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7db0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
7dc0: 72 2a 29 26 73 74 61 74 34 47 65 74 46 75 6e 63  r*)&stat4GetFunc
7dd0: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
7de0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7df0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 34 29 3b  eChangeP5(v, 4);
7e00: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
7e10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75  eAddOp3(v, OP_Fu
7e20: 6e 63 74 69 6f 6e 2c 20 31 2c 20 72 65 67 53 74  nction, 1, regSt
7e30: 61 74 34 2c 20 72 65 67 4e 75 6d 44 4c 74 29 3b  at4, regNumDLt);
7e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e50: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
7e60: 28 63 68 61 72 2a 29 26 73 74 61 74 34 47 65 74  (char*)&stat4Get
7e70: 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43  Funcdef, P4_FUNC
7e80: 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
7e90: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7ea0: 20 35 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65   5);..    sqlite
7eb0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
7ec0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7ed0: 67 54 61 62 6e 61 6d 65 2c 20 36 2c 20 72 65 67  gTabname, 6, reg
7ee0: 52 65 63 2c 20 22 62 62 62 62 62 62 22 2c 20 30  Rec, "bbbbbb", 0
7ef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7f00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7f10: 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75  ewRowid, iStatCu
7f20: 72 2b 31 2c 20 72 65 67 4e 65 77 52 6f 77 69 64  r+1, regNewRowid
7f30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7f40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7f50: 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2b  nsert, iStatCur+
7f60: 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67 4e 65  1, regRec, regNe
7f70: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
7f80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7f90: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 68  , OP_Goto, 0, sh
7fa0: 6f 72 74 4a 75 6d 70 29 3b 0a 20 20 20 20 73 71  ortJump);.    sq
7fb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
7fc0: 65 28 76 2c 20 73 68 6f 72 74 4a 75 6d 70 2b 32  e(v, shortJump+2
7fd0: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 20 20  );.#endif       
7fe0: 20 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20   ..    /* Store 
7ff0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 73  the results in s
8000: 71 6c 69 74 65 5f 73 74 61 74 31 2e 0a 20 20 20  qlite_stat1..   
8010: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
8020: 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
8030: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 73 71 6c  e row of the sql
8040: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e  ite_stat1 table.
8050: 20 20 54 68 65 20 66 69 72 73 74 0a 20 20 20 20    The first.    
8060: 2a 2a 20 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 61  ** two columns a
8070: 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  re the names of 
8080: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  the table and in
8090: 64 65 78 2e 20 20 54 68 65 20 74 68 69 72 64 20  dex.  The third 
80a0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 69 73  column.    ** is
80b0: 20 61 20 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73   a string compos
80c0: 65 64 20 6f 66 20 61 20 6c 69 73 74 20 6f 66 20  ed of a list of 
80d0: 69 6e 74 65 67 65 72 20 73 74 61 74 69 73 74 69  integer statisti
80e0: 63 73 20 61 62 6f 75 74 20 74 68 65 0a 20 20 20  cs about the.   
80f0: 20 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20   ** index.  The 
8100: 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 69 6e  first integer in
8110: 20 74 68 65 20 6c 69 73 74 20 69 73 20 74 68 65   the list is the
8120: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8130: 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
8140: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54  in the index.  T
8150: 68 65 72 65 20 69 73 20 6f 6e 65 20 61 64 64 69  here is one addi
8160: 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69  tional integer i
8170: 6e 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 65  n the list for e
8180: 61 63 68 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  ach.    ** colum
8190: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
81a0: 20 54 68 69 73 20 61 64 64 69 74 69 6f 6e 61 6c   This additional
81b0: 20 69 6e 74 65 67 65 72 20 69 73 20 61 20 67 75   integer is a gu
81c0: 65 73 73 20 6f 66 20 68 6f 77 20 6d 61 6e 79 0a  ess of how many.
81d0: 20 20 20 20 2a 2a 20 72 6f 77 73 20 6f 66 20 74      ** rows of t
81e0: 68 65 20 74 61 62 6c 65 20 74 68 65 20 69 6e 64  he table the ind
81f0: 65 78 20 77 69 6c 6c 20 73 65 6c 65 63 74 2e 20  ex will select. 
8200: 20 49 66 20 44 20 69 73 20 74 68 65 20 63 6f 75   If D is the cou
8210: 6e 74 20 6f 66 20 64 69 73 74 69 6e 63 74 0a 20  nt of distinct. 
8220: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 61 6e 64     ** values and
8230: 20 4b 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20   K is the total 
8240: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 2c 20  number of rows, 
8250: 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72  then the integer
8260: 20 69 73 20 63 6f 6d 70 75 74 65 64 0a 20 20 20   is computed.   
8270: 20 2a 2a 20 61 73 3a 0a 20 20 20 20 2a 2a 0a 20   ** as:.    **. 
8280: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 49 20 3d     **        I =
8290: 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20 20 20 2a   (K+D-1)/D.    *
82a0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 4b 3d 3d 30  *.    ** If K==0
82b0: 20 74 68 65 6e 20 6e 6f 20 65 6e 74 72 79 20 69   then no entry i
82c0: 73 20 6d 61 64 65 20 69 6e 74 6f 20 74 68 65 20  s made into the 
82d0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
82e0: 6c 65 2e 20 20 0a 20 20 20 20 2a 2a 20 49 66 20  le.  .    ** If 
82f0: 4b 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 61  K>0 then it is a
8300: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 20 74  lways the case t
8310: 68 65 20 44 3e 30 20 73 6f 20 64 69 76 69 73 69  he D>0 so divisi
8320: 6f 6e 20 62 79 20 7a 65 72 6f 0a 20 20 20 20 2a  on by zero.    *
8330: 2a 20 69 73 20 6e 65 76 65 72 20 70 6f 73 73 69  * is never possi
8340: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
8350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8360: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
8370: 65 67 43 6e 74 2c 20 72 65 67 53 74 61 74 31 29  egCnt, regStat1)
8380: 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20  ;.    jZeroRows 
8390: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
83a0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
83b0: 20 72 65 67 43 6e 74 29 3b 0a 20 20 20 20 66 6f   regCnt);.    fo
83c0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
83d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
83e0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
83f0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72  OP_String8, 0, r
8400: 65 67 54 65 6d 70 2c 20 30 2c 20 22 20 22 2c 20  egTemp, 0, " ", 
8410: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8420: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8430: 50 5f 43 6f 6e 63 61 74 2c 20 72 65 67 54 65 6d  P_Concat, regTem
8440: 70 2c 20 72 65 67 53 74 61 74 31 2c 20 72 65 67  p, regStat1, reg
8450: 53 74 61 74 31 29 3b 0a 20 20 20 20 20 20 73 71  Stat1);.      sq
8460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8470: 76 2c 20 4f 50 5f 41 64 64 2c 20 72 65 67 43 6e  v, OP_Add, regCn
8480: 74 2c 20 72 65 67 44 4c 74 65 2b 69 2c 20 72 65  t, regDLte+i, re
8490: 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  gTemp);.      sq
84a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
84b0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
84c0: 67 54 65 6d 70 2c 20 2d 31 29 3b 0a 20 20 20 20  gTemp, -1);.    
84d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
84e0: 4f 70 33 28 76 2c 20 4f 50 5f 44 69 76 69 64 65  Op3(v, OP_Divide
84f0: 2c 20 72 65 67 44 4c 74 65 2b 69 2c 20 72 65 67  , regDLte+i, reg
8500: 54 65 6d 70 2c 20 72 65 67 54 65 6d 70 29 3b 0a  Temp, regTemp);.
8510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8520: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 54 6f  eAddOp1(v, OP_To
8530: 49 6e 74 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20  Int, regTemp);. 
8540: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8550: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp3(v, OP_Con
8560: 63 61 74 2c 20 72 65 67 54 65 6d 70 2c 20 72 65  cat, regTemp, re
8570: 67 53 74 61 74 31 2c 20 72 65 67 53 74 61 74 31  gStat1, regStat1
8580: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8590: 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
85a0: 68 65 72 65 21 3d 30 20 29 20 73 71 6c 69 74 65  here!=0 ) sqlite
85b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
85c0: 20 6a 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 20   jZeroRows);.   
85d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85e0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
85f0: 6f 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c  ord, regTabname,
8600: 20 33 2c 20 72 65 67 52 65 63 2c 20 22 61 61 61   3, regRec, "aaa
8610: 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
8620: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8630: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74  OP_NewRowid, iSt
8640: 61 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77  atCur, regNewRow
8650: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
8660: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8670: 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75  _Insert, iStatCu
8680: 72 2c 20 72 65 67 52 65 63 2c 20 72 65 67 4e 65  r, regRec, regNe
8690: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  wRowid);.    sql
86a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
86b0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
86c0: 44 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  D);.    if( pIdx
86d0: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
86e0: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
86f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 5a 65 72  JumpHere(v, jZer
8700: 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  oRows);.  }..  /
8710: 2a 20 43 72 65 61 74 65 20 61 20 73 69 6e 67 6c  * Create a singl
8720: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 65  e sqlite_stat1 e
8730: 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ntry containing 
8740: 4e 55 4c 4c 20 61 73 20 74 68 65 20 69 6e 64 65  NULL as the inde
8750: 78 0a 20 20 2a 2a 20 6e 61 6d 65 20 61 6e 64 20  x.  ** name and 
8760: 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20 61 73  the row count as
8770: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 20 20   the content..  
8780: 2a 2f 0a 20 20 69 66 28 20 70 4f 6e 6c 79 49 64  */.  if( pOnlyId
8790: 78 3d 3d 30 20 26 26 20 6e 65 65 64 54 61 62 6c  x==0 && needTabl
87a0: 65 43 6e 74 20 29 7b 0a 20 20 20 20 56 64 62 65  eCnt ){.    Vdbe
87b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
87c0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  , pTab->zName));
87d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
87e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
87f0: 6e 74 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67  nt, iTabCur, reg
8800: 53 74 61 74 31 29 3b 0a 20 20 20 20 6a 5a 65 72  Stat1);.    jZer
8810: 6f 52 6f 77 73 20 3d 20 73 71 6c 69 74 65 33 56  oRows = sqlite3V
8820: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8830: 49 66 4e 6f 74 2c 20 72 65 67 53 74 61 74 31 29  IfNot, regStat1)
8840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8850: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
8860: 6c 6c 2c 20 30 2c 20 72 65 67 49 64 78 6e 61 6d  ll, 0, regIdxnam
8870: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
8880: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
8890: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54  MakeRecord, regT
88a0: 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65 67 52 65  abname, 3, regRe
88b0: 63 2c 20 22 61 61 61 22 2c 20 30 29 3b 0a 20 20  c, "aaa", 0);.  
88c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
88d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
88e0: 69 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  id, iStatCur, re
88f0: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
8900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8910: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
8920: 69 53 74 61 74 43 75 72 2c 20 72 65 67 52 65 63  iStatCur, regRec
8930: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
8940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8950: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
8960: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
8970: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
8980: 72 65 28 76 2c 20 6a 5a 65 72 6f 52 6f 77 73 29  re(v, jZeroRows)
8990: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
89a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
89b0: 5f 43 6c 6f 73 65 2c 20 69 54 61 62 43 75 72 29  _Close, iTabCur)
89c0: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 4e 6f  ;..  /* TODO: No
89d0: 74 20 73 75 72 65 20 61 62 6f 75 74 20 74 68 69  t sure about thi
89e0: 73 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  s... */.  if( pP
89f0: 61 72 73 65 2d 3e 6e 4d 65 6d 3c 72 65 67 52 65  arse->nMem<regRe
8a00: 63 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  c ) pParse->nMem
8a10: 20 3d 20 72 65 67 52 65 63 3b 0a 7d 0a 0a 0a 2f   = regRec;.}.../
8a20: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
8a30: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75  de that will cau
8a40: 73 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  se the most rece
8a50: 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c 79 73 69  nt index analysi
8a60: 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f 61 64 65  s to.** be loade
8a70: 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e 61 6c 20  d into internal 
8a80: 68 61 73 68 20 74 61 62 6c 65 73 20 77 68 65 72  hash tables wher
8a90: 65 20 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  e is can be used
8aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8ab0: 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 50 61   loadAnalysis(Pa
8ac0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8ad0: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
8ae0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
8af0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
8b00: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
8b10: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
8b20: 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 2c 20  P_LoadAnalysis, 
8b30: 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iDb);.  }.}../*.
8b40: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8b50: 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e   that will do an
8b60: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 6e 20   analysis of an 
8b70: 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 0a  entire database.
8b80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
8b90: 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65 28 50  nalyzeDatabase(P
8ba0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
8bb0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
8bc0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8bd0: 64 62 3b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  db;.  Schema *pS
8be0: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
8bf0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 20 20 20  iDb].pSchema;   
8c00: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 64 61   /* Schema of da
8c10: 74 61 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20  tabase iDb */.  
8c20: 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20 20 69  HashElem *k;.  i
8c30: 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 20 20 69  nt iStatCur;.  i
8c40: 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 73 71 6c 69  nt iMem;..  sqli
8c50: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
8c60: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
8c70: 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43  , iDb);.  iStatC
8c80: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
8c90: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  b;.  pParse->nTa
8ca0: 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74  b += 3;.  openSt
8cb0: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
8cc0: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 30  iDb, iStatCur, 0
8cd0: 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70  , 0);.  iMem = p
8ce0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8cf0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8d00: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
8d10: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
8d20: 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
8d30: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
8d40: 3e 74 62 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d  >tblHash); k; k=
8d50: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
8d60: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
8d70: 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
8d80: 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
8d90: 0a 20 20 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54  .    analyzeOneT
8da0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
8db0: 62 2c 20 30 2c 20 69 53 74 61 74 43 75 72 2c 20  b, 0, iStatCur, 
8dc0: 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61  iMem);.  }.  loa
8dd0: 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72 73 65  dAnalysis(pParse
8de0: 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
8df0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8e00: 68 61 74 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61  hat will do an a
8e10: 6e 61 6c 79 73 69 73 20 6f 66 20 61 20 73 69 6e  nalysis of a sin
8e20: 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  gle table in.** 
8e30: 61 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  a database.  If 
8e40: 70 4f 6e 6c 79 49 64 78 20 69 73 20 6e 6f 74 20  pOnlyIdx is not 
8e50: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
8e60: 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 0a 2a  a single index.*
8e70: 2a 20 69 6e 20 70 54 61 62 20 74 68 61 74 20 73  * in pTab that s
8e80: 68 6f 75 6c 64 20 62 65 20 61 6e 61 6c 79 7a 65  hould be analyze
8e90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8ea0: 64 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50  d analyzeTable(P
8eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
8ec0: 62 6c 65 20 2a 70 54 61 62 2c 20 49 6e 64 65 78  ble *pTab, Index
8ed0: 20 2a 70 4f 6e 6c 79 49 64 78 29 7b 0a 20 20 69   *pOnlyIdx){.  i
8ee0: 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 53  nt iDb;.  int iS
8ef0: 74 61 74 43 75 72 3b 0a 0a 20 20 61 73 73 65 72  tatCur;..  asser
8f00: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
8f10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
8f20: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
8f30: 78 65 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20  xes(pParse->db) 
8f40: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
8f50: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
8f60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
8f70: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
8f80: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
8f90: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
8fa0: 20 30 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61   0, iDb);.  iSta
8fb0: 74 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tCur = pParse->n
8fc0: 54 61 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  Tab;.  pParse->n
8fd0: 54 61 62 20 2b 3d 20 33 3b 0a 20 20 69 66 28 20  Tab += 3;.  if( 
8fe0: 70 4f 6e 6c 79 49 64 78 20 29 7b 0a 20 20 20 20  pOnlyIdx ){.    
8ff0: 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50  openStatTable(pP
9000: 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74  arse, iDb, iStat
9010: 43 75 72 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a  Cur, pOnlyIdx->z
9020: 4e 61 6d 65 2c 20 22 69 64 78 22 29 3b 0a 20 20  Name, "idx");.  
9030: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 65 6e 53  }else{.    openS
9040: 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  tatTable(pParse,
9050: 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20   iDb, iStatCur, 
9060: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62  pTab->zName, "tb
9070: 6c 22 29 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c 79  l");.  }.  analy
9080: 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73  zeOneTable(pPars
9090: 65 2c 20 70 54 61 62 2c 20 70 4f 6e 6c 79 49 64  e, pTab, pOnlyId
90a0: 78 2c 20 69 53 74 61 74 43 75 72 2c 20 70 50 61  x, iStatCur, pPa
90b0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20  rse->nMem+1);.  
90c0: 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61  loadAnalysis(pPa
90d0: 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  rse, iDb);.}../*
90e0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
90f0: 65 20 66 6f 72 20 74 68 65 20 41 4e 41 4c 59 5a  e for the ANALYZ
9100: 45 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20  E command.  The 
9110: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
9120: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 68 65  s routine.** whe
9130: 6e 20 69 74 20 72 65 63 6f 67 6e 69 7a 65 73 20  n it recognizes 
9140: 61 6e 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  an ANALYZE comma
9150: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  nd..**.**       
9160: 20 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20   ANALYZE        
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20      -- 1.**     
9190: 20 20 20 41 4e 41 4c 59 5a 45 20 20 3c 64 61 74     ANALYZE  <dat
91a0: 61 62 61 73 65 3e 20 20 20 20 20 20 20 20 20 20  abase>          
91b0: 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20        -- 2.**   
91c0: 20 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3f 3c       ANALYZE  ?<
91d0: 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c  database>.?<tabl
91e0: 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 0a  ename>  -- 3.**.
91f0: 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
9200: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
9210: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
9220: 61 62 61 73 65 73 20 74 6f 20 62 65 20 61 6e 61  abases to be ana
9230: 6c 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 32  lyzed..** Form 2
9240: 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e   analyzes all in
9250: 64 69 63 65 73 20 74 68 65 20 73 69 6e 67 6c 65  dices the single
9260: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 2e   database named.
9270: 0a 2a 2a 20 46 6f 72 6d 20 33 20 61 6e 61 6c 79  .** Form 3 analy
9280: 7a 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  zes all indices 
9290: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
92a0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
92b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
92c0: 41 6e 61 6c 79 7a 65 28 50 61 72 73 65 20 2a 70  Analyze(Parse *p
92d0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
92e0: 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
92f0: 6d 65 32 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  me2){.  sqlite3 
9300: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9310: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69  ;.  int iDb;.  i
9320: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 2c  nt i;.  char *z,
9330: 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a   *zDb;.  Table *
9340: 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
9350: 49 64 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  Idx;.  Token *pT
9360: 61 62 6c 65 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  ableName;..  /* 
9370: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
9380: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
9390: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
93a0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
93b0: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
93c0: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
93d0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
93e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
93f0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
9400: 75 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64  utexes(pParse->d
9410: 62 29 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  b) );.  if( SQLI
9420: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
9430: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
9440: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
9450: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
9460: 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70 4e 61 6d  Name2!=0 || pNam
9470: 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  e1==0 );.  if( p
9480: 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
9490: 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41 6e 61 6c  /* Form 1:  Anal
94a0: 79 7a 65 20 65 76 65 72 79 74 68 69 6e 67 20 2a  yze everything *
94b0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
94c0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
94d0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29        if( i==1 )
94e0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 44   continue;  /* D
94f0: 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65 20 74 68  o not analyze th
9500: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
9510: 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c 79 7a 65  */.      analyze
9520: 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 2c  Database(pParse,
9530: 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   i);.    }.  }el
9540: 73 65 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e  se if( pName2->n
9550: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f  ==0 ){.    /* Fo
9560: 72 6d 20 32 3a 20 20 41 6e 61 6c 79 7a 65 20 74  rm 2:  Analyze t
9570: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 74  he database or t
9580: 61 62 6c 65 20 6e 61 6d 65 64 20 2a 2f 0a 20 20  able named */.  
9590: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
95a0: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
95b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d  );.    if( iDb>=
95c0: 30 20 29 7b 0a 20 20 20 20 20 20 61 6e 61 6c 79  0 ){.      analy
95d0: 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73  zeDatabase(pPars
95e0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 65 6c  e, iDb);.    }el
95f0: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
9600: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9610: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  en(db, pName1);.
9620: 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20        if( z ){. 
9630: 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78         if( (pIdx
9640: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
9650: 64 65 78 28 64 62 2c 20 7a 2c 20 30 29 29 21 3d  dex(db, z, 0))!=
9660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
9670: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61 72  nalyzeTable(pPar
9680: 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  se, pIdx->pTable
9690: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
96a0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61 62   }else if( (pTab
96b0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
96c0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
96d0: 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20   z, 0))!=0 ){.  
96e0: 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54          analyzeT
96f0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
9700: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, 0);.        }
9710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9720: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
9730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9740: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
9750: 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20 74 68 65  m 3: Analyze the
9760: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
9770: 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
9780: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
9790: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
97a0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
97b0: 65 32 2c 20 26 70 54 61 62 6c 65 4e 61 6d 65 29  e2, &pTableName)
97c0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30  ;.    if( iDb>=0
97d0: 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   ){.      zDb = 
97e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
97f0: 6d 65 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  me;.      z = sq
9800: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9810: 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d  en(db, pTableNam
9820: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20  e);.      if( z 
9830: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
9840: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
9850: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
9860: 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Db))!=0 ){.     
9870: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
9880: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
9890: 70 54 61 62 6c 65 2c 20 70 49 64 78 29 3b 0a 20  pTable, pIdx);. 
98a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
98b0: 20 28 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33   (pTab = sqlite3
98c0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
98d0: 73 65 2c 20 30 2c 20 7a 2c 20 7a 44 62 29 29 21  se, 0, z, zDb))!
98e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
98f0: 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61  analyzeTable(pPa
9900: 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
9910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9920: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9930: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, z);.      }. 
9940: 20 20 20 7d 20 20 20 0a 20 20 7d 0a 7d 0a 0a 2f     }   .  }.}../
9950: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 61 73  *.** Used to pas
9960: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  s information fr
9970: 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a 65 72 20  om the analyzer 
9980: 72 65 61 64 65 72 20 74 68 72 6f 75 67 68 20 74  reader through t
9990: 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 62 61 63  o the.** callbac
99a0: 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  k routine..*/.ty
99b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 61 6e 61  pedef struct ana
99c0: 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61 6c 79 73  lysisInfo analys
99d0: 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 61  isInfo;.struct a
99e0: 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b 0a 20 20  nalysisInfo {.  
99f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
9a00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
9a10: 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  base;.};../*.** 
9a20: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
9a30: 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  nt points to a n
9a40: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
9a50: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
9a60: 61 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 73 70 61  a.** list of spa
9a70: 63 65 20 73 65 70 61 72 61 74 65 64 20 69 6e 74  ce separated int
9a80: 65 67 65 72 73 2e 20 52 65 61 64 20 74 68 65 20  egers. Read the 
9a90: 66 69 72 73 74 20 6e 4f 75 74 20 6f 66 20 74 68  first nOut of th
9aa0: 65 73 65 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ese into.** the 
9ab0: 61 72 72 61 79 20 61 4f 75 74 5b 5d 2e 0a 2a 2f  array aOut[]..*/
9ac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63  .static void dec
9ad0: 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 63  odeIntArray(.  c
9ae0: 68 61 72 20 2a 7a 49 6e 74 41 72 72 61 79 2c 20  har *zIntArray, 
9af0: 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20  .  int nOut, .  
9b00: 74 52 6f 77 63 6e 74 20 2a 61 4f 75 74 2c 20 0a  tRowcnt *aOut, .
9b10: 20 20 69 6e 74 20 2a 70 62 55 6e 6f 72 64 65 72    int *pbUnorder
9b20: 65 64 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20  ed.){.  char *z 
9b30: 3d 20 7a 49 6e 74 41 72 72 61 79 3b 0a 20 20 69  = zIntArray;.  i
9b40: 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt c;.  int i;. 
9b50: 20 74 52 6f 77 63 6e 74 20 76 3b 0a 0a 20 20 61   tRowcnt v;..  a
9b60: 73 73 65 72 74 28 20 70 62 55 6e 6f 72 64 65 72  ssert( pbUnorder
9b70: 65 64 3d 3d 30 20 7c 7c 20 2a 70 62 55 6e 6f 72  ed==0 || *pbUnor
9b80: 64 65 72 65 64 3d 3d 30 20 29 3b 0a 0a 20 20 66  dered==0 );..  f
9b90: 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26 20 69 3c  or(i=0; *z && i<
9ba0: 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOut; i++){.    
9bb0: 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  v = 0;.    while
9bc0: 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20  ( (c=z[0])>='0' 
9bd0: 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20  && c<='9' ){.   
9be0: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 63 20     v = v*10 + c 
9bf0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b  - '0';.      z++
9c00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 75 74  ;.    }.    aOut
9c10: 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69 66 28  [i] = v;.    if(
9c20: 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a   *z==' ' ) z++;.
9c30: 20 20 7d 0a 20 20 69 66 28 20 70 62 55 6e 6f 72    }.  if( pbUnor
9c40: 64 65 72 65 64 20 26 26 20 73 74 72 63 6d 70 28  dered && strcmp(
9c50: 7a 2c 20 22 75 6e 6f 72 64 65 72 65 64 22 29 3d  z, "unordered")=
9c60: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 62 55 6e 6f  =0 ){.    *pbUno
9c70: 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  rdered = 1;.  }.
9c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61  }../*.** This ca
9c90: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
9ca0: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
9cb0: 69 6e 64 65 78 20 77 68 65 6e 20 72 65 61 64 69  index when readi
9cc0: 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
9cd0: 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20 20 0a  _stat1 table.  .
9ce0: 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30  **.**     argv[0
9cf0: 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ] = name of the 
9d00: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 61 72 67  table.**     arg
9d10: 76 5b 31 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74  v[1] = name of t
9d20: 68 65 20 69 6e 64 65 78 20 28 6d 69 67 68 74 20  he index (might 
9d30: 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 20 20 20 20  be NULL).**     
9d40: 61 72 67 76 5b 32 5d 20 3d 20 72 65 73 75 6c 74  argv[2] = result
9d50: 73 20 6f 66 20 61 6e 61 6c 79 73 69 73 20 2d 20  s of analysis - 
9d60: 6f 6e 20 69 6e 74 65 67 65 72 20 66 6f 72 20 65  on integer for e
9d70: 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  ach column.**.**
9d80: 20 45 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69   Entries for whi
9d90: 63 68 20 61 72 67 76 5b 31 5d 3d 3d 4e 55 4c 4c  ch argv[1]==NULL
9da0: 20 73 69 6d 70 6c 79 20 72 65 63 6f 72 64 20 74   simply record t
9db0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9dc0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c  s in.** the tabl
9dd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9de0: 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 28   analysisLoader(
9df0: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
9e00: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
9e10: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
9e20: 65 64 29 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49  ed){.  analysisI
9e30: 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 28 61 6e  nfo *pInfo = (an
9e40: 61 6c 79 73 69 73 49 6e 66 6f 2a 29 70 44 61 74  alysisInfo*)pDat
9e50: 61 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  a;.  Index *pInd
9e60: 65 78 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ex;.  Table *pTa
9e70: 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
9e80: 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
9e90: 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e   argc==3 );.  UN
9ea0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
9eb0: 4e 6f 74 55 73 65 64 2c 20 61 72 67 63 29 3b 0a  NotUsed, argc);.
9ec0: 0a 20 20 69 66 28 20 61 72 67 76 3d 3d 30 20 7c  .  if( argv==0 |
9ed0: 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20  | argv[0]==0 || 
9ee0: 61 72 67 76 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20  argv[2]==0 ){.  
9ef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9f00: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
9f10: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 49 6e 66  e3FindTable(pInf
9f20: 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20  o->db, argv[0], 
9f30: 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65  pInfo->zDatabase
9f40: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
9f50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9f60: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72   0;.  }.  if( ar
9f70: 67 76 5b 31 5d 20 29 7b 0a 20 20 20 20 70 49 6e  gv[1] ){.    pIn
9f80: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
9f90: 64 49 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62  dIndex(pInfo->db
9fa0: 2c 20 61 72 67 76 5b 31 5d 2c 20 70 49 6e 66 6f  , argv[1], pInfo
9fb0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
9fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65  }else{.    pInde
9fd0: 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 20 3d  x = 0;.  }.  z =
9fe0: 20 61 72 67 76 5b 32 5d 3b 0a 0a 20 20 69 66 28   argv[2];..  if(
9ff0: 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69   pIndex ){.    i
a000: 6e 74 20 62 55 6e 6f 72 64 65 72 65 64 20 3d 20  nt bUnordered = 
a010: 30 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74  0;.    decodeInt
a020: 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20  Array((char*)z, 
a030: 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pIndex->nColumn+
a040: 31 2c 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  1, pIndex->aiRow
a050: 45 73 74 2c 20 26 62 55 6e 6f 72 64 65 72 65 64  Est, &bUnordered
a060: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
a070: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
a080: 3d 3d 30 20 29 20 70 54 61 62 6c 65 2d 3e 6e 52  ==0 ) pTable->nR
a090: 6f 77 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e  owEst = pIndex->
a0a0: 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
a0b0: 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
a0c0: 72 65 64 20 3d 20 62 55 6e 6f 72 64 65 72 65 64  red = bUnordered
a0d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
a0e0: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
a0f0: 68 61 72 2a 29 7a 2c 20 31 2c 20 26 70 54 61 62  har*)z, 1, &pTab
a100: 6c 65 2d 3e 6e 52 6f 77 45 73 74 2c 20 30 29 3b  le->nRowEst, 0);
a110: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
a120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
a130: 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 20  e Index.aSample 
a140: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
a150: 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65  NULL, delete the
a160: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
a170: 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  .** and its cont
a180: 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
a190: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
a1a0: 53 61 6d 70 6c 65 73 28 73 71 6c 69 74 65 33 20  Samples(sqlite3 
a1b0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
a1c0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
a1d0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20  _ENABLE_STAT4.  
a1e0: 69 66 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  if( pIdx->aSampl
a1f0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  e ){.    int j;.
a200: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a210: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 6a 2b  Idx->nSample; j+
a220: 2b 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 53  +){.      IndexS
a230: 61 6d 70 6c 65 20 2a 70 20 3d 20 26 70 49 64 78  ample *p = &pIdx
a240: 2d 3e 61 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20  ->aSample[j];.  
a250: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a260: 65 28 64 62 2c 20 70 2d 3e 70 29 3b 0a 20 20 20  e(db, p->p);.   
a270: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
a280: 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 61  Free(db, pIdx->a
a290: 53 61 6d 70 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  Sample);.  }.  i
a2a0: 66 28 20 64 62 20 26 26 20 64 62 2d 3e 70 6e 42  f( db && db->pnB
a2b0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
a2c0: 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c      pIdx->nSampl
a2d0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 2d  e = 0;.    pIdx-
a2e0: 3e 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20  >aSample = 0;.  
a2f0: 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
a300: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
a310: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a320: 45 52 28 70 49 64 78 29 3b 0a 23 65 6e 64 69 66  ER(pIdx);.#endif
a330: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
a340: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f  E_ENABLE_STAT4./
a350: 2a 0a 2a 2a 20 4c 6f 61 64 20 63 6f 6e 74 65 6e  *.** Load conten
a360: 74 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  t from the sqlit
a370: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 20 69 6e  e_stat4 table in
a380: 74 6f 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61  to the Index.aSa
a390: 6d 70 6c 65 5b 5d 0a 2a 2a 20 61 72 72 61 79 73  mple[].** arrays
a3a0: 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e   of all indices.
a3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
a3c0: 6f 61 64 53 74 61 74 34 28 73 71 6c 69 74 65 33  oadStat4(sqlite3
a3d0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
a3e0: 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63   *zDb){.  int rc
a3f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a400: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
a410: 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75 62  t codes from sub
a420: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 73 71  routines */.  sq
a430: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
a440: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41  t = 0;      /* A
a450: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
a460: 62 65 69 6e 67 20 72 75 6e 20 2a 2f 0a 20 20 63  being run */.  c
a470: 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a490: 54 65 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20  Text of the SQL 
a4a0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 49  statement */.  I
a4b0: 6e 64 65 78 20 2a 70 50 72 65 76 49 64 78 20 3d  ndex *pPrevIdx =
a4c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
a4d0: 50 72 65 76 69 6f 75 73 20 69 6e 64 65 78 20 69  Previous index i
a4e0: 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  n the loop */.  
a4f0: 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a510: 20 73 6c 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61   slot in pIdx->a
a520: 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 6e 65 78  Sample[] for nex
a530: 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 49 6e  t sample */.  In
a540: 64 65 78 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70  dexSample *pSamp
a550: 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  le;         /* A
a560: 20 73 6c 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61   slot in pIdx->a
a570: 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 61  Sample[] */..  a
a580: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
a590: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30  side.bEnabled==0
a5a0: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
a5b0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
a5c0: 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20  "sqlite_stat4", 
a5d0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  zDb) ){.    retu
a5e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a5f0: 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  }..  zSql = sqli
a600: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
a610: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64        "SELECT id
a620: 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  x,count(*) FROM 
a630: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 22  %Q.sqlite_stat4"
a640: 0a 20 20 20 20 20 20 22 20 47 52 4f 55 50 20 42  .      " GROUP B
a650: 59 20 69 64 78 22 2c 20 7a 44 62 29 3b 0a 20 20  Y idx", zDb);.  
a660: 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20  if( !zSql ){.   
a670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a680: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
a690: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
a6a0: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
a6b0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
a6c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
a6d0: 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
a6e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77   return rc;..  w
a6f0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
a700: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
a710: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 68 61  E_ROW ){.    cha
a720: 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20  r *zIndex;   /* 
a730: 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20  Index name */.  
a740: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
a750: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a760: 74 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  the index object
a770: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 61 6d   */.    int nSam
a780: 70 6c 65 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ple;    /* Numbe
a790: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a  r of samples */.
a7a0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
a7b0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
a7c0: 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 2a  space required *
a7d0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
a7e0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
a7f0: 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  f space required
a800: 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74 20   */.    tRowcnt 
a810: 2a 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 7a 49  *pSpace;..    zI
a820: 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29 73  ndex = (char *)s
a830: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
a840: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
a850: 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20    if( zIndex==0 
a860: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a870: 6e 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65  nSample = sqlite
a880: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
a890: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 70 49 64 78  mt, 1);.    pIdx
a8a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
a8b0: 64 65 78 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20  dex(db, zIndex, 
a8c0: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49  zDb);.    if( pI
a8d0: 64 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  dx==0 ) continue
a8e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
a8f0: 64 78 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20 29  dx->nSample==0 )
a900: 3b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d  ;.    pIdx->nSam
a910: 70 6c 65 20 3d 20 6e 53 61 6d 70 6c 65 3b 0a 20  ple = nSample;. 
a920: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f     nByte = sizeo
a930: 66 28 49 6e 64 65 78 53 61 6d 70 6c 65 29 20 2a  f(IndexSample) *
a940: 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42   nSample;.    nB
a950: 79 74 65 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52  yte += sizeof(tR
a960: 6f 77 63 6e 74 29 20 2a 20 70 49 64 78 2d 3e 6e  owcnt) * pIdx->n
a970: 43 6f 6c 75 6d 6e 20 2a 20 33 20 2a 20 6e 53 61  Column * 3 * nSa
a980: 6d 70 6c 65 3b 0a 0a 20 20 20 20 70 49 64 78 2d  mple;..    pIdx-
a990: 3e 61 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74  >aSample = sqlit
a9a0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
a9b0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  b, nByte);.    p
a9c0: 49 64 78 2d 3e 61 76 67 45 71 20 3d 20 70 49 64  Idx->avgEq = pId
a9d0: 78 2d 3e 61 69 52 6f 77 45 73 74 5b 31 5d 3b 0a  x->aiRowEst[1];.
a9e0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53      if( pIdx->aS
a9f0: 61 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ample==0 ){.    
aa00: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
aa10: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
aa20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
aa30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
aa40: 70 53 70 61 63 65 20 3d 20 28 74 52 6f 77 63 6e  pSpace = (tRowcn
aa50: 74 2a 29 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c  t*)&pIdx->aSampl
aa60: 65 5b 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20  e[nSample];.    
aa70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
aa80: 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
aa90: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d        pIdx->aSam
aaa0: 70 6c 65 5b 69 5d 2e 61 6e 45 71 20 3d 20 70 53  ple[i].anEq = pS
aab0: 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20  pace; pSpace += 
aac0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
aad0: 20 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70       pIdx->aSamp
aae0: 6c 65 5b 69 5d 2e 61 6e 4c 74 20 3d 20 70 53 70  le[i].anLt = pSp
aaf0: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 70  ace; pSpace += p
ab00: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
ab10: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
ab20: 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20 70 53 70  e[i].anDLt = pSp
ab30: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 70  ace; pSpace += p
ab40: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
ab50: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
ab60: 28 28 75 38 2a 29 70 53 70 61 63 65 29 2d 6e 42  ((u8*)pSpace)-nB
ab70: 79 74 65 3d 3d 28 75 38 2a 29 28 70 49 64 78 2d  yte==(u8*)(pIdx-
ab80: 3e 61 53 61 6d 70 6c 65 29 20 29 3b 0a 20 20 7d  >aSample) );.  }
ab90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
aba0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
abb0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
abc0: 72 6e 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d  rn rc;..  zSql =
abd0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
abe0: 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45  db, .      "SELE
abf0: 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e  CT idx,neq,nlt,n
ac00: 64 6c 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20  dlt,sample FROM 
ac10: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 22  %Q.sqlite_stat4"
ac20: 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a  , zDb);.  if( !z
ac30: 53 71 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Sql ){.    retur
ac40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ac50: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
ac60: 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
ac70: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
ac80: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   0);.  sqlite3Db
ac90: 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a  Free(db, zSql);.
aca0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
acb0: 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20  n rc;..  while( 
acc0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
acd0: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
ace0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  ){.    char *zIn
acf0: 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20  dex;   /* Index 
ad00: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65  name */.    Inde
ad10: 78 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20 50  x *pIdx;    /* P
ad20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69 6e  ointer to the in
ad30: 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
ad40: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
ad50: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ad60: 72 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e 74  r */.    tRowcnt
ad70: 20 73 75 6d 45 71 3b 20 20 2f 2a 20 53 75 6d 20   sumEq;  /* Sum 
ad80: 6f 66 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65  of the nEq value
ad90: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  s */.    int nCo
ada0: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  l;       /* Numb
adb0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
adc0: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 7a   index */..    z
add0: 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20 2a 29  Index = (char *)
ade0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
adf0: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
ae00: 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d 3d 30     if( zIndex==0
ae10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ae20: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46   pIdx = sqlite3F
ae30: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 49 6e  indIndex(db, zIn
ae40: 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  dex, zDb);.    i
ae50: 66 28 20 70 49 64 78 3d 3d 30 20 29 20 63 6f 6e  f( pIdx==0 ) con
ae60: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
ae70: 49 64 78 3d 3d 70 50 72 65 76 49 64 78 20 29 7b  Idx==pPrevIdx ){
ae80: 0a 20 20 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20  .      idx++;.  
ae90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
aea0: 50 72 65 76 49 64 78 20 3d 20 70 49 64 78 3b 0a  PrevIdx = pIdx;.
aeb0: 20 20 20 20 20 20 69 64 78 20 3d 20 30 3b 0a 20        idx = 0;. 
aec0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
aed0: 20 69 64 78 3c 70 49 64 78 2d 3e 6e 53 61 6d 70   idx<pIdx->nSamp
aee0: 6c 65 20 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c  le );.    pSampl
aef0: 65 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70  e = &pIdx->aSamp
af00: 6c 65 5b 69 64 78 5d 3b 0a 0a 20 20 20 20 6e 43  le[idx];..    nC
af10: 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
af20: 6d 6e 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  mn;.    decodeIn
af30: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73 71  tArray((char*)sq
af40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
af50: 74 28 70 53 74 6d 74 2c 31 29 2c 20 6e 43 6f 6c  t(pStmt,1), nCol
af60: 2c 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 2c  , pSample->anEq,
af70: 20 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65 49   0);.    decodeI
af80: 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73  ntArray((char*)s
af90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
afa0: 78 74 28 70 53 74 6d 74 2c 32 29 2c 20 6e 43 6f  xt(pStmt,2), nCo
afb0: 6c 2c 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74  l, pSample->anLt
afc0: 2c 20 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65  , 0);.    decode
afd0: 49 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29  IntArray((char*)
afe0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
aff0: 65 78 74 28 70 53 74 6d 74 2c 33 29 2c 20 6e 43  ext(pStmt,3), nC
b000: 6f 6c 2c 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 44  ol, pSample->anD
b010: 4c 74 2c 30 29 3b 0a 0a 20 20 20 20 69 66 28 20  Lt,0);..    if( 
b020: 69 64 78 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  idx==pIdx->nSamp
b030: 6c 65 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  le-1 ){.      if
b040: 28 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74  ( pSample->anDLt
b050: 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [0]>0 ){.       
b060: 20 66 6f 72 28 69 3d 30 2c 20 73 75 6d 45 71 3d   for(i=0, sumEq=
b070: 30 3b 20 69 3c 3d 69 64 78 2d 31 3b 20 69 2b 2b  0; i<=idx-1; i++
b080: 29 20 73 75 6d 45 71 20 2b 3d 20 70 49 64 78 2d  ) sumEq += pIdx-
b090: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71  >aSample[i].anEq
b0a0: 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [0];.        pId
b0b0: 78 2d 3e 61 76 67 45 71 20 3d 20 28 70 53 61 6d  x->avgEq = (pSam
b0c0: 70 6c 65 2d 3e 61 6e 4c 74 5b 30 5d 20 2d 20 73  ple->anLt[0] - s
b0d0: 75 6d 45 71 29 2f 70 53 61 6d 70 6c 65 2d 3e 61  umEq)/pSample->a
b0e0: 6e 44 4c 74 5b 30 5d 3b 0a 20 20 20 20 20 20 7d  nDLt[0];.      }
b0f0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
b100: 3e 61 76 67 45 71 3c 3d 30 20 29 20 70 49 64 78  >avgEq<=0 ) pIdx
b110: 2d 3e 61 76 67 45 71 20 3d 20 31 3b 0a 20 20 20  ->avgEq = 1;.   
b120: 20 7d 0a 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d   }..    pSample-
b130: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  >n = sqlite3_col
b140: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
b150: 20 34 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65   4);.    pSample
b160: 2d 3e 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ->p = sqlite3DbM
b170: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 70 53  allocZero(db, pS
b180: 61 6d 70 6c 65 2d 3e 6e 29 3b 0a 20 20 20 20 69  ample->n);.    i
b190: 66 28 20 70 53 61 6d 70 6c 65 2d 3e 70 3d 3d 30  f( pSample->p==0
b1a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b1b0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
b1c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b1d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b1e0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
b1f0: 53 61 6d 70 6c 65 2d 3e 70 2c 20 73 71 6c 69 74  Sample->p, sqlit
b200: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
b210: 53 74 6d 74 2c 20 34 29 2c 20 70 53 61 6d 70 6c  Stmt, 4), pSampl
b220: 65 2d 3e 6e 29 3b 0a 0a 20 20 7d 0a 20 20 72 65  e->n);..  }.  re
b230: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e  turn sqlite3_fin
b240: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
b250: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b260: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 2a 2f  _ENABLE_STAT4 */
b270: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
b280: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
b290: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64  sqlite_stat1 and
b2a0: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61   sqlite_stat4 ta
b2b0: 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e  bles. The.** con
b2c0: 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f  tents of sqlite_
b2d0: 73 74 61 74 31 20 61 72 65 20 75 73 65 64 20 74  stat1 are used t
b2e0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 49  o populate the I
b2f0: 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a  ndex.aiRowEst[].
b300: 2a 2a 20 61 72 72 61 79 73 2e 20 54 68 65 20 63  ** arrays. The c
b310: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74  ontents of sqlit
b320: 65 5f 73 74 61 74 34 20 61 72 65 20 75 73 65 64  e_stat4 are used
b330: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
b340: 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c  .** Index.aSampl
b350: 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a  e[] arrays..**.*
b360: 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f  * If the sqlite_
b370: 73 74 61 74 31 20 74 61 62 6c 65 20 69 73 20 6e  stat1 table is n
b380: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ot present in th
b390: 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49  e database, SQLI
b3a0: 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73 20 72  TE_ERROR.** is r
b3b0: 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
b3c0: 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66 20 53   case, even if S
b3d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
b3e0: 54 34 20 77 61 73 20 64 65 66 69 6e 65 64 20 0a  T4 was defined .
b3f0: 2a 2a 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c  ** during compil
b400: 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 71  ation and the sq
b410: 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65  lite_stat4 table
b420: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6e 6f 20   is present, no 
b430: 64 61 74 61 20 69 73 20 0a 2a 2a 20 72 65 61 64  data is .** read
b440: 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a 20   from it..**.** 
b450: 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  If SQLITE_ENABLE
b460: 5f 53 54 41 54 34 20 77 61 73 20 64 65 66 69 6e  _STAT4 was defin
b470: 65 64 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c  ed during compil
b480: 61 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 0a 2a  ation and the .*
b490: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74  * sqlite_stat4 t
b4a0: 61 62 6c 65 20 69 73 20 6e 6f 74 20 70 72 65 73  able is not pres
b4b0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
b4c0: 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  ase, SQLITE_ERRO
b4d0: 52 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  R is.** returned
b4e0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e 20 74 68  . However, in th
b4f0: 69 73 20 63 61 73 65 2c 20 64 61 74 61 20 69 73  is case, data is
b500: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
b510: 71 6c 69 74 65 5f 73 74 61 74 31 0a 2a 2a 20 74  qlite_stat1.** t
b520: 61 62 6c 65 20 28 69 66 20 69 74 20 69 73 20 70  able (if it is p
b530: 72 65 73 65 6e 74 29 20 62 65 66 6f 72 65 20 72  resent) before r
b540: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
b550: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
b560: 6f 63 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e  occurs, this fun
b570: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 65 74  ction always set
b580: 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  s db->mallocFail
b590: 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e  ed..** This mean
b5a0: 73 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  s if the caller 
b5b0: 64 6f 65 73 20 6e 6f 74 20 63 61 72 65 20 61 62  does not care ab
b5c0: 6f 75 74 20 6f 74 68 65 72 20 65 72 72 6f 72 73  out other errors
b5d0: 2c 20 74 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  , the return.** 
b5e0: 63 6f 64 65 20 6d 61 79 20 62 65 20 69 67 6e 6f  code may be igno
b5f0: 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
b600: 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28  te3AnalysisLoad(
b610: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b620: 20 69 44 62 29 7b 0a 20 20 61 6e 61 6c 79 73 69   iDb){.  analysi
b630: 73 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a 20 20 48  sInfo sInfo;.  H
b640: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 63 68  ashElem *i;.  ch
b650: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
b660: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rc;..  assert( i
b670: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
b680: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
b690: 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
b6a0: 42 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  Bt!=0 );..  /* C
b6b0: 6c 65 61 72 20 61 6e 79 20 70 72 69 6f 72 20 73  lear any prior s
b6c0: 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 61  tatistics */.  a
b6d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
b6e0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
b6f0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66  , iDb, 0) );.  f
b700: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
b710: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44  irst(&db->aDb[iD
b720: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
b730: 61 73 68 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48  ash);i;i=sqliteH
b740: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
b750: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
b760: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
b770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 66  ;.    sqlite3Def
b780: 61 75 6c 74 52 6f 77 45 73 74 28 70 49 64 78 29  aultRowEst(pIdx)
b790: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b7a0: 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 20  ENABLE_STAT4.   
b7b0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
b7c0: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
b7d0: 49 64 78 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  Idx);.    pIdx->
b7e0: 61 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 23 65 6e  aSample = 0;.#en
b7f0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  dif.  }..  /* Ch
b800: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
b810: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
b820: 31 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 2a  1 table exists *
b830: 2f 0a 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20 64  /.  sInfo.db = d
b840: 62 3b 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61  b;.  sInfo.zData
b850: 62 61 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69  base = db->aDb[i
b860: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  Db].zName;.  if(
b870: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
b880: 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
b890: 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74  at1", sInfo.zDat
b8a0: 61 62 61 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20  abase)==0 ){.   
b8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
b8c0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
b8d0: 4c 6f 61 64 20 6e 65 77 20 73 74 61 74 69 73 74  Load new statist
b8e0: 69 63 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ics out of the s
b8f0: 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
b900: 65 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d 20 73 71  e */.  zSql = sq
b910: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b920: 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
b930: 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52 4f  tbl,idx,stat FRO
b940: 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74  M %Q.sqlite_stat
b950: 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62  1", sInfo.zDatab
b960: 61 73 65 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  ase);.  if( zSql
b970: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
b980: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b990: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
b9a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
b9b0: 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c   zSql, analysisL
b9c0: 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30  oader, &sInfo, 0
b9d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
b9e0: 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a  Free(db, zSql);.
b9f0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20    }...  /* Load 
ba00: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20 66  the statistics f
ba10: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
ba20: 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23  tat4 table. */.#
ba30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ba40: 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 66 28 20  BLE_STAT4.  if( 
ba50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ba60: 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b 61 73 69  .    int lookasi
ba70: 64 65 45 6e 61 62 6c 65 64 20 3d 20 64 62 2d 3e  deEnabled = db->
ba80: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
ba90: 65 64 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ed;.    db->look
baa0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
bab0: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61   0;.    rc = loa
bac0: 64 53 74 61 74 34 28 64 62 2c 20 73 49 6e 66 6f  dStat4(db, sInfo
bad0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
bae0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
baf0: 45 6e 61 62 6c 65 64 20 3d 20 6c 6f 6f 6b 61 73  Enabled = lookas
bb00: 69 64 65 45 6e 61 62 6c 65 64 3b 0a 20 20 7d 0a  ideEnabled;.  }.
bb10: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
bb20: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
bb30: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
bb40: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
bb50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bb60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bb70: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20 2a  E_OMIT_ANALYZE *
bb80: 2f 0a                                            /.