/ Hex Artifact Content
Login

Artifact 844359e720d1116592234f2f7938432bdc5b6238:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 2d 30 37 2d 30 38  /*.** 2005-07-08
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e  ** This file con
0180: 74 61 69 6e 73 20 63 6f 64 65 20 61 73 73 6f 63  tains code assoc
0190: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 41  iated with the A
01a0: 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
01b0: 2a 2a 0a 2a 2a 20 54 68 65 20 41 4e 41 4c 59 5a  **.** The ANALYZ
01c0: 45 20 63 6f 6d 6d 61 6e 64 20 67 61 74 68 65 72  E command gather
01d0: 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f 75   statistics abou
01e0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
01f0: 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 69   tables.** and i
0200: 6e 64 69 63 65 73 2e 20 20 54 68 65 73 65 20 73  ndices.  These s
0210: 74 61 74 69 73 74 69 63 73 20 61 72 65 20 6d 61  tatistics are ma
0220: 64 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  de available to 
0230: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
0240: 72 0a 2a 2a 20 74 6f 20 68 65 6c 70 20 69 74 20  r.** to help it 
0250: 6d 61 6b 65 20 62 65 74 74 65 72 20 64 65 63 69  make better deci
0260: 73 69 6f 6e 73 20 61 62 6f 75 74 20 68 6f 77 20  sions about how 
0270: 74 6f 20 70 65 72 66 6f 72 6d 20 71 75 65 72 69  to perform queri
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  es..**.** The fo
0290: 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 74  llowing system t
02a0: 61 62 6c 65 73 20 61 72 65 20 6f 72 20 68 61 76  ables are or hav
02b0: 65 20 62 65 65 6e 20 73 75 70 70 6f 72 74 65 64  e been supported
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
02d0: 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73  E TABLE sqlite_s
02e0: 74 61 74 31 28 74 62 6c 2c 20 69 64 78 2c 20 73  tat1(tbl, idx, s
02f0: 74 61 74 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  tat);.**    CREA
0300: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0310: 73 74 61 74 32 28 74 62 6c 2c 20 69 64 78 2c 20  stat2(tbl, idx, 
0320: 73 61 6d 70 6c 65 6e 6f 2c 20 73 61 6d 70 6c 65  sampleno, sample
0330: 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  );.**    CREATE 
0340: 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 73 74 61  TABLE sqlite_sta
0350: 74 33 28 74 62 6c 2c 20 69 64 78 2c 20 6e 45 71  t3(tbl, idx, nEq
0360: 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20 73 61 6d  , nLt, nDLt, sam
0370: 70 6c 65 29 3b 0a 2a 2a 20 20 20 20 43 52 45 41  ple);.**    CREA
0380: 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  TE TABLE sqlite_
0390: 73 74 61 74 34 28 74 62 6c 2c 20 69 64 78 2c 20  stat4(tbl, idx, 
03a0: 6e 45 71 2c 20 6e 4c 74 2c 20 6e 44 4c 74 2c 20  nEq, nLt, nDLt, 
03b0: 73 61 6d 70 6c 65 29 3b 0a 2a 2a 0a 2a 2a 20 41  sample);.**.** A
03c0: 64 64 69 74 69 6f 6e 61 6c 20 74 61 62 6c 65 73  dditional tables
03d0: 20 6d 69 67 68 74 20 62 65 20 61 64 64 65 64 20   might be added 
03e0: 69 6e 20 66 75 74 75 72 65 20 72 65 6c 65 61 73  in future releas
03f0: 65 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  es of SQLite..**
0400: 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   The sqlite_stat
0410: 32 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 63  2 table is not c
0420: 72 65 61 74 65 64 20 6f 72 20 75 73 65 64 20 75  reated or used u
0430: 6e 6c 65 73 73 20 74 68 65 20 53 51 4c 69 74 65  nless the SQLite
0440: 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 69 73 20 62   version.** is b
0450: 65 74 77 65 65 6e 20 33 2e 36 2e 31 38 20 61 6e  etween 3.6.18 an
0460: 64 20 33 2e 37 2e 38 2c 20 69 6e 63 6c 75 73 69  d 3.7.8, inclusi
0470: 76 65 2c 20 61 6e 64 20 75 6e 6c 65 73 73 20 53  ve, and unless S
0480: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
0490: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
04a0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 2e 20 20  _ENABLE_STAT2.  
04b0: 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 32  The sqlite_stat2
04c0: 20 74 61 62 6c 65 20 69 73 20 64 65 70 72 65 63   table is deprec
04d0: 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ated..** The sql
04e0: 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65 20  ite_stat2 table 
04f0: 69 73 20 73 75 70 65 72 73 65 64 65 64 20 62 79  is superseded by
0500: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2c 20 77   sqlite_stat3, w
0510: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  hich is only.** 
0520: 63 72 65 61 74 65 64 20 61 6e 64 20 75 73 65 64  created and used
0530: 20 62 79 20 53 51 4c 69 74 65 20 76 65 72 73 69   by SQLite versi
0540: 6f 6e 73 20 33 2e 37 2e 39 20 61 6e 64 20 6c 61  ons 3.7.9 and la
0550: 74 65 72 20 61 6e 64 20 77 69 74 68 0a 2a 2a 20  ter and with.** 
0560: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
0570: 41 54 33 20 64 65 66 69 6e 65 64 2e 20 20 54 68  AT3 defined.  Th
0580: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
0590: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
05a0: 2a 2a 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ** is a superset
05b0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 32   of sqlite_stat2
05c0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74  .  The sqlite_st
05d0: 61 74 34 20 69 73 20 61 6e 20 65 6e 68 61 6e 63  at4 is an enhanc
05e0: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
05f0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e   sqlite_stat3 an
0600: 64 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  d is only availa
0610: 62 6c 65 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ble when compile
0620: 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45  d with.** SQLITE
0630: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 20 61 6e  _ENABLE_STAT4 an
0640: 64 20 69 6e 20 53 51 4c 69 74 65 20 76 65 72 73  d in SQLite vers
0650: 69 6f 6e 73 20 33 2e 38 2e 31 20 61 6e 64 20 6c  ions 3.8.1 and l
0660: 61 74 65 72 2e 20 20 49 74 20 69 73 0a 2a 2a 20  ater.  It is.** 
0670: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
0680: 65 6e 61 62 6c 65 20 62 6f 74 68 20 53 54 41 54  enable both STAT
0690: 33 20 61 6e 64 20 53 54 41 54 34 20 61 74 20 74  3 and STAT4 at t
06a0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 49  he same time.  I
06b0: 66 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 62 6f  f they.** are bo
06c0: 74 68 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  th enabled, then
06d0: 20 53 54 41 54 34 20 74 61 6b 65 73 20 70 72 65   STAT4 takes pre
06e0: 63 65 64 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  cedence..**.** F
06f0: 6f 72 20 6d 6f 73 74 20 61 70 70 6c 69 63 61 74  or most applicat
0700: 69 6f 6e 73 2c 20 73 71 6c 69 74 65 5f 73 74 61  ions, sqlite_sta
0710: 74 31 20 70 72 6f 76 69 64 65 73 20 61 6c 6c 20  t1 provides all 
0720: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20 72  the statistics r
0730: 65 71 75 69 72 65 64 0a 2a 2a 20 66 6f 72 20 74  equired.** for t
0740: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
0750: 20 74 6f 20 6d 61 6b 65 20 67 6f 6f 64 20 63 68   to make good ch
0760: 6f 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  oices..**.** For
0770: 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  mat of sqlite_st
0780: 61 74 31 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  at1:.**.** There
0790: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e 65   is normally one
07a0: 20 72 6f 77 20 70 65 72 20 69 6e 64 65 78 2c 20   row per index, 
07b0: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 69  with the index i
07c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
07d0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
07e0: 69 64 78 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  idx column.  The
07f0: 20 74 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74   tbl column is t
0800: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0810: 61 62 6c 65 20 74 6f 0a 2a 2a 20 77 68 69 63 68  able to.** which
0820: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0830: 67 73 2e 20 20 49 6e 20 65 61 63 68 20 73 75 63  gs.  In each suc
0840: 68 20 72 6f 77 2c 20 74 68 65 20 73 74 61 74 20  h row, the stat 
0850: 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 62 65 0a 2a  column will be.*
0860: 2a 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 69  * a string consi
0870: 73 74 69 6e 67 20 6f 66 20 61 20 6c 69 73 74 20  sting of a list 
0880: 6f 66 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68  of integers.  Th
0890: 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
08a0: 69 6e 20 74 68 69 73 0a 2a 2a 20 6c 69 73 74 20  in this.** list 
08b0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
08c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
08d0: 65 78 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  ex.  (This is th
08e0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
08f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0900: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 65 78  in the table, ex
0910: 63 65 70 74 20 66 6f 72 20 70 61 72 74 69 61 6c  cept for partial
0920: 20 69 6e 64 69 63 65 73 2e 29 20 20 54 68 65 20   indices.)  The 
0930: 73 65 63 6f 6e 64 0a 2a 2a 20 69 6e 74 65 67 65  second.** intege
0940: 72 20 69 73 20 74 68 65 20 61 76 65 72 61 67 65  r is the average
0950: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0960: 69 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  in the index tha
0970: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 0a  t have the same.
0980: 2a 2a 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ** value in the 
0990: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
09a0: 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
09b0: 74 68 69 72 64 20 69 6e 74 65 67 65 72 20 69 73  third integer is
09c0: 20 74 68 65 20 61 76 65 72 61 67 65 0a 2a 2a 20   the average.** 
09d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
09e0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
09f0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 76   have the same v
0a00: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 72  alue for the fir
0a10: 73 74 20 74 77 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e  st two.** column
0a20: 73 2e 20 20 54 68 65 20 4e 2d 74 68 20 69 6e 74  s.  The N-th int
0a30: 65 67 65 72 20 28 66 6f 72 20 4e 3e 31 29 20 69  eger (for N>1) i
0a40: 73 20 74 68 65 20 61 76 65 72 61 67 65 20 6e 75  s the average nu
0a50: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0a60: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 77 68  .** the index wh
0a70: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 61 6d  ich have the sam
0a80: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
0a90: 66 69 72 73 74 20 4e 2d 31 20 63 6f 6c 75 6d 6e  first N-1 column
0aa0: 73 2e 20 20 46 6f 72 0a 2a 2a 20 61 20 4b 2d 63  s.  For.** a K-c
0ab0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2c 20 74 68 65  olumn index, the
0ac0: 72 65 20 77 69 6c 6c 20 62 65 20 4b 2b 31 20 69  re will be K+1 i
0ad0: 6e 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73  ntegers in the s
0ae0: 74 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 0a  tat column.  If.
0af0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
0b00: 75 6e 69 71 75 65 2c 20 74 68 65 6e 20 74 68 65  unique, then the
0b10: 20 6c 61 73 74 20 69 6e 74 65 67 65 72 20 77 69   last integer wi
0b20: 6c 6c 20 62 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 54  ll be 1..**.** T
0b30: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67  he list of integ
0b40: 65 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 20  ers in the stat 
0b50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 6f 70 74 69 6f  column can optio
0b60: 6e 61 6c 6c 79 20 62 65 20 66 6f 6c 6c 6f 77 65  nally be followe
0b70: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6b 65 79 77  d.** by the keyw
0b80: 6f 72 64 20 22 75 6e 6f 72 64 65 72 65 64 22 2e  ord "unordered".
0b90: 20 20 54 68 65 20 22 75 6e 6f 72 64 65 72 65 64    The "unordered
0ba0: 22 20 6b 65 79 77 6f 72 64 2c 20 69 66 20 69 74  " keyword, if it
0bb0: 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 2a 2a 20   is present,.** 
0bc0: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
0bd0: 64 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  d from the last 
0be0: 69 6e 74 65 67 65 72 20 62 79 20 61 20 73 69 6e  integer by a sin
0bf0: 67 6c 65 20 73 70 61 63 65 2e 20 20 49 66 20 74  gle space.  If t
0c00: 68 65 0a 2a 2a 20 22 75 6e 6f 72 64 65 72 65 64  he.** "unordered
0c10: 22 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  " keyword is pre
0c20: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 71  sent, then the q
0c30: 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 61 73 73  uery planner ass
0c40: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
0c50: 20 69 6e 64 65 78 20 69 73 20 75 6e 6f 72 64 65   index is unorde
0c60: 72 65 64 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74  red and will not
0c70: 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 66   use the index f
0c80: 6f 72 20 61 20 72 61 6e 67 65 20 71 75 65 72 79  or a range query
0c90: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
0ca0: 73 71 6c 69 74 65 5f 73 74 61 74 31 2e 69 64 78  sqlite_stat1.idx
0cb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c   column is NULL,
0cc0: 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74 65   then the sqlite
0cd0: 5f 73 74 61 74 31 2e 73 74 61 74 0a 2a 2a 20 63  _stat1.stat.** c
0ce0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
0cf0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
0d00: 77 68 69 63 68 20 69 73 20 74 68 65 20 28 65 73  which is the (es
0d10: 74 69 6d 61 74 65 64 29 20 6e 75 6d 62 65 72 20  timated) number 
0d20: 6f 66 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68  of.** rows in th
0d30: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
0d40: 65 64 20 62 79 20 73 71 6c 69 74 65 5f 73 74 61  ed by sqlite_sta
0d50: 74 31 2e 74 62 6c 2e 0a 2a 2a 0a 2a 2a 20 46 6f  t1.tbl..**.** Fo
0d60: 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  rmat of sqlite_s
0d70: 74 61 74 32 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tat2:.**.** The 
0d80: 73 71 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20  sqlite_stat2 is 
0d90: 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  only created and
0da0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
0db0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
0dc0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
0dd0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 20  TE_ENABLE_STAT2 
0de0: 61 6e 64 20 69 66 20 74 68 65 20 53 51 4c 69 74  and if the SQLit
0df0: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
0e00: 20 69 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 33   is between.** 3
0e10: 2e 36 2e 31 38 20 61 6e 64 20 33 2e 37 2e 38 2e  .6.18 and 3.7.8.
0e20: 20 20 54 68 65 20 22 73 74 61 74 32 22 20 74 61    The "stat2" ta
0e30: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  ble contains add
0e40: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
0e50: 69 6f 6e 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  ion.** about the
0e60: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66   distribution of
0e70: 20 6b 65 79 73 20 77 69 74 68 69 6e 20 61 6e 20   keys within an 
0e80: 69 6e 64 65 78 2e 20 20 54 68 65 20 69 6e 64 65  index.  The inde
0e90: 78 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  x is identified 
0ea0: 62 79 0a 2a 2a 20 74 68 65 20 22 69 64 78 22 20  by.** the "idx" 
0eb0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 22  column and the "
0ec0: 74 62 6c 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74  tbl" column is t
0ed0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0ee0: 61 62 6c 65 20 74 6f 20 77 68 69 63 68 0a 2a 2a  able to which.**
0ef0: 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f 6e   the index belon
0f00: 67 73 2e 20 20 54 68 65 72 65 20 61 72 65 20 75  gs.  There are u
0f10: 73 75 61 6c 6c 79 20 31 30 20 72 6f 77 73 20 69  sually 10 rows i
0f20: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
0f30: 74 32 0a 2a 2a 20 74 61 62 6c 65 20 66 6f 72 20  t2.** table for 
0f40: 65 61 63 68 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  each index..**.*
0f50: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
0f60: 74 32 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  t2 entries for a
0f70: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 76  n index that hav
0f80: 65 20 73 61 6d 70 6c 65 6e 6f 20 62 65 74 77 65  e sampleno betwe
0f90: 65 6e 20 30 20 61 6e 64 20 39 0a 2a 2a 20 69 6e  en 0 and 9.** in
0fa0: 63 6c 75 73 69 76 65 20 61 72 65 20 73 61 6d 70  clusive are samp
0fb0: 6c 65 73 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  les of the left-
0fc0: 6d 6f 73 74 20 6b 65 79 20 76 61 6c 75 65 20 69  most key value i
0fd0: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 61 6b 65  n the index take
0fe0: 6e 20 61 74 0a 2a 2a 20 65 76 65 6e 6c 79 20 73  n at.** evenly s
0ff0: 70 61 63 65 64 20 70 6f 69 6e 74 73 20 61 6c 6f  paced points alo
1000: 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4c  ng the index.  L
1010: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
1020: 20 73 61 6d 70 6c 65 73 20 62 65 20 53 0a 2a 2a   samples be S.**
1030: 20 28 31 30 20 69 6e 20 74 68 65 20 73 74 61 6e   (10 in the stan
1040: 64 61 72 64 20 62 75 69 6c 64 29 20 61 6e 64 20  dard build) and 
1050: 6c 65 74 20 43 20 62 65 20 74 68 65 20 6e 75 6d  let C be the num
1060: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1070: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  he index..** The
1080: 6e 20 74 68 65 20 73 61 6d 70 6c 65 64 20 72 6f  n the sampled ro
1090: 77 73 20 61 72 65 20 67 69 76 65 6e 20 62 79 3a  ws are given by:
10a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 6f 77 6e 75  .**.**     rownu
10b0: 6d 62 65 72 20 3d 20 28 69 2a 43 2a 32 20 2b 20  mber = (i*C*2 + 
10c0: 43 29 2f 28 53 2a 32 29 0a 2a 2a 0a 2a 2a 20 46  C)/(S*2).**.** F
10d0: 6f 72 20 69 20 62 65 74 77 65 65 6e 20 30 20 61  or i between 0 a
10e0: 6e 64 20 53 2d 31 2e 20 20 43 6f 6e 63 65 70 74  nd S-1.  Concept
10f0: 75 61 6c 6c 79 2c 20 74 68 65 20 69 6e 64 65 78  ually, the index
1100: 20 73 70 61 63 65 20 69 73 20 64 69 76 69 64 65   space is divide
1110: 64 20 69 6e 74 6f 0a 2a 2a 20 53 20 75 6e 69 66  d into.** S unif
1120: 6f 72 6d 20 62 75 63 6b 65 74 73 20 61 6e 64 20  orm buckets and 
1130: 74 68 65 20 73 61 6d 70 6c 65 73 20 61 72 65 20  the samples are 
1140: 74 68 65 20 6d 69 64 64 6c 65 20 72 6f 77 20 66  the middle row f
1150: 72 6f 6d 20 65 61 63 68 20 62 75 63 6b 65 74 2e  rom each bucket.
1160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
1170: 74 20 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61  t for sqlite_sta
1180: 74 32 20 69 73 20 72 65 63 6f 72 64 65 64 20 68  t2 is recorded h
1190: 65 72 65 20 66 6f 72 20 6c 65 67 61 63 79 20 72  ere for legacy r
11a0: 65 66 65 72 65 6e 63 65 2e 20 20 54 68 69 73 0a  eference.  This.
11b0: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  ** version of SQ
11c0: 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  Lite does not su
11d0: 70 70 6f 72 74 20 73 71 6c 69 74 65 5f 73 74 61  pport sqlite_sta
11e0: 74 32 2e 20 20 49 74 20 6e 65 69 74 68 65 72 20  t2.  It neither 
11f0: 72 65 61 64 73 20 6e 6f 72 0a 2a 2a 20 77 72 69  reads nor.** wri
1200: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
1210: 74 61 74 32 20 74 61 62 6c 65 2e 20 20 54 68 69  tat2 table.  Thi
1220: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  s version of SQL
1230: 69 74 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ite only support
1240: 73 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74  s.** sqlite_stat
1250: 33 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20  3..**.** Format 
1260: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33  for sqlite_stat3
1270: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  :.**.** The sqli
1280: 74 65 5f 73 74 61 74 33 20 66 6f 72 6d 61 74 20  te_stat3 format 
1290: 69 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 73  is a subset of s
12a0: 71 6c 69 74 65 5f 73 74 61 74 34 2e 20 20 48 65  qlite_stat4.  He
12b0: 6e 63 65 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  nce, the.** sqli
12c0: 74 65 5f 73 74 61 74 34 20 66 6f 72 6d 61 74 20  te_stat4 format 
12d0: 77 69 6c 6c 20 62 65 20 64 65 73 63 72 69 62 65  will be describe
12e0: 64 20 66 69 72 73 74 2e 20 20 46 75 72 74 68 65  d first.  Furthe
12f0: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  r information.**
1300: 20 61 62 6f 75 74 20 73 71 6c 69 74 65 5f 73 74   about sqlite_st
1310: 61 74 33 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  at3 follows the 
1320: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 64 65 73  sqlite_stat4 des
1330: 63 72 69 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  cription..**.** 
1340: 46 6f 72 6d 61 74 20 66 6f 72 20 73 71 6c 69 74  Format for sqlit
1350: 65 5f 73 74 61 74 34 3a 0a 2a 2a 0a 2a 2a 20 41  e_stat4:.**.** A
1360: 73 20 77 69 74 68 20 73 71 6c 69 74 65 5f 73 74  s with sqlite_st
1370: 61 74 32 2c 20 74 68 65 20 73 71 6c 69 74 65 5f  at2, the sqlite_
1380: 73 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74  stat4 table cont
1390: 61 69 6e 73 20 68 69 73 74 6f 67 72 61 6d 20 64  ains histogram d
13a0: 61 74 61 0a 2a 2a 20 74 6f 20 61 69 64 20 74 68  ata.** to aid th
13b0: 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  e query planner 
13c0: 69 6e 20 63 68 6f 6f 73 69 6e 67 20 67 6f 6f 64  in choosing good
13d0: 20 69 6e 64 69 63 65 73 20 62 61 73 65 64 20 6f   indices based o
13e0: 6e 20 74 68 65 20 76 61 6c 75 65 73 0a 2a 2a 20  n the values.** 
13f0: 74 68 61 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  that indexed col
1400: 75 6d 6e 73 20 61 72 65 20 63 6f 6d 70 61 72 65  umns are compare
1410: 64 20 61 67 61 69 6e 73 74 20 69 6e 20 74 68 65  d against in the
1420: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f   WHERE clauses o
1430: 66 0a 2a 2a 20 71 75 65 72 69 65 73 2e 0a 2a 2a  f.** queries..**
1440: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73  .** The sqlite_s
1450: 74 61 74 34 20 74 61 62 6c 65 20 63 6f 6e 74 61  tat4 table conta
1460: 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 65 6e 74  ins multiple ent
1470: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ries for each in
1480: 64 65 78 2e 0a 2a 2a 20 54 68 65 20 69 64 78 20  dex..** The idx 
1490: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 68 65  column names the
14a0: 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20 74   index and the t
14b0: 62 6c 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  bl column is the
14c0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 0a 2a 2a   table of the.**
14d0: 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
14e0: 69 64 78 20 61 6e 64 20 74 62 6c 20 63 6f 6c 75  idx and tbl colu
14f0: 6d 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  mns are the same
1500: 2c 20 74 68 65 6e 20 74 68 65 20 73 61 6d 70 6c  , then the sampl
1510: 65 20 69 73 0a 2a 2a 20 6f 66 20 74 68 65 20 49  e is.** of the I
1520: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1530: 45 59 2e 20 20 54 68 65 20 73 61 6d 70 6c 65 20  EY.  The sample 
1540: 63 6f 6c 75 6d 6e 20 69 73 20 61 20 62 6c 6f 62  column is a blob
1550: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a   which is the.**
1560: 20 62 69 6e 61 72 79 20 65 6e 63 6f 64 69 6e 67   binary encoding
1570: 20 6f 66 20 61 20 6b 65 79 20 66 72 6f 6d 20 74   of a key from t
1580: 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 6e  he index.  The n
1590: 45 71 20 63 6f 6c 75 6d 6e 20 69 73 20 61 0a 2a  Eq column is a.*
15a0: 2a 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65  * list of intege
15b0: 72 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  rs.  The first i
15c0: 6e 74 65 67 65 72 20 69 73 20 74 68 65 20 61 70  nteger is the ap
15d0: 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
15e0: 0a 2a 2a 20 6f 66 20 65 6e 74 72 69 65 73 20 69  .** of entries i
15f0: 6e 20 74 68 65 20 69 6e 64 65 78 20 77 68 6f 73  n the index whos
1600: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
1610: 6d 6e 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  mn exactly match
1620: 65 73 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2d 6d  es.** the left-m
1630: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
1640: 65 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20 73  e sample.  The s
1650: 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 69 6e  econd integer in
1660: 20 6e 45 71 0a 2a 2a 20 69 73 20 74 68 65 20 61   nEq.** is the a
1670: 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
1680: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1690: 74 68 65 20 69 6e 64 65 78 20 77 68 65 72 65 20  the index where 
16a0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f  the.** first two
16b0: 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 74   columns match t
16c0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 6f 6c  he first two col
16d0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 70  umns of the samp
16e0: 6c 65 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  le..** And so fo
16f0: 72 74 68 2e 20 20 6e 4c 74 20 69 73 20 61 6e 6f  rth.  nLt is ano
1700: 74 68 65 72 20 6c 69 73 74 20 6f 66 20 69 6e 74  ther list of int
1710: 65 67 65 72 73 20 74 68 61 74 20 73 68 6f 77 20  egers that show 
1720: 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 0a  the approximate.
1730: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  ** number of ent
1740: 72 69 65 73 20 74 68 61 74 20 61 72 65 20 73 74  ries that are st
1750: 72 69 63 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rictly less than
1760: 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 20 54 68   the sample.  Th
1770: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 74 65 67  e first.** integ
1780: 65 72 20 69 6e 20 6e 4c 74 20 63 6f 6e 74 61 69  er in nLt contai
1790: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
17a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17b0: 69 6e 64 65 78 20 77 68 65 72 65 20 74 68 65 0a  index where the.
17c0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
17d0: 75 6d 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  umn is less than
17e0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63   the left-most c
17f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 61 6d  olumn of the sam
1800: 70 6c 65 2e 0a 2a 2a 20 54 68 65 20 4b 2d 74 68  ple..** The K-th
1810: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
1820: 6e 4c 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  nLt entry is the
1830: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   number of index
1840: 20 65 6e 74 72 69 65 73 20 0a 2a 2a 20 77 68 65   entries .** whe
1850: 72 65 20 74 68 65 20 66 69 72 73 74 20 4b 20 63  re the first K c
1860: 6f 6c 75 6d 6e 73 20 61 72 65 20 6c 65 73 73 20  olumns are less 
1870: 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 4b  than the first K
1880: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1890: 2a 2a 20 73 61 6d 70 6c 65 2e 20 20 54 68 65 20  ** sample.  The 
18a0: 6e 44 4c 74 20 63 6f 6c 75 6d 6e 20 69 73 20 6c  nDLt column is l
18b0: 69 6b 65 20 6e 4c 74 20 65 78 63 65 70 74 20 74  ike nLt except t
18c0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
18d0: 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f  the .** number o
18e0: 66 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 69  f distinct entri
18f0: 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  es in the index 
1900: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
1910: 61 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 70 6c 65  an the.** sample
1920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61  ..**.** There ca
1930: 6e 20 62 65 20 61 6e 20 61 72 62 69 74 72 61 72  n be an arbitrar
1940: 79 20 6e 75 6d 62 65 72 20 6f 66 20 73 71 6c 69  y number of sqli
1950: 74 65 5f 73 74 61 74 34 20 65 6e 74 72 69 65 73  te_stat4 entries
1960: 20 70 65 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 54   per index..** T
1970: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
1980: 6e 64 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  nd will typicall
1990: 79 20 67 65 6e 65 72 61 74 65 20 73 71 6c 69 74  y generate sqlit
19a0: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 73 0a 2a  e_stat4 tables.*
19b0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 62  * that contain b
19c0: 65 74 77 65 65 6e 20 31 30 20 61 6e 64 20 34 30  etween 10 and 40
19d0: 20 73 61 6d 70 6c 65 73 20 77 68 69 63 68 20 61   samples which a
19e0: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 61  re distributed a
19f0: 63 72 6f 73 73 0a 2a 2a 20 74 68 65 20 6b 65 79  cross.** the key
1a00: 20 73 70 61 63 65 2c 20 74 68 6f 75 67 68 20 6e   space, though n
1a10: 6f 74 20 75 6e 69 66 6f 72 6d 6c 79 2c 20 61 6e  ot uniformly, an
1a20: 64 20 77 68 69 63 68 20 69 6e 63 6c 75 64 65 20  d which include 
1a30: 73 61 6d 70 6c 65 73 20 77 69 74 68 0a 2a 2a 20  samples with.** 
1a40: 6c 61 72 67 65 20 6e 45 71 20 76 61 6c 75 65 73  large nEq values
1a50: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 61 74 20 66  ..**.** Format f
1a60: 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  or sqlite_stat3 
1a70: 72 65 64 75 78 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  redux:.**.** The
1a80: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74 61   sqlite_stat3 ta
1a90: 62 6c 65 20 69 73 20 6c 69 6b 65 20 73 71 6c 69  ble is like sqli
1aa0: 74 65 5f 73 74 61 74 34 20 65 78 63 65 70 74 20  te_stat4 except 
1ab0: 74 68 61 74 20 69 74 20 6f 6e 6c 79 0a 2a 2a 20  that it only.** 
1ac0: 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 6c 65 66  looks at the lef
1ad0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
1ae0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
1af0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2e 73 61   sqlite_stat3.sa
1b00: 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63  mple.** column c
1b10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
1b20: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
1b30: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1b40: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
1b50: 20 62 6c 6f 62 20 65 6e 63 6f 64 69 6e 67 20 6f   blob encoding o
1b60: 66 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 69  f the complete i
1b70: 6e 64 65 78 20 6b 65 79 20 61 73 20 69 73 20 66  ndex key as is f
1b80: 6f 75 6e 64 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ound in.** sqlit
1b90: 65 5f 73 74 61 74 34 2e 73 61 6d 70 6c 65 2e 20  e_stat4.sample. 
1ba0: 20 54 68 65 20 6e 45 71 2c 20 6e 4c 74 2c 20 61   The nEq, nLt, a
1bb0: 6e 64 20 6e 44 4c 74 20 65 6e 74 72 69 65 73 20  nd nDLt entries 
1bc0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 33 0a  of sqlite_stat3.
1bd0: 2a 2a 20 61 6c 6c 20 63 6f 6e 74 61 69 6e 20 6a  ** all contain j
1be0: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 69 6e 74  ust a single int
1bf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1c00: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
1c10: 72 73 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  rst.** integer i
1c20: 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1c30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 71 6c 69   columns in sqli
1c40: 74 65 5f 73 74 61 74 34 2e 0a 2a 2f 0a 23 69 66  te_stat4..*/.#if
1c50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c60: 5f 41 4e 41 4c 59 5a 45 0a 23 69 6e 63 6c 75 64  _ANALYZE.#includ
1c70: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
1c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c90: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34  ITE_ENABLE_STAT4
1ca0: 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74 61  ).# define IsSta
1cb0: 74 34 20 20 20 20 20 31 0a 23 20 64 65 66 69 6e  t4     1.# defin
1cc0: 65 20 49 73 53 74 61 74 33 20 20 20 20 20 30 0a  e IsStat3     0.
1cd0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1cf0: 33 29 0a 23 20 64 65 66 69 6e 65 20 49 73 53 74  3).# define IsSt
1d00: 61 74 34 20 20 20 20 20 30 0a 23 20 64 65 66 69  at4     0.# defi
1d10: 6e 65 20 49 73 53 74 61 74 33 20 20 20 20 20 31  ne IsStat3     1
1d20: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d30: 49 73 53 74 61 74 34 20 20 20 20 20 30 0a 23 20  IsStat4     0.# 
1d40: 64 65 66 69 6e 65 20 49 73 53 74 61 74 33 20 20  define IsStat3  
1d50: 20 20 20 30 0a 23 20 75 6e 64 65 66 20 53 51 4c     0.# undef SQL
1d60: 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45  ITE_STAT4_SAMPLE
1d70: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1d80: 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20  E_STAT4_SAMPLES 
1d90: 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  1.#endif.#define
1da0: 20 49 73 53 74 61 74 33 34 20 20 20 20 28 49 73   IsStat34    (Is
1db0: 53 74 61 74 33 2b 49 73 53 74 61 74 34 29 20 20  Stat3+IsStat4)  
1dc0: 2f 2a 20 31 20 66 6f 72 20 53 54 41 54 33 20 6f  /* 1 for STAT3 o
1dd0: 72 20 53 54 41 54 34 2e 20 30 20 6f 74 68 65 72  r STAT4. 0 other
1de0: 77 69 73 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  wise */../*.** T
1df0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
1e00: 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
1e10: 6f 70 65 6e 73 20 74 68 65 20 73 71 6c 69 74 65  opens the sqlite
1e20: 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a  _statN tables..*
1e30: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
1e40: 74 31 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61  t1 table is alwa
1e50: 79 73 20 72 65 6c 65 76 61 6e 74 2e 20 20 73 71  ys relevant.  sq
1e60: 6c 69 74 65 5f 73 74 61 74 32 20 69 73 20 6e 6f  lite_stat2 is no
1e70: 77 0a 2a 2a 20 6f 62 73 6f 6c 65 74 65 2e 20 20  w.** obsolete.  
1e80: 73 71 6c 69 74 65 5f 73 74 61 74 33 20 61 6e 64  sqlite_stat3 and
1e90: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61 72   sqlite_stat4 ar
1ea0: 65 20 6f 6e 6c 79 20 6f 70 65 6e 65 64 20 77 68  e only opened wh
1eb0: 65 6e 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  en.** appropriat
1ec0: 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
1ed0: 70 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 76 69  ptions are provi
1ee0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
1ef0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
1f00: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 70 72 65  ables do not pre
1f10: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 2c 20 69  viously exist, i
1f20: 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1f30: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 57 68  .** Argument zWh
1f40: 65 72 65 20 6d 61 79 20 62 65 20 61 20 70 6f 69  ere may be a poi
1f50: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
1f60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 61   containing a ta
1f70: 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 6f 72 20  ble name,.** or 
1f80: 69 74 20 6d 61 79 20 62 65 20 61 20 4e 55 4c 4c  it may be a NULL
1f90: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
1fa0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1fb0: 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  n all entries in
1fc0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 73  .** the sqlite_s
1fd0: 74 61 74 4e 20 74 61 62 6c 65 73 20 61 73 73 6f  tatN tables asso
1fe0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1ff0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 61 72 65 20  named table are 
2000: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 7a  deleted..** If z
2010: 57 68 65 72 65 3d 3d 30 2c 20 74 68 65 6e 20 63  Where==0, then c
2020: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
2030: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
2040: 74 61 74 20 74 61 62 6c 65 20 65 6e 74 72 69 65  tat table entrie
2050: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2060: 64 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28  d openStatTable(
2070: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2080: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2090: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20a0: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
20b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c0: 65 20 64 61 74 61 62 61 73 65 20 77 65 20 61 72  e database we ar
20d0: 65 20 6c 6f 6f 6b 69 6e 67 20 69 6e 20 2a 2f 0a  e looking in */.
20e0: 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20    int iStatCur, 
20f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2100: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  n the sqlite_sta
2110: 74 31 20 74 61 62 6c 65 20 6f 6e 20 74 68 69 73  t1 table on this
2120: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2130: 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c  st char *zWhere,
2140: 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 65       /* Delete e
2150: 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69 73 20  ntries for this 
2160: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
2170: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2180: 7a 57 68 65 72 65 54 79 70 65 20 20 2f 2a 20 45  zWhereType  /* E
2190: 69 74 68 65 72 20 22 74 62 6c 22 20 6f 72 20 22  ither "tbl" or "
21a0: 69 64 78 22 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  idx" */.){.  sta
21b0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21c0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
21d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  r *zName;.    co
21e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 73 3b  nst char *zCols;
21f0: 0a 20 20 7d 20 61 54 61 62 6c 65 5b 5d 20 3d 20  .  } aTable[] = 
2200: 7b 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  {.    { "sqlite_
2210: 73 74 61 74 31 22 2c 20 22 74 62 6c 2c 69 64 78  stat1", "tbl,idx
2220: 2c 73 74 61 74 22 20 7d 2c 0a 23 69 66 20 64 65  ,stat" },.#if de
2230: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2240: 42 4c 45 5f 53 54 41 54 34 29 0a 20 20 20 20 7b  BLE_STAT4).    {
2250: 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c   "sqlite_stat4",
2260: 20 22 74 62 6c 2c 69 64 78 2c 6e 65 71 2c 6e 6c   "tbl,idx,neq,nl
2270: 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 22 20 7d  t,ndlt,sample" }
2280: 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  ,.    { "sqlite_
2290: 73 74 61 74 33 22 2c 20 30 20 7d 2c 0a 23 65 6c  stat3", 0 },.#el
22a0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 0a  E_ENABLE_STAT3).
22c0: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73 74      { "sqlite_st
22d0: 61 74 33 22 2c 20 22 74 62 6c 2c 69 64 78 2c 6e  at3", "tbl,idx,n
22e0: 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70  eq,nlt,ndlt,samp
22f0: 6c 65 22 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71  le" },.    { "sq
2300: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 30 20 7d  lite_stat4", 0 }
2310: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 7b 20 22 73  ,.#else.    { "s
2320: 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 30 20  qlite_stat3", 0 
2330: 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69 74 65  },.    { "sqlite
2340: 5f 73 74 61 74 34 22 2c 20 30 20 7d 2c 0a 23 65  _stat4", 0 },.#e
2350: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
2360: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2370: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2380: 20 44 62 20 2a 70 44 62 3b 0a 20 20 56 64 62 65   Db *pDb;.  Vdbe
2390: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
23a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
23b0: 69 6e 74 20 61 52 6f 6f 74 5b 41 72 72 61 79 53  int aRoot[ArrayS
23c0: 69 7a 65 28 61 54 61 62 6c 65 29 5d 3b 0a 20 20  ize(aTable)];.  
23d0: 75 38 20 61 43 72 65 61 74 65 54 62 6c 5b 41 72  u8 aCreateTbl[Ar
23e0: 72 61 79 53 69 7a 65 28 61 54 61 62 6c 65 29 5d  raySize(aTable)]
23f0: 3b 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  ;..  if( v==0 ) 
2400: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
2410: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2420: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2440: 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 3d  qlite3VdbeDb(v)=
2450: 3d 64 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  =db );.  pDb = &
2460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
2470: 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 73   /* Create new s
2480: 74 61 74 69 73 74 69 63 20 74 61 62 6c 65 73 20  tatistic tables 
2490: 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 65  if they do not e
24a0: 78 69 73 74 2c 20 6f 72 20 63 6c 65 61 72 20 74  xist, or clear t
24b0: 68 65 6d 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  hem.  ** if they
24c0: 20 64 6f 20 61 6c 72 65 61 64 79 20 65 78 69 73   do already exis
24d0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
24e0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
24f0: 54 61 62 6c 65 29 3b 20 69 2b 2b 29 7b 0a 20 20  Table); i++){.  
2500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2510: 61 62 20 3d 20 61 54 61 62 6c 65 5b 69 5d 2e 7a  ab = aTable[i].z
2520: 4e 61 6d 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  Name;.    Table 
2530: 2a 70 53 74 61 74 3b 0a 20 20 20 20 69 66 28 20  *pStat;.    if( 
2540: 28 70 53 74 61 74 20 3d 20 73 71 6c 69 74 65 33  (pStat = sqlite3
2550: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
2560: 61 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  ab, pDb->zDbSNam
2570: 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))==0 ){.      
2580: 69 66 28 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43  if( aTable[i].zC
2590: 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ols ){.        /
25a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
25b0: 74 4e 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  tN table does no
25c0: 74 20 65 78 69 73 74 2e 20 43 72 65 61 74 65 20  t exist. Create 
25d0: 69 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  it. Note that a 
25e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 64 65  .        ** side
25f0: 2d 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 43  -effect of the C
2600: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2610: 65 6d 65 6e 74 20 69 73 20 74 6f 20 6c 65 61 76  ement is to leav
2620: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 0a  e the rootpage .
2630: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
2640: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 72  e new table in r
2650: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
2660: 72 65 67 52 6f 6f 74 2e 20 54 68 69 73 20 69 73  regRoot. This is
2670: 20 69 6d 70 6f 72 74 61 6e 74 20 0a 20 20 20 20   important .    
2680: 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74      ** because t
2690: 68 65 20 4f 70 65 6e 57 72 69 74 65 20 6f 70 63  he OpenWrite opc
26a0: 6f 64 65 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62  ode below will b
26b0: 65 20 6e 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f  e needing it. */
26c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26d0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
26e0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
26f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
2700: 2e 25 73 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a  .%s(%s)", pDb->z
2710: 44 62 53 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 61  DbSName, zTab, a
2720: 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 0a 20  Table[i].zCols. 
2730: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2740: 20 20 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 50 61    aRoot[i] = pPa
2750: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 3b 0a 20 20  rse->regRoot;.  
2760: 20 20 20 20 20 20 61 43 72 65 61 74 65 54 62 6c        aCreateTbl
2770: 5b 69 5d 20 3d 20 4f 50 46 4c 41 47 5f 50 32 49  [i] = OPFLAG_P2I
2780: 53 52 45 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SREG;.      }.  
2790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
27a0: 2a 20 54 68 65 20 74 61 62 6c 65 20 61 6c 72 65  * The table alre
27b0: 61 64 79 20 65 78 69 73 74 73 2e 20 49 66 20 7a  ady exists. If z
27c0: 57 68 65 72 65 20 69 73 20 6e 6f 74 20 4e 55 4c  Where is not NUL
27d0: 4c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 65 6e  L, delete all en
27e0: 74 72 69 65 73 20 0a 20 20 20 20 20 20 2a 2a 20  tries .      ** 
27f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2800: 74 68 65 20 74 61 62 6c 65 20 7a 57 68 65 72 65  the table zWhere
2810: 2e 20 49 66 20 7a 57 68 65 72 65 20 69 73 20 4e  . If zWhere is N
2820: 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 0a  ULL, delete the.
2830: 20 20 20 20 20 20 2a 2a 20 65 6e 74 69 72 65 20        ** entire 
2840: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2850: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
2860: 61 52 6f 6f 74 5b 69 5d 20 3d 20 70 53 74 61 74  aRoot[i] = pStat
2870: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 43  ->tnum;.      aC
2880: 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20 30 3b  reateTbl[i] = 0;
2890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
28a0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
28b0: 69 44 62 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 31  iDb, aRoot[i], 1
28c0: 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , zTab);.      i
28d0: 66 28 20 7a 57 68 65 72 65 20 29 7b 0a 20 20 20  f( zWhere ){.   
28e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
28f0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2900: 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
2910: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
2920: 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
2930: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53         pDb->zDbS
2940: 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 57 68 65  Name, zTab, zWhe
2950: 72 65 54 79 70 65 2c 20 7a 57 68 65 72 65 0a 20  reType, zWhere. 
2960: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2980: 2a 20 54 68 65 20 73 71 6c 69 74 65 5f 73 74 61  * The sqlite_sta
2990: 74 5b 31 33 34 5d 20 74 61 62 6c 65 20 61 6c 72  t[134] table alr
29a0: 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 44 65  eady exists.  De
29b0: 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73 2e 20 2a  lete all rows. *
29c0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
29d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
29e0: 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f 74 5b 69  P_Clear, aRoot[i
29f0: 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  ], iDb);.      }
2a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2a10: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
2a20: 5f 73 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65  _stat[134] table
2a30: 73 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  s for writing. *
2a40: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 54 61  /.  for(i=0; aTa
2a50: 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b 20 69 2b  ble[i].zCols; i+
2a60: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2a70: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 61 62  i<ArraySize(aTab
2a80: 6c 65 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  le) );.    sqlit
2a90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2aa0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
2ab0: 20 69 53 74 61 74 43 75 72 2b 69 2c 20 61 52 6f   iStatCur+i, aRo
2ac0: 6f 74 5b 69 5d 2c 20 69 44 62 2c 20 33 29 3b 0a  ot[i], iDb, 3);.
2ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ae0: 68 61 6e 67 65 50 35 28 76 2c 20 61 43 72 65 61  hangeP5(v, aCrea
2af0: 74 65 54 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 56  teTbl[i]);.    V
2b00: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 61  dbeComment((v, a
2b10: 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d 65 29 29  Table[i].zName))
2b20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2b30: 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75 6d 62 65  ecommended numbe
2b40: 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f 72  r of samples for
2b50: 20 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2f   sqlite_stat4.*/
2b60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b70: 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 0a 23 20  STAT4_SAMPLES.# 
2b80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 54  define SQLITE_ST
2b90: 41 54 34 5f 53 41 4d 50 4c 45 53 20 32 34 0a 23  AT4_SAMPLES 24.#
2ba0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 72  endif../*.** Thr
2bb0: 65 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ee SQL functions
2bc0: 20 2d 20 73 74 61 74 5f 69 6e 69 74 28 29 2c 20   - stat_init(), 
2bd0: 73 74 61 74 5f 70 75 73 68 28 29 2c 20 61 6e 64  stat_push(), and
2be0: 20 73 74 61 74 5f 67 65 74 28 29 20 2d 0a 2a 2a   stat_get() -.**
2bf0: 20 73 68 61 72 65 20 61 6e 20 69 6e 73 74 61 6e   share an instan
2c00: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2c10: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 74 6f  ing structure to
2c20: 20 68 6f 6c 64 20 74 68 65 69 72 20 73 74 61 74   hold their stat
2c30: 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  e.** information
2c40: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2c50: 75 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 53  uct Stat4Accum S
2c60: 74 61 74 34 41 63 63 75 6d 3b 0a 74 79 70 65 64  tat4Accum;.typed
2c70: 65 66 20 73 74 72 75 63 74 20 53 74 61 74 34 53  ef struct Stat4S
2c80: 61 6d 70 6c 65 20 53 74 61 74 34 53 61 6d 70 6c  ample Stat4Sampl
2c90: 65 3b 0a 73 74 72 75 63 74 20 53 74 61 74 34 53  e;.struct Stat4S
2ca0: 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f 77 63 6e  ample {.  tRowcn
2cb0: 74 20 2a 61 6e 45 71 3b 20 20 20 20 20 20 20 20  t *anEq;        
2cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2cd0: 69 74 65 5f 73 74 61 74 34 2e 6e 45 71 20 2a 2f  ite_stat4.nEq */
2ce0: 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c  .  tRowcnt *anDL
2cf0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d00: 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61     /* sqlite_sta
2d10: 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65  t4.nDLt */.#ifde
2d20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2d30: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
2d40: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 3b 20   tRowcnt *anLt; 
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34   /* sqlite_stat4
2d70: 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20  .nLt */.  union 
2d80: 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2da0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
2db0: 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20 6f 66 20  n main table of 
2dc0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 75  the key */.    u
2dd0: 38 20 2a 61 52 6f 77 69 64 3b 20 20 20 20 20 20  8 *aRowid;      
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2df0: 2a 20 4b 65 79 20 66 6f 72 20 57 49 54 48 4f 55  * Key for WITHOU
2e00: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
2e10: 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 6e  /.  } u;.  u32 n
2e20: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2e40: 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d 20 2a 2f  zeof aRowid[] */
2e50: 0a 20 20 75 38 20 69 73 50 53 61 6d 70 6c 65 3b  .  u8 isPSample;
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2e80: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 20  periodic sample 
2e90: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 2f 2a 20 49 66 20 21 69 73 50 53       /* If !isPS
2ec0: 61 6d 70 6c 65 2c 20 74 68 65 20 72 65 61 73 6f  ample, the reaso
2ed0: 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20  n for inclusion 
2ee0: 2a 2f 0a 20 20 75 33 32 20 69 48 61 73 68 3b 20  */.  u32 iHash; 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 2f 2a 20 54 69 65 62 72 65 61 6b       /* Tiebreak
2f10: 65 72 20 68 61 73 68 20 2a 2f 0a 23 65 6e 64 69  er hash */.#endi
2f20: 66 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  f.};            
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 0a 73 74 72 75 63 74 20          .struct 
2f60: 53 74 61 74 34 41 63 63 75 6d 20 7b 0a 20 20 74  Stat4Accum {.  t
2f70: 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20 20 20 20  Rowcnt nRow;    
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f90: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2fa0: 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a  e entire table *
2fb0: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 50 53 61  /.  tRowcnt nPSa
2fc0: 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  mple;         /*
2fd0: 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f 20 64 6f   How often to do
2fe0: 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70   a periodic samp
2ff0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
3000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3020: 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20  olumns in index 
3030: 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20  + pk/rowid */.  
3040: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
3050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3060: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
3070: 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20 70 6b 2f  umns w/o the pk/
3080: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  rowid */.  int m
3090: 78 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  xSample;        
30a0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
30b0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
30c0: 73 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  s to accumulate 
30d0: 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  */.  Stat4Sample
30e0: 20 63 75 72 72 65 6e 74 3b 20 20 20 20 20 20 2f   current;      /
30f0: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 61 73  * Current row as
3100: 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a   a Stat4Sample *
3110: 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b 20 20 20  /.  u32 iPrn;   
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3130: 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   Pseudo-random n
3140: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 73  umber used for s
3150: 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20 53 74 61  ampling */.  Sta
3160: 74 34 53 61 6d 70 6c 65 20 2a 61 42 65 73 74 3b  t4Sample *aBest;
3170: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
3180: 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20 73 61 6d  of nCol best sam
3190: 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ples */.  int iM
31a0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
31b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
31c0: 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20 77 69 74  a[] of entry wit
31d0: 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f 72 65 20  h minimum score 
31e0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65  */.  int nSample
31f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3200: 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
3210: 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20   of samples */. 
3220: 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65 72 6f 3b   int nMaxEqZero;
3230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3240: 78 20 6c 65 61 64 69 6e 67 20 30 20 69 6e 20 61  x leading 0 in a
3250: 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79 20 61 5b  nEq[] for any a[
3260: 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  ] entry */.  int
3270: 20 69 47 65 74 3b 20 20 20 20 20 20 20 20 20 20   iGet;          
3280: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3290: 6f 66 20 63 75 72 72 65 6e 74 20 73 61 6d 70 6c  of current sampl
32a0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 73 74  e accessed by st
32b0: 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20 20 53 74  at_get() */.  St
32c0: 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b 20 20 20  at4Sample *a;   
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
32e0: 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20 53 74 61   of mxSample Sta
32f0: 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65 63 74 73  t4Sample objects
3300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3310: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3320: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
3330: 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d 61 6c 6c  ection, for mall
3340: 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52  oc() */.};../* R
3350: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 75 73  eclaim memory us
3360: 65 64 20 62 79 20 61 20 53 74 61 74 34 53 61 6d  ed by a Stat4Sam
3370: 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ple.*/.#ifdef SQ
3380: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3390: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
33a0: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6c 65  c void sampleCle
33b0: 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ar(sqlite3 *db, 
33c0: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 29 7b  Stat4Sample *p){
33d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
33e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f   );.  if( p->nRo
33f0: 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  wid ){.    sqlit
3400: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
3410: 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  u.aRowid);.    p
3420: 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  ->nRowid = 0;.  
3430: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  }.}.#endif../* I
3440: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 42 4c  nitialize the BL
3450: 4f 42 20 76 61 6c 75 65 20 6f 66 20 61 20 52 4f  OB value of a RO
3460: 57 49 44 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  WID.*/.#ifdef SQ
3470: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
3480: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
3490: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74  c void sampleSet
34a0: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
34b0: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
34c0: 70 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  p, int n, const 
34d0: 75 38 20 2a 70 44 61 74 61 29 7b 0a 20 20 61 73  u8 *pData){.  as
34e0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
34f0: 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69 64 20 29   if( p->nRowid )
3500: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3510: 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b  b, p->u.aRowid);
3520: 0a 20 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20 3d  .  p->u.aRowid =
3530: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3540: 52 61 77 4e 4e 28 64 62 2c 20 6e 29 3b 0a 20 20  RawNN(db, n);.  
3550: 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77 69 64 20  if( p->u.aRowid 
3560: 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64  ){.    p->nRowid
3570: 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79   = n;.    memcpy
3580: 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c 20 70 44  (p->u.aRowid, pD
3590: 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  ata, n);.  }else
35a0: 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77 69 64 20  {.    p->nRowid 
35b0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
35c0: 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  f../* Initialize
35d0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 76 61 6c   the INTEGER val
35e0: 75 65 20 6f 66 20 61 20 52 4f 57 49 44 2e 0a 2a  ue of a ROWID..*
35f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3600: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
3610: 53 54 41 54 34 0a 73 74 61 74 69 63 20 76 6f 69  STAT4.static voi
3620: 64 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64  d sampleSetRowid
3630: 49 6e 74 36 34 28 73 71 6c 69 74 65 33 20 2a 64  Int64(sqlite3 *d
3640: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
3650: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
3660: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3670: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77  );.  if( p->nRow
3680: 69 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  id ) sqlite3DbFr
3690: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77  ee(db, p->u.aRow
36a0: 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f 77 69 64  id);.  p->nRowid
36b0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e 69 52 6f   = 0;.  p->u.iRo
36c0: 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  wid = iRowid;.}.
36d0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
36e0: 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
36f0: 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a 70 46 72   of object (*pFr
3700: 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54 6f 29 2e  om) into (*pTo).
3710: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3720: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
3730: 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20 76  R_STAT4.static v
3740: 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70 79 28 53  oid sampleCopy(S
3750: 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 53 74  tat4Accum *p, St
3760: 61 74 34 53 61 6d 70 6c 65 20 2a 70 54 6f 2c 20  at4Sample *pTo, 
3770: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 46 72  Stat4Sample *pFr
3780: 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69 73 50 53  om){.  pTo->isPS
3790: 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d 2d 3e 69  ample = pFrom->i
37a0: 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70 54 6f 2d  sPSample;.  pTo-
37b0: 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d 2d 3e 69  >iCol = pFrom->i
37c0: 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69 48 61 73  Col;.  pTo->iHas
37d0: 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48 61 73 68  h = pFrom->iHash
37e0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
37f0: 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e 61 6e 45  anEq, pFrom->anE
3800: 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e  q, sizeof(tRowcn
3810: 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d  t)*p->nCol);.  m
3820: 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 4c 74 2c  emcpy(pTo->anLt,
3830: 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c 20 73 69   pFrom->anLt, si
3840: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
3850: 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63 70 79  >nCol);.  memcpy
3860: 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20 70 46 72  (pTo->anDLt, pFr
3870: 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69 7a 65 6f  om->anDLt, sizeo
3880: 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43  f(tRowcnt)*p->nC
3890: 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  ol);.  if( pFrom
38a0: 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->nRowid ){.    
38b0: 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 28 70  sampleSetRowid(p
38c0: 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  ->db, pTo, pFrom
38d0: 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72 6f 6d 2d  ->nRowid, pFrom-
38e0: 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20 7d 65  >u.aRowid);.  }e
38f0: 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53  lse{.    sampleS
3900: 65 74 52 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e  etRowidInt64(p->
3910: 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
3920: 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 7d  u.iRowid);.  }.}
3930: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
3940: 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
3950: 79 20 6f 66 20 61 20 53 74 61 74 34 41 63 63 75  y of a Stat4Accu
3960: 6d 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  m structure..*/.
3970: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
3980: 34 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64  4Destructor(void
3990: 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74 61 74 34   *pOld){.  Stat4
39a0: 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74  Accum *p = (Stat
39b0: 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b 0a 23 69  4Accum*)pOld;.#i
39c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
39d0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
39e0: 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  4.  int i;.  for
39f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
3a00: 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c 65 61   i++) sampleClea
3a10: 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 42 65 73  r(p->db, p->aBes
3a20: 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t+i);.  for(i=0;
3a30: 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 3b 20   i<p->mxSample; 
3a40: 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c 65 61 72  i++) sampleClear
3a50: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b 69 29 3b  (p->db, p->a+i);
3a60: 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70  .  sampleClear(p
3a70: 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e  ->db, &p->curren
3a80: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  t);.#endif.  sql
3a90: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
3aa0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , p);.}../*.** I
3ab0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3ac0: 20 74 68 65 20 73 74 61 74 5f 69 6e 69 74 28 4e   the stat_init(N
3ad0: 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e 63 74 69  ,K,C) SQL functi
3ae0: 6f 6e 2e 20 54 68 65 20 74 68 72 65 65 20 70 61  on. The three pa
3af0: 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61 72 65 3a  rameters.** are:
3b00: 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20 20 54 68  .**     N:    Th
3b10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
3b20: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
3b30: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 72   including the r
3b40: 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65 20 31 29  owid/pk (note 1)
3b50: 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20 20 54 68  .**     K:    Th
3b60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
3b70: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
3b80: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 72   excluding the r
3b90: 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20 20 20 20  owid/pk..**     
3ba0: 43 3a 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72  C:    The number
3bb0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
3bc0: 69 6e 64 65 78 20 28 6e 6f 74 65 20 32 29 0a 2a  index (note 2).*
3bd0: 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20 20 49 6e  *.** Note 1:  In
3be0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
3bf0: 65 20 6f 66 20 74 68 65 20 63 6f 76 65 72 69 6e  e of the coverin
3c00: 67 20 69 6e 64 65 78 20 74 68 61 74 20 69 6d 70  g index that imp
3c10: 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 57 49 54  lements a.** WIT
3c20: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
3c30: 2c 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  , N is the numbe
3c40: 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59  r of PRIMARY KEY
3c50: 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74 20 74 68   columns, not th
3c60: 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
3c70: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
3c80: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
3c90: 20 4e 6f 74 65 20 32 3a 20 20 43 20 69 73 20 6f   Note 2:  C is o
3ca0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53 54 41  nly used for STA
3cb0: 54 33 20 61 6e 64 20 53 54 41 54 34 2e 0a 2a 2a  T3 and STAT4..**
3cc0: 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 65 73 20  .** For indexes 
3cd0: 6f 6e 20 6f 72 64 69 6e 61 72 79 20 72 6f 77 69  on ordinary rowi
3ce0: 64 20 74 61 62 6c 65 73 2c 20 4e 3d 3d 4b 2b 31  d tables, N==K+1
3cf0: 2e 20 20 42 75 74 20 66 6f 72 20 69 6e 64 65 78  .  But for index
3d00: 65 73 20 6f 6e 0a 2a 2a 20 57 49 54 48 4f 55 54  es on.** WITHOUT
3d10: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2c 20 4e   ROWID tables, N
3d20: 3d 4b 2b 50 20 77 68 65 72 65 20 50 20 69 73 20  =K+P where P is 
3d30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
3d40: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20  lumns in the.** 
3d50: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 74  PRIMARY KEY of t
3d60: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63  he table.  The c
3d70: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 74 68  overing index th
3d80: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
3d90: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 57 49  e.** original WI
3da0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
3db0: 65 20 61 73 20 4e 3d 3d 4b 20 61 73 20 61 20 73  e as N==K as a s
3dc0: 70 65 63 69 61 6c 20 63 61 73 65 2e 0a 2a 2a 0a  pecial case..**.
3dd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3de0: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 53 74  allocates the St
3df0: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
3e00: 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 20  in heap memory. 
3e10: 54 68 65 20 72 65 74 75 72 6e 20 0a 2a 2a 20 76  The return .** v
3e20: 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
3e30: 72 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63  r to the Stat4Ac
3e40: 63 75 6d 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  cum object.  The
3e50: 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65   datatype of the
3e60: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
3e70: 20 69 73 20 42 4c 4f 42 2c 20 62 75 74 20 69 74   is BLOB, but it
3e80: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
3e90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3ea0: 20 53 74 61 74 34 41 63 63 75 6d 0a 2a 2a 20 6f   Stat4Accum.** o
3eb0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
3ec0: 20 76 6f 69 64 20 73 74 61 74 49 6e 69 74 28 0a   void statInit(.
3ed0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3ee0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
3ef0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3f00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3f10: 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a  {.  Stat4Accum *
3f20: 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  p;.  int nCol;  
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3f50: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
3f60: 65 78 20 62 65 69 6e 67 20 73 61 6d 70 6c 65 64  ex being sampled
3f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f   */.  int nKeyCo
3f80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3f90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3fa0: 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 2a  of key columns *
3fb0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55 70 3b 20  /.  int nColUp; 
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72 6f 75 6e      /* nCol roun
3fe0: 64 65 64 20 75 70 20 66 6f 72 20 61 6c 69 67 6e  ded up for align
3ff0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ment */.  int n;
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4020: 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61  es of space to a
4030: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 73 71 6c  llocate */.  sql
4040: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4060: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
4070: 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ion */.#ifdef SQ
4080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
4090: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e 74  3_OR_STAT4.  int
40a0: 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53 51 4c 49   mxSample = SQLI
40b0: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
40c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  ;.#endif..  /* D
40d0: 65 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20  ecode the three 
40e0: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
40f0: 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  ts */.  UNUSED_P
4100: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
4110: 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
4120: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
4130: 30 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0]);.  assert( n
4140: 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43 6f 6c 55  Col>0 );.  nColU
4150: 70 20 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63  p = sizeof(tRowc
4160: 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c 2b 31 29  nt)<8 ? (nCol+1)
4170: 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20 20 6e 4b  &~1 : nCol;.  nK
4180: 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  eyCol = sqlite3_
4190: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
41a0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  ]);.  assert( nK
41b0: 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29 3b 0a 20  eyCol<=nCol );. 
41c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
41d0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  >0 );..  /* Allo
41e0: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 72  cate the space r
41f0: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
4200: 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63  Stat4Accum objec
4210: 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69 7a 65 6f  t */.  n = sizeo
4220: 66 28 2a 70 29 20 0a 20 20 20 20 2b 20 73 69 7a  f(*p) .    + siz
4230: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
4240: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
4250: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
4260: 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20 20 20 2b  um.anEq */.    +
4270: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
4280: 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20  *nColUp         
4290: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
42a0: 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20 2a 2f 0a  4Accum.anDLt */.
42b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
42c0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
42d0: 41 54 34 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66  AT4.    + sizeof
42e0: 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70  (tRowcnt)*nColUp
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e    /* Stat4Accum.
4310: 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b 20 73 69  anLt */.    + si
4320: 7a 65 6f 66 28 53 74 61 74 34 53 61 6d 70 6c 65  zeof(Stat4Sample
4330: 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c 65  )*(nCol+mxSample
4340: 29 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63  )     /* Stat4Ac
4350: 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20 61 5b 5d  cum.aBest[], a[]
4360: 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66   */.    + sizeof
4370: 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e 43 6f 6c  (tRowcnt)*3*nCol
4380: 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d 70 6c  Up*(nCol+mxSampl
4390: 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b 0a 20 20  e).#endif.  ;.  
43a0: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
43b0: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
43c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20 3d 20 73  ontext);.  p = s
43d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
43e0: 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28  ro(db, n);.  if(
43f0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   p==0 ){.    sql
4400: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
4410: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
4420: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4430: 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  }..  p->db = db;
4440: 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a  .  p->nRow = 0;.
4450: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c    p->nCol = nCol
4460: 3b 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d  ;.  p->nKeyCol =
4470: 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 2d 3e 63   nKeyCol;.  p->c
4480: 75 72 72 65 6e 74 2e 61 6e 44 4c 74 20 3d 20 28  urrent.anDLt = (
4490: 74 52 6f 77 63 6e 74 2a 29 26 70 5b 31 5d 3b 0a  tRowcnt*)&p[1];.
44a0: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45    p->current.anE
44b0: 71 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74 2e  q = &p->current.
44c0: 61 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d 3b 0a 0a  anDLt[nColUp];..
44d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
44e0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
44f0: 41 54 34 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a  AT4.  {.    u8 *
4500: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4520: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 6e  llocated space n
4530: 6f 74 20 79 65 74 20 61 73 73 69 67 6e 65 64 20  ot yet assigned 
4540: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  */.    int i;   
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
4570: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4580: 68 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20 2a  h p->aSample[] *
4590: 2f 0a 0a 20 20 20 20 70 2d 3e 69 47 65 74 20 3d  /..    p->iGet =
45a0: 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d 78 53 61   -1;.    p->mxSa
45b0: 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70 6c 65 3b  mple = mxSample;
45c0: 0a 20 20 20 20 70 2d 3e 6e 50 53 61 6d 70 6c 65  .    p->nPSample
45d0: 20 3d 20 28 74 52 6f 77 63 6e 74 29 28 73 71 6c   = (tRowcnt)(sql
45e0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
45f0: 28 61 72 67 76 5b 32 5d 29 2f 28 6d 78 53 61 6d  (argv[2])/(mxSam
4600: 70 6c 65 2f 33 2b 31 29 20 2b 20 31 29 3b 0a 20  ple/3+1) + 1);. 
4610: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e     p->current.an
4620: 4c 74 20 3d 20 26 70 2d 3e 63 75 72 72 65 6e 74  Lt = &p->current
4630: 2e 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d 3b 0a 20  .anEq[nColUp];. 
4640: 20 20 20 70 2d 3e 69 50 72 6e 20 3d 20 30 78 36     p->iPrn = 0x6
4650: 38 39 65 39 36 32 64 2a 28 75 33 32 29 6e 43 6f  89e962d*(u32)nCo
4660: 6c 20 5e 20 30 78 64 30 39 34 34 35 36 35 2a 28  l ^ 0xd0944565*(
4670: 75 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  u32)sqlite3_valu
4680: 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a  e_int(argv[2]);.
4690: 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70    .    /* Set up
46a0: 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 2e   the Stat4Accum.
46b0: 61 5b 5d 20 61 6e 64 20 61 42 65 73 74 5b 5d 20  a[] and aBest[] 
46c0: 61 72 72 61 79 73 20 2a 2f 0a 20 20 20 20 70 2d  arrays */.    p-
46d0: 3e 61 20 3d 20 28 73 74 72 75 63 74 20 53 74 61  >a = (struct Sta
46e0: 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d 3e 63 75  t4Sample*)&p->cu
46f0: 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43 6f 6c 55  rrent.anLt[nColU
4700: 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42 65 73 74  p];.    p->aBest
4710: 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61 6d 70 6c   = &p->a[mxSampl
4720: 65 5d 3b 0a 20 20 20 20 70 53 70 61 63 65 20 3d  e];.    pSpace =
4730: 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b 6d 78 53   (u8*)(&p->a[mxS
4740: 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b 0a 20 20  ample+nCol]);.  
4750: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6d 78    for(i=0; i<(mx
4760: 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b 20 69 2b  Sample+nCol); i+
4770: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  +){.      p->a[i
4780: 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f 77 63 6e  ].anEq = (tRowcn
4790: 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61  t *)pSpace; pSpa
47a0: 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52  ce += (sizeof(tR
47b0: 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29  owcnt) * nColUp)
47c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  ;.      p->a[i].
47d0: 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20  anLt = (tRowcnt 
47e0: 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65  *)pSpace; pSpace
47f0: 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77   += (sizeof(tRow
4800: 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a  cnt) * nColUp);.
4810: 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e        p->a[i].an
4820: 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a  DLt = (tRowcnt *
4830: 29 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20  )pSpace; pSpace 
4840: 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63  += (sizeof(tRowc
4850: 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20  nt) * nColUp);. 
4860: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
4870: 20 28 70 53 70 61 63 65 20 2d 20 28 75 38 2a 29   (pSpace - (u8*)
4880: 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20 20 20 20  p)==n );.  .    
4890: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
48a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
48b0: 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c 20 3d 20  aBest[i].iCol = 
48c0: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  i;.    }.  }.#en
48d0: 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  dif..  /* Return
48e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
48f0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65  e allocated obje
4900: 63 74 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ct to the caller
4910: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
4920: 2a 20 6f 6e 6c 79 20 74 68 65 20 70 6f 69 6e 74  * only the point
4930: 65 72 20 28 74 68 65 20 32 6e 64 20 70 61 72 61  er (the 2nd para
4940: 6d 65 74 65 72 29 20 6d 61 74 74 65 72 73 2e 20  meter) matters. 
4950: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
4960: 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 28 67 69   object.  ** (gi
4970: 76 65 6e 20 62 79 20 74 68 65 20 33 72 64 20 70  ven by the 3rd p
4980: 61 72 61 6d 65 74 65 72 29 20 69 73 20 6e 65 76  arameter) is nev
4990: 65 72 20 75 73 65 64 20 61 6e 64 20 63 61 6e 20  er used and can 
49a0: 62 65 20 61 6e 79 20 70 6f 73 69 74 69 76 65 0a  be any positive.
49b0: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 2a 2f 0a 20    ** value. */. 
49c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
49d0: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 2c  blob(context, p,
49e0: 20 73 69 7a 65 6f 66 28 2a 70 29 2c 20 73 74 61   sizeof(*p), sta
49f0: 74 34 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 7d  t4Destructor);.}
4a00: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75  .static const Fu
4a10: 6e 63 44 65 66 20 73 74 61 74 49 6e 69 74 46 75  ncDef statInitFu
4a20: 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32 2b 49 73  ncdef = {.  2+Is
4a30: 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20  Stat34,      /* 
4a40: 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45  nArg */.  SQLITE
4a50: 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75  _UTF8,     /* fu
4a60: 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20  ncFlags */.  0, 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a80: 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20   pUserData */.  
4a90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4aa0: 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73   /* pNext */.  s
4ab0: 74 61 74 49 6e 69 74 2c 20 20 20 20 20 20 20 20  tatInit,        
4ac0: 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20 30  /* xSFunc */.  0
4ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ae0: 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a  /* xFinalize */.
4af0: 20 20 22 73 74 61 74 5f 69 6e 69 74 22 2c 20 20    "stat_init",  
4b00: 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
4b10: 20 7b 30 7d 0a 7d 3b 0a 0a 23 69 66 64 65 66 20   {0}.};..#ifdef 
4b20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4b30: 41 54 34 0a 2f 2a 0a 2a 2a 20 70 4e 65 77 20 61  AT4./*.** pNew a
4b40: 6e 64 20 70 4f 6c 64 20 61 72 65 20 62 6f 74 68  nd pOld are both
4b50: 20 63 61 6e 64 69 64 61 74 65 20 6e 6f 6e 2d 70   candidate non-p
4b60: 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 73 20  eriodic samples 
4b70: 73 65 6c 65 63 74 65 64 20 66 6f 72 20 0a 2a 2a  selected for .**
4b80: 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
4b90: 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f   (pNew->iCol==pO
4ba0: 6c 64 2d 3e 69 43 6f 6c 29 2e 20 49 67 6e 6f 72  ld->iCol). Ignor
4bb0: 69 6e 67 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ing this column 
4bc0: 61 6e 64 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  and .** consider
4bd0: 69 6e 67 20 6f 6e 6c 79 20 61 6e 79 20 74 72 61  ing only any tra
4be0: 69 6c 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 61 6e  iling columns an
4bf0: 64 20 74 68 65 20 73 61 6d 70 6c 65 20 68 61 73  d the sample has
4c00: 68 20 76 61 6c 75 65 2c 20 74 68 69 73 0a 2a 2a  h value, this.**
4c10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4c20: 73 20 74 72 75 65 20 69 66 20 73 61 6d 70 6c 65  s true if sample
4c30: 20 70 4e 65 77 20 69 73 20 74 6f 20 62 65 20 70   pNew is to be p
4c40: 72 65 66 65 72 72 65 64 20 6f 76 65 72 20 70 4f  referred over pO
4c50: 6c 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  ld..** In other 
4c60: 77 6f 72 64 73 2c 20 69 66 20 77 65 20 61 73 73  words, if we ass
4c70: 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 61 72  ume that the car
4c80: 64 69 6e 61 6c 69 74 69 65 73 20 6f 66 20 74 68  dinalities of th
4c90: 65 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 63 6f  e selected.** co
4ca0: 6c 75 6d 6e 20 66 6f 72 20 70 4e 65 77 20 61 6e  lumn for pNew an
4cb0: 64 20 70 4f 6c 64 20 61 72 65 20 65 71 75 61 6c  d pOld are equal
4cc0: 2c 20 69 73 20 70 4e 65 77 20 74 6f 20 62 65 20  , is pNew to be 
4cd0: 70 72 65 66 65 72 72 65 64 20 6f 76 65 72 20 70  preferred over p
4ce0: 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Old..**.** This 
4cf0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
4d00: 20 74 68 61 74 20 66 6f 72 20 65 61 63 68 20 61   that for each a
4d10: 72 67 75 6d 65 6e 74 20 73 61 6d 70 6c 65 2c 20  rgument sample, 
4d20: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a  the contents of.
4d30: 2a 2a 20 74 68 65 20 61 6e 45 71 5b 5d 20 61 72  ** the anEq[] ar
4d40: 72 61 79 20 66 72 6f 6d 20 70 53 61 6d 70 6c 65  ray from pSample
4d50: 2d 3e 61 6e 45 71 5b 70 53 61 6d 70 6c 65 2d 3e  ->anEq[pSample->
4d60: 69 43 6f 6c 2b 31 5d 20 6f 6e 77 61 72 64 73 20  iCol+1] onwards 
4d70: 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a 2f 0a 73  are valid. .*/.s
4d80: 74 61 74 69 63 20 69 6e 74 20 73 61 6d 70 6c 65  tatic int sample
4d90: 49 73 42 65 74 74 65 72 50 6f 73 74 28 0a 20 20  IsBetterPost(.  
4da0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63  Stat4Accum *pAcc
4db0: 75 6d 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70  um, .  Stat4Samp
4dc0: 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61  le *pNew, .  Sta
4dd0: 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29  t4Sample *pOld.)
4de0: 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  {.  int nCol = p
4df0: 41 63 63 75 6d 2d 3e 6e 43 6f 6c 3b 0a 20 20 69  Accum->nCol;.  i
4e00: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
4e10: 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64  pNew->iCol==pOld
4e20: 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28  ->iCol );.  for(
4e30: 69 3d 70 4e 65 77 2d 3e 69 43 6f 6c 2b 31 3b 20  i=pNew->iCol+1; 
4e40: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
4e50: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71    if( pNew->anEq
4e60: 5b 69 5d 3e 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69  [i]>pOld->anEq[i
4e70: 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ] ) return 1;.  
4e80: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 6e 45 71    if( pNew->anEq
4e90: 5b 69 5d 3c 70 4f 6c 64 2d 3e 61 6e 45 71 5b 69  [i]<pOld->anEq[i
4ea0: 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ] ) return 0;.  
4eb0: 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 48  }.  if( pNew->iH
4ec0: 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 20  ash>pOld->iHash 
4ed0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
4ee0: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
4ef0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4f00: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
4f10: 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75  STAT4./*.** Retu
4f20: 72 6e 20 74 72 75 65 20 69 66 20 70 4e 65 77 20  rn true if pNew 
4f30: 69 73 20 74 6f 20 62 65 20 70 72 65 66 65 72 72  is to be preferr
4f40: 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a 2a  ed over pOld..**
4f50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4f60: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 66  n assumes that f
4f70: 6f 72 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  or each argument
4f80: 20 73 61 6d 70 6c 65 2c 20 74 68 65 20 63 6f 6e   sample, the con
4f90: 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20  tents of.** the 
4fa0: 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 66 72 6f  anEq[] array fro
4fb0: 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 5b  m pSample->anEq[
4fc0: 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 5d 20 6f  pSample->iCol] o
4fd0: 6e 77 61 72 64 73 20 61 72 65 20 76 61 6c 69 64  nwards are valid
4fe0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
4ff0: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
5000: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
5010: 41 63 63 75 6d 2c 20 0a 20 20 53 74 61 74 34 53  Accum, .  Stat4S
5020: 61 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20  ample *pNew, .  
5030: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c  Stat4Sample *pOl
5040: 64 0a 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  d.){.  tRowcnt n
5050: 45 71 4e 65 77 20 3d 20 70 4e 65 77 2d 3e 61 6e  EqNew = pNew->an
5060: 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3b 0a  Eq[pNew->iCol];.
5070: 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4f 6c 64    tRowcnt nEqOld
5080: 20 3d 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4f   = pOld->anEq[pO
5090: 6c 64 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20 20 61 73  ld->iCol];..  as
50a0: 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69 73 50 53  sert( pOld->isPS
50b0: 61 6d 70 6c 65 3d 3d 30 20 26 26 20 70 4e 65 77  ample==0 && pNew
50c0: 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30 20 29  ->isPSample==0 )
50d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 53 74  ;.  assert( IsSt
50e0: 61 74 34 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 43  at4 || (pNew->iC
50f0: 6f 6c 3d 3d 30 20 26 26 20 70 4f 6c 64 2d 3e 69  ol==0 && pOld->i
5100: 43 6f 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 69 66  Col==0) );..  if
5110: 28 20 28 6e 45 71 4e 65 77 3e 6e 45 71 4f 6c 64  ( (nEqNew>nEqOld
5120: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 69  ) ) return 1;.#i
5130: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5140: 4c 45 5f 53 54 41 54 34 0a 20 20 69 66 28 20 6e  LE_STAT4.  if( n
5150: 45 71 4e 65 77 3d 3d 6e 45 71 4f 6c 64 20 29 7b  EqNew==nEqOld ){
5160: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69  .    if( pNew->i
5170: 43 6f 6c 3c 70 4f 6c 64 2d 3e 69 43 6f 6c 20 29  Col<pOld->iCol )
5180: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72   return 1;.    r
5190: 65 74 75 72 6e 20 28 70 4e 65 77 2d 3e 69 43 6f  eturn (pNew->iCo
51a0: 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 20 26 26  l==pOld->iCol &&
51b0: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 50   sampleIsBetterP
51c0: 6f 73 74 28 70 41 63 63 75 6d 2c 20 70 4e 65 77  ost(pAccum, pNew
51d0: 2c 20 70 4f 6c 64 29 29 3b 0a 20 20 7d 0a 20 20  , pOld));.  }.  
51e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
51f0: 20 20 72 65 74 75 72 6e 20 28 6e 45 71 4e 65 77    return (nEqNew
5200: 3d 3d 6e 45 71 4f 6c 64 20 26 26 20 70 4e 65 77  ==nEqOld && pNew
5210: 2d 3e 69 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48  ->iHash>pOld->iH
5220: 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ash);.#endif.}..
5230: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63  /*.** Copy the c
5240: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 61 6d 70 6c  ontents of sampl
5250: 65 20 2a 70 4e 65 77 20 69 6e 74 6f 20 74 68 65  e *pNew into the
5260: 20 70 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 20 49   p->a[] array. I
5270: 66 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20  f necessary,.** 
5280: 72 65 6d 6f 76 65 20 74 68 65 20 6c 65 61 73 74  remove the least
5290: 20 64 65 73 69 72 61 62 6c 65 20 73 61 6d 70 6c   desirable sampl
52a0: 65 20 66 72 6f 6d 20 70 2d 3e 61 5b 5d 20 74 6f  e from p->a[] to
52b0: 20 6d 61 6b 65 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73   make room..*/.s
52c0: 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c  tatic void sampl
52d0: 65 49 6e 73 65 72 74 28 53 74 61 74 34 41 63 63  eInsert(Stat4Acc
52e0: 75 6d 20 2a 70 2c 20 53 74 61 74 34 53 61 6d 70  um *p, Stat4Samp
52f0: 6c 65 20 2a 70 4e 65 77 2c 20 69 6e 74 20 6e 45  le *pNew, int nE
5300: 71 5a 65 72 6f 29 7b 0a 20 20 53 74 61 74 34 53  qZero){.  Stat4S
5310: 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65 20 3d  ample *pSample =
5320: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
5330: 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e 6e 4d  /* Stat4Accum.nM
5340: 61 78 45 71 5a 65 72 6f 20 69 73 20 73 65 74 20  axEqZero is set 
5350: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  to the maximum n
5360: 75 6d 62 65 72 20 6f 66 20 6c 65 61 64 69 6e 67  umber of leading
5370: 20 30 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 69   0.  ** values i
5380: 6e 20 74 68 65 20 61 6e 45 71 5b 5d 20 61 72 72  n the anEq[] arr
5390: 61 79 20 6f 66 20 61 6e 79 20 73 61 6d 70 6c 65  ay of any sample
53a0: 20 69 6e 20 53 74 61 74 34 41 63 63 75 6d 2e 61   in Stat4Accum.a
53b0: 5b 5d 2e 20 49 6e 0a 20 20 2a 2a 20 6f 74 68 65  []. In.  ** othe
53c0: 72 20 77 6f 72 64 73 2c 20 69 66 20 6e 4d 61 78  r words, if nMax
53d0: 45 71 5a 65 72 6f 20 69 73 20 6e 2c 20 74 68 65  EqZero is n, the
53e0: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
53f0: 65 64 20 74 68 61 74 20 74 68 65 72 65 0a 20 20  ed that there.  
5400: 2a 2a 20 61 72 65 20 6e 6f 20 73 61 6d 70 6c 65  ** are no sample
5410: 73 20 77 69 74 68 20 53 74 61 74 34 53 61 6d 70  s with Stat4Samp
5420: 6c 65 2e 61 6e 45 71 5b 6d 5d 3d 3d 30 20 66 6f  le.anEq[m]==0 fo
5430: 72 20 28 6d 3e 3d 6e 29 2e 20 2a 2f 0a 20 20 61  r (m>=n). */.  a
5440: 73 73 65 72 74 28 20 49 73 53 74 61 74 34 20 7c  ssert( IsStat4 |
5450: 7c 20 6e 45 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a  | nEqZero==0 );.
5460: 20 20 69 66 28 20 6e 45 71 5a 65 72 6f 3e 70 2d    if( nEqZero>p-
5470: 3e 6e 4d 61 78 45 71 5a 65 72 6f 20 29 7b 0a 20  >nMaxEqZero ){. 
5480: 20 20 20 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f     p->nMaxEqZero
5490: 20 3d 20 6e 45 71 5a 65 72 6f 3b 0a 20 20 7d 0a   = nEqZero;.  }.
54a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
54b0: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 66  NABLE_STAT4.  if
54c0: 28 20 70 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c  ( pNew->isPSampl
54d0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 74  e==0 ){.    Stat
54e0: 34 53 61 6d 70 6c 65 20 2a 70 55 70 67 72 61 64  4Sample *pUpgrad
54f0: 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
5500: 74 28 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e  t( pNew->anEq[pN
5510: 65 77 2d 3e 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a  ew->iCol]>0 );..
5520: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 61 6d 70      /* This samp
5530: 6c 65 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  le is being adde
5540: 64 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  d because the pr
5550: 65 66 69 78 20 74 68 61 74 20 65 6e 64 73 20 69  efix that ends i
5560: 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a  n column .    **
5570: 20 69 43 6f 6c 20 6f 63 63 75 72 73 20 6d 61 6e   iCol occurs man
5580: 79 20 74 69 6d 65 73 20 69 6e 20 74 68 65 20 74  y times in the t
5590: 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  able. However, i
55a0: 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
55b0: 79 0a 20 20 20 20 2a 2a 20 61 64 64 65 64 20 61  y.    ** added a
55c0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61   sample that sha
55d0: 72 65 73 20 74 68 69 73 20 70 72 65 66 69 78 2c  res this prefix,
55e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
55f0: 64 20 74 6f 20 61 64 64 0a 20 20 20 20 2a 2a 20  d to add.    ** 
5600: 74 68 69 73 20 6f 6e 65 2e 20 49 6e 73 74 65 61  this one. Instea
5610: 64 2c 20 75 70 67 72 61 64 65 20 74 68 65 20 70  d, upgrade the p
5620: 72 69 6f 72 69 74 79 20 6f 66 20 74 68 65 20 68  riority of the h
5630: 69 67 68 65 73 74 20 70 72 69 6f 72 69 74 79 0a  ighest priority.
5640: 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20      ** existing 
5650: 73 61 6d 70 6c 65 20 74 68 61 74 20 73 68 61 72  sample that shar
5660: 65 73 20 74 68 69 73 20 70 72 65 66 69 78 2e 20  es this prefix. 
5670: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   */.    for(i=p-
5680: 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30  >nSample-1; i>=0
5690: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 53 74  ; i--){.      St
56a0: 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 20  at4Sample *pOld 
56b0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
56c0: 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 6e 45 71    if( pOld->anEq
56d0: 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20  [pNew->iCol]==0 
56e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
56f0: 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65 20 29  Old->isPSample )
5700: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
5710: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69   assert( pOld->i
5720: 43 6f 6c 3e 70 4e 65 77 2d 3e 69 43 6f 6c 20 29  Col>pNew->iCol )
5730: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5740: 28 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  ( sampleIsBetter
5750: 28 70 2c 20 70 4e 65 77 2c 20 70 4f 6c 64 29 20  (p, pNew, pOld) 
5760: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
5770: 55 70 67 72 61 64 65 3d 3d 30 20 7c 7c 20 73 61  Upgrade==0 || sa
5780: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20  mpleIsBetter(p, 
5790: 70 4f 6c 64 2c 20 70 55 70 67 72 61 64 65 29 20  pOld, pUpgrade) 
57a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70  ){.          pUp
57b0: 67 72 61 64 65 20 3d 20 70 4f 6c 64 3b 0a 20 20  grade = pOld;.  
57c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
57d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 55      }.    if( pU
57e0: 70 67 72 61 64 65 20 29 7b 0a 20 20 20 20 20 20  pgrade ){.      
57f0: 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 20 3d  pUpgrade->iCol =
5800: 20 70 4e 65 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20   pNew->iCol;.   
5810: 20 20 20 70 55 70 67 72 61 64 65 2d 3e 61 6e 45     pUpgrade->anE
5820: 71 5b 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c  q[pUpgrade->iCol
5830: 5d 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70  ] = pNew->anEq[p
5840: 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a  Upgrade->iCol];.
5850: 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 64 5f        goto find_
5860: 6e 65 77 5f 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20  new_min;.    }. 
5870: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5880: 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 72 65  If necessary, re
5890: 6d 6f 76 65 20 73 61 6d 70 6c 65 20 69 4d 69 6e  move sample iMin
58a0: 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
58b0: 72 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65  r the new sample
58c0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 53  . */.  if( p->nS
58d0: 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70  ample>=p->mxSamp
58e0: 6c 65 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53  le ){.    Stat4S
58f0: 61 6d 70 6c 65 20 2a 70 4d 69 6e 20 3d 20 26 70  ample *pMin = &p
5900: 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20  ->a[p->iMin];.  
5910: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71 20    tRowcnt *anEq 
5920: 3d 20 70 4d 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20  = pMin->anEq;.  
5930: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c 74 20    tRowcnt *anLt 
5940: 3d 20 70 4d 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20  = pMin->anLt;.  
5950: 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 44 4c 74    tRowcnt *anDLt
5960: 20 3d 20 70 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a   = pMin->anDLt;.
5970: 20 20 20 20 73 61 6d 70 6c 65 43 6c 65 61 72 28      sampleClear(
5980: 70 2d 3e 64 62 2c 20 70 4d 69 6e 29 3b 0a 20 20  p->db, pMin);.  
5990: 20 20 6d 65 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20    memmove(pMin, 
59a0: 26 70 4d 69 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66  &pMin[1], sizeof
59b0: 28 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53  (p->a[0])*(p->nS
59c0: 61 6d 70 6c 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29  ample-p->iMin-1)
59d0: 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 20 3d  );.    pSample =
59e0: 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c   &p->a[p->nSampl
59f0: 65 2d 31 5d 3b 0a 20 20 20 20 70 53 61 6d 70 6c  e-1];.    pSampl
5a00: 65 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a 20  e->nRowid = 0;. 
5a10: 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71     pSample->anEq
5a20: 20 3d 20 61 6e 45 71 3b 0a 20 20 20 20 70 53 61   = anEq;.    pSa
5a30: 6d 70 6c 65 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e  mple->anDLt = an
5a40: 44 4c 74 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  DLt;.    pSample
5a50: 2d 3e 61 6e 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20  ->anLt = anLt;. 
5a60: 20 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20     p->nSample = 
5a70: 70 2d 3e 6d 78 53 61 6d 70 6c 65 2d 31 3b 0a 20  p->mxSample-1;. 
5a80: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 72 6f   }..  /* The "ro
5a90: 77 73 20 6c 65 73 73 2d 74 68 61 6e 22 20 66 6f  ws less-than" fo
5aa0: 72 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75  r the rowid colu
5ab0: 6d 6e 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  mn must be great
5ac0: 65 72 20 74 68 61 6e 20 74 68 61 74 0a 20 20 2a  er than that.  *
5ad0: 2a 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 73  * for the last s
5ae0: 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 70 2d 3e  ample in the p->
5af0: 61 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72  a[] array. Other
5b00: 77 69 73 65 2c 20 74 68 65 20 73 61 6d 70 6c 65  wise, the sample
5b10: 73 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20  s would.  ** be 
5b20: 6f 75 74 20 6f 66 20 6f 72 64 65 72 2e 20 2a 2f  out of order. */
5b30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5b40: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 61 73  NABLE_STAT4.  as
5b50: 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65  sert( p->nSample
5b60: 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
5b70: 4e 65 77 2d 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f  New->anLt[p->nCo
5b80: 6c 2d 31 5d 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e  l-1] > p->a[p->n
5b90: 53 61 6d 70 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70  Sample-1].anLt[p
5ba0: 2d 3e 6e 43 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e  ->nCol-1] );.#en
5bb0: 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  dif..  /* Insert
5bc0: 20 74 68 65 20 6e 65 77 20 73 61 6d 70 6c 65 20   the new sample 
5bd0: 2a 2f 0a 20 20 70 53 61 6d 70 6c 65 20 3d 20 26  */.  pSample = &
5be0: 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d  p->a[p->nSample]
5bf0: 3b 0a 20 20 73 61 6d 70 6c 65 43 6f 70 79 28 70  ;.  sampleCopy(p
5c00: 2c 20 70 53 61 6d 70 6c 65 2c 20 70 4e 65 77 29  , pSample, pNew)
5c10: 3b 0a 20 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b  ;.  p->nSample++
5c20: 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
5c30: 20 66 69 72 73 74 20 6e 45 71 5a 65 72 6f 20 65   first nEqZero e
5c40: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 6e  ntries in the an
5c50: 45 71 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  Eq[] array. */. 
5c60: 20 6d 65 6d 73 65 74 28 70 53 61 6d 70 6c 65 2d   memset(pSample-
5c70: 3e 61 6e 45 71 2c 20 30 2c 20 73 69 7a 65 6f 66  >anEq, 0, sizeof
5c80: 28 74 52 6f 77 63 6e 74 29 2a 6e 45 71 5a 65 72  (tRowcnt)*nEqZer
5c90: 6f 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  o);..#ifdef SQLI
5ca0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
5cb0: 20 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23   find_new_min:.#
5cc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
5cd0: 53 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d  Sample>=p->mxSam
5ce0: 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ple ){.    int i
5cf0: 4d 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f  Min = -1;.    fo
5d00: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61  r(i=0; i<p->mxSa
5d10: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
5d20: 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d 2e 69 73    if( p->a[i].is
5d30: 50 53 61 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e  PSample ) contin
5d40: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d  ue;.      if( iM
5d50: 69 6e 3c 30 20 7c 7c 20 73 61 6d 70 6c 65 49 73  in<0 || sampleIs
5d60: 42 65 74 74 65 72 28 70 2c 20 26 70 2d 3e 61 5b  Better(p, &p->a[
5d70: 69 4d 69 6e 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29  iMin], &p->a[i])
5d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e   ){.        iMin
5d90: 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = i;.      }.  
5da0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5db0: 69 4d 69 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 70  iMin>=0 );.    p
5dc0: 2d 3e 69 4d 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20  ->iMin = iMin;. 
5dd0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
5de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
5df0: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
5e00: 2f 2a 0a 2a 2a 20 46 69 65 6c 64 20 69 43 68 6e  /*.** Field iChn
5e10: 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62  g of the index b
5e20: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 68 61 73  eing scanned has
5e30: 20 63 68 61 6e 67 65 64 2e 20 53 6f 20 61 74 20   changed. So at 
5e40: 74 68 69 73 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d  this point.** p-
5e50: 3e 63 75 72 72 65 6e 74 20 63 6f 6e 74 61 69 6e  >current contain
5e60: 73 20 61 20 73 61 6d 70 6c 65 20 74 68 61 74 20  s a sample that 
5e70: 72 65 66 6c 65 63 74 73 20 74 68 65 20 70 72 65  reflects the pre
5e80: 76 69 6f 75 73 20 72 6f 77 20 6f 66 20 74 68 65  vious row of the
5e90: 0a 2a 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 76  .** index. The v
5ea0: 61 6c 75 65 20 6f 66 20 61 6e 45 71 5b 69 43 68  alue of anEq[iCh
5eb0: 6e 67 5d 20 61 6e 64 20 73 75 62 73 65 71 75 65  ng] and subseque
5ec0: 6e 74 20 61 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e  nt anEq[] elemen
5ed0: 74 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 65 63  ts are.** correc
5ee0: 74 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  t at this point.
5ef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f00: 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f  samplePushPrevio
5f10: 75 73 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70  us(Stat4Accum *p
5f20: 2c 20 69 6e 74 20 69 43 68 6e 67 29 7b 0a 23 69  , int iChng){.#i
5f30: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5f40: 4c 45 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 69  LE_STAT4.  int i
5f50: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
5f60: 20 61 6e 79 20 73 61 6d 70 6c 65 73 20 66 72 6f   any samples fro
5f70: 6d 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72  m the aBest[] ar
5f80: 72 61 79 20 73 68 6f 75 6c 64 20 62 65 20 70 75  ray should be pu
5f90: 73 68 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 49  shed.  ** into I
5fa0: 6e 64 65 78 53 61 6d 70 6c 65 2e 61 5b 5d 20 61  ndexSample.a[] a
5fb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20 2a  t this point.  *
5fc0: 2f 0a 20 20 66 6f 72 28 69 3d 28 70 2d 3e 6e 43  /.  for(i=(p->nC
5fd0: 6f 6c 2d 32 29 3b 20 69 3e 3d 69 43 68 6e 67 3b  ol-2); i>=iChng;
5fe0: 20 69 2d 2d 29 7b 0a 20 20 20 20 53 74 61 74 34   i--){.    Stat4
5ff0: 53 61 6d 70 6c 65 20 2a 70 42 65 73 74 20 3d 20  Sample *pBest = 
6000: 26 70 2d 3e 61 42 65 73 74 5b 69 5d 3b 0a 20 20  &p->aBest[i];.  
6010: 20 20 70 42 65 73 74 2d 3e 61 6e 45 71 5b 69 5d    pBest->anEq[i]
6020: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
6030: 45 71 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Eq[i];.    if( p
6040: 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53  ->nSample<p->mxS
6050: 61 6d 70 6c 65 20 7c 7c 20 73 61 6d 70 6c 65 49  ample || sampleI
6060: 73 42 65 74 74 65 72 28 70 2c 20 70 42 65 73 74  sBetter(p, pBest
6070: 2c 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d  , &p->a[p->iMin]
6080: 29 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c  ) ){.      sampl
6090: 65 49 6e 73 65 72 74 28 70 2c 20 70 42 65 73 74  eInsert(p, pBest
60a0: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
60b0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
60c0: 20 6e 6f 20 73 61 6d 70 6c 65 20 63 6f 6e 74 61   no sample conta
60d0: 69 6e 73 20 61 6e 20 61 6e 45 71 5b 5d 20 65 6e  ins an anEq[] en
60e0: 74 72 79 20 77 69 74 68 20 61 6e 20 69 6e 64 65  try with an inde
60f0: 78 20 6f 66 0a 20 20 2a 2a 20 70 2d 3e 6e 4d 61  x of.  ** p->nMa
6100: 78 45 71 5a 65 72 6f 20 6f 72 20 67 72 65 61 74  xEqZero or great
6110: 65 72 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  er set to zero. 
6120: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  */.  for(i=p->nS
6130: 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69  ample-1; i>=0; i
6140: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  --){.    int j;.
6150: 20 20 20 20 66 6f 72 28 6a 3d 70 2d 3e 6e 4d 61      for(j=p->nMa
6160: 78 45 71 5a 65 72 6f 3b 20 6a 3c 70 2d 3e 6e 43  xEqZero; j<p->nC
6170: 6f 6c 3b 20 6a 2b 2b 29 20 61 73 73 65 72 74 28  ol; j++) assert(
6180: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d   p->a[i].anEq[j]
6190: 3e 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  >0 );.  }..  /* 
61a0: 55 70 64 61 74 65 20 74 68 65 20 61 6e 45 71 5b  Update the anEq[
61b0: 5d 20 66 69 65 6c 64 73 20 6f 66 20 61 6e 79 20  ] fields of any 
61c0: 73 61 6d 70 6c 65 73 20 61 6c 72 65 61 64 79 20  samples already 
61d0: 63 6f 6c 6c 65 63 74 65 64 2e 20 2a 2f 0a 20 20  collected. */.  
61e0: 69 66 28 20 69 43 68 6e 67 3c 70 2d 3e 6e 4d 61  if( iChng<p->nMa
61f0: 78 45 71 5a 65 72 6f 20 29 7b 0a 20 20 20 20 66  xEqZero ){.    f
6200: 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d  or(i=p->nSample-
6210: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
6220: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6230: 20 20 66 6f 72 28 6a 3d 69 43 68 6e 67 3b 20 6a    for(j=iChng; j
6240: 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
6250: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
6260: 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29  [i].anEq[j]==0 )
6270: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d   p->a[i].anEq[j]
6280: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
6290: 45 71 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  Eq[j];.      }. 
62a0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4d 61 78     }.    p->nMax
62b0: 45 71 5a 65 72 6f 20 3d 20 69 43 68 6e 67 3b 0a  EqZero = iChng;.
62c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
62d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
62e0: 4e 41 42 4c 45 5f 53 54 41 54 33 29 20 26 26 20  NABLE_STAT3) && 
62f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6300: 45 4e 41 42 4c 45 5f 53 54 41 54 34 29 0a 20 20  ENABLE_STAT4).  
6310: 69 66 28 20 69 43 68 6e 67 3d 3d 30 20 29 7b 0a  if( iChng==0 ){.
6320: 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20      tRowcnt nLt 
6330: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c  = p->current.anL
6340: 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f 77 63 6e  t[0];.    tRowcn
6350: 74 20 6e 45 71 20 3d 20 70 2d 3e 63 75 72 72 65  t nEq = p->curre
6360: 6e 74 2e 61 6e 45 71 5b 30 5d 3b 0a 0a 20 20 20  nt.anEq[0];..   
6370: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
6380: 73 20 69 73 20 74 6f 20 62 65 20 61 20 70 65 72  s is to be a per
6390: 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 49 66  iodic sample. If
63a0: 20 73 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a   so, add it. */.
63b0: 20 20 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e      if( (nLt/p->
63c0: 6e 50 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b  nPSample)!=(nLt+
63d0: 6e 45 71 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65  nEq)/p->nPSample
63e0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72   ){.      p->cur
63f0: 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d  rent.isPSample =
6400: 20 31 3b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65   1;.      sample
6410: 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63 75  Insert(p, &p->cu
6420: 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20  rrent, 0);.     
6430: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53   p->current.isPS
6440: 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ample = 0;.    }
6450: 65 6c 73 65 20 0a 0a 20 20 20 20 2f 2a 20 4f 72  else ..    /* Or
6460: 20 69 66 20 69 74 20 69 73 20 61 20 6e 6f 6e 2d   if it is a non-
6470: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e  periodic sample.
6480: 20 41 64 64 20 69 74 20 69 6e 20 74 68 69 73 20   Add it in this 
6490: 63 61 73 65 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  case too. */.   
64a0: 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c   if( p->nSample<
64b0: 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 0a 20 20 20  p->mxSample .   
64c0: 20 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74    || sampleIsBet
64d0: 74 65 72 28 70 2c 20 26 70 2d 3e 63 75 72 72 65  ter(p, &p->curre
64e0: 6e 74 2c 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69  nt, &p->a[p->iMi
64f0: 6e 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  n]) .    ){.    
6500: 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 70    sampleInsert(p
6510: 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 30  , &p->current, 0
6520: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
6530: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
6540: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
6550: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 55 4e 55 53  _OR_STAT4.  UNUS
6560: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 70 20  ED_PARAMETER( p 
6570: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
6580: 4d 45 54 45 52 28 20 69 43 68 6e 67 20 29 3b 0a  METER( iChng );.
6590: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
65a0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
65b0: 66 20 74 68 65 20 73 74 61 74 5f 70 75 73 68 20  f the stat_push 
65c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73  SQL function:  s
65d0: 74 61 74 5f 70 75 73 68 28 50 2c 43 2c 52 29 0a  tat_push(P,C,R).
65e0: 2a 2a 20 41 72 67 75 6d 65 6e 74 73 3a 0a 2a 2a  ** Arguments:.**
65f0: 0a 2a 2a 20 20 20 20 50 20 20 20 20 20 50 6f 69  .**    P     Poi
6600: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
6610: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 63 72  4Accum object cr
6620: 65 61 74 65 64 20 62 79 20 73 74 61 74 5f 69 6e  eated by stat_in
6630: 69 74 28 29 0a 2a 2a 20 20 20 20 43 20 20 20 20  it().**    C    
6640: 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 6d   Index of left-m
6650: 6f 73 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 64 69  ost column to di
6660: 66 66 65 72 20 66 72 6f 6d 20 70 72 65 76 69 6f  ffer from previo
6670: 75 73 20 72 6f 77 0a 2a 2a 20 20 20 20 52 20 20  us row.**    R  
6680: 20 20 20 52 6f 77 69 64 20 66 6f 72 20 74 68 65     Rowid for the
6690: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 4d   current row.  M
66a0: 69 67 68 74 20 62 65 20 61 20 6b 65 79 20 72 65  ight be a key re
66b0: 63 6f 72 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20  cord for.**     
66c0: 20 20 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57       WITHOUT ROW
66d0: 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ID tables..**.**
66e0: 20 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   This SQL functi
66f0: 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
6700: 73 20 4e 55 4c 4c 2e 20 20 49 74 27 73 20 70 75  s NULL.  It's pu
6710: 72 70 6f 73 65 20 69 74 20 74 6f 20 61 63 63 75  rpose it to accu
6720: 6d 75 6c 61 74 65 0a 2a 2a 20 73 74 61 74 69 73  mulate.** statis
6730: 74 69 63 61 6c 20 64 61 74 61 20 61 6e 64 2f 6f  tical data and/o
6740: 72 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65  r samples in the
6750: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
6760: 63 74 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ct about the.** 
6770: 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c  index being anal
6780: 79 7a 65 64 2e 20 20 54 68 65 20 73 74 61 74 5f  yzed.  The stat_
6790: 67 65 74 28 29 20 53 51 4c 20 66 75 6e 63 74 69  get() SQL functi
67a0: 6f 6e 20 77 69 6c 6c 20 6c 61 74 65 72 20 62 65  on will later be
67b0: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 65 78 74 72   used to.** extr
67c0: 61 63 74 20 72 65 6c 65 76 61 6e 74 20 69 6e 66  act relevant inf
67d0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 63 6f 6e  ormation for con
67e0: 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 73 71  structing the sq
67f0: 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65  lite_statN table
6800: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 20 70  s..**.** The R p
6810: 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 6c 79  arameter is only
6820: 20 75 73 65 64 20 66 6f 72 20 53 54 41 54 33 20   used for STAT3 
6830: 61 6e 64 20 53 54 41 54 34 0a 2a 2f 0a 73 74 61  and STAT4.*/.sta
6840: 74 69 63 20 76 6f 69 64 20 73 74 61 74 50 75 73  tic void statPus
6850: 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  h(.  sqlite3_con
6860: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6870: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6880: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6890: 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  v.){.  int i;.. 
68a0: 20 2f 2a 20 54 68 65 20 74 68 72 65 65 20 66 75   /* The three fu
68b0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
68c0: 20 2a 2f 0a 20 20 53 74 61 74 34 41 63 63 75 6d   */.  Stat4Accum
68d0: 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63 63 75   *p = (Stat4Accu
68e0: 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  m*)sqlite3_value
68f0: 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a  _blob(argv[0]);.
6900: 20 20 69 6e 74 20 69 43 68 6e 67 20 3d 20 73 71    int iChng = sq
6910: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
6920: 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 55 4e 55  argv[1]);..  UNU
6930: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 61  SED_PARAMETER( a
6940: 72 67 63 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rgc );.  UNUSED_
6950: 50 41 52 41 4d 45 54 45 52 28 20 63 6f 6e 74 65  PARAMETER( conte
6960: 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  xt );.  assert( 
6970: 70 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 61  p->nCol>0 );.  a
6980: 73 73 65 72 74 28 20 69 43 68 6e 67 3c 70 2d 3e  ssert( iChng<p->
6990: 6e 43 6f 6c 20 29 3b 0a 0a 20 20 69 66 28 20 70  nCol );..  if( p
69a0: 2d 3e 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  ->nRow==0 ){.   
69b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
69c0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 74 68  first call to th
69d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 44 6f 20  is function. Do 
69e0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 20  initialization. 
69f0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6a00: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20  i<p->nCol; i++) 
6a10: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6a20: 69 5d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  i] = 1;.  }else{
6a30: 0a 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61  .    /* Second a
6a40: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  nd subsequent ca
6a50: 6c 6c 73 20 67 65 74 20 70 72 6f 63 65 73 73 65  lls get processe
6a60: 64 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 73 61  d here */.    sa
6a70: 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73  mplePushPrevious
6a80: 28 70 2c 20 69 43 68 6e 67 29 3b 0a 0a 20 20 20  (p, iChng);..   
6a90: 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 44 4c 74   /* Update anDLt
6aa0: 5b 5d 2c 20 61 6e 4c 74 5b 5d 20 61 6e 64 20 61  [], anLt[] and a
6ab0: 6e 45 71 5b 5d 20 74 6f 20 72 65 66 6c 65 63 74  nEq[] to reflect
6ac0: 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
6ad0: 20 61 70 70 6c 79 0a 20 20 20 20 2a 2a 20 74 6f   apply.    ** to
6ae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
6af0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a   of the index. *
6b00: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6b10: 3c 69 43 68 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  <iChng; i++){.  
6b20: 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61      p->current.a
6b30: 6e 45 71 5b 69 5d 2b 2b 3b 0a 20 20 20 20 7d 0a  nEq[i]++;.    }.
6b40: 20 20 20 20 66 6f 72 28 69 3d 69 43 68 6e 67 3b      for(i=iChng;
6b50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
6b60: 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65  {.      p->curre
6b70: 6e 74 2e 61 6e 44 4c 74 5b 69 5d 2b 2b 3b 0a 23  nt.anDLt[i]++;.#
6b80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6b90: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
6ba0: 54 34 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  T4.      p->curr
6bb0: 65 6e 74 2e 61 6e 4c 74 5b 69 5d 20 2b 3d 20 70  ent.anLt[i] += p
6bc0: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
6bd0: 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ];.#endif.      
6be0: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
6bf0: 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  i] = 1;.    }.  
6c00: 7d 0a 20 20 70 2d 3e 6e 52 6f 77 2b 2b 3b 0a 23  }.  p->nRow++;.#
6c10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6c20: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
6c30: 54 34 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  T4.  if( sqlite3
6c40: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
6c50: 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  [2])==SQLITE_INT
6c60: 45 47 45 52 20 29 7b 0a 20 20 20 20 73 61 6d 70  EGER ){.    samp
6c70: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
6c80: 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72 65  p->db, &p->curre
6c90: 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  nt, sqlite3_valu
6ca0: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 32 5d 29  e_int64(argv[2])
6cb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6cc0: 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 28 70  sampleSetRowid(p
6cd0: 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72 72 65 6e  ->db, &p->curren
6ce0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
6cf0: 5f 62 79 74 65 73 28 61 72 67 76 5b 32 5d 29 2c  _bytes(argv[2]),
6d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6d30: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
6d40: 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  2]));.  }.  p->c
6d50: 75 72 72 65 6e 74 2e 69 48 61 73 68 20 3d 20 70  urrent.iHash = p
6d60: 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69 50 72 6e  ->iPrn = p->iPrn
6d70: 2a 31 31 30 33 35 31 35 32 34 35 20 2b 20 31 32  *1103515245 + 12
6d80: 33 34 35 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  345;.#endif..#if
6d90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6da0: 45 5f 53 54 41 54 34 0a 20 20 7b 0a 20 20 20 20  E_STAT4.  {.    
6db0: 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d  tRowcnt nLt = p-
6dc0: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 70 2d  >current.anLt[p-
6dd0: 3e 6e 43 6f 6c 2d 31 5d 3b 0a 0a 20 20 20 20 2f  >nCol-1];..    /
6de0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
6df0: 69 73 20 74 6f 20 62 65 20 61 20 70 65 72 69 6f  is to be a perio
6e00: 64 69 63 20 73 61 6d 70 6c 65 2e 20 49 66 20 73  dic sample. If s
6e10: 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f 0a 20 20  o, add it. */.  
6e20: 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50    if( (nLt/p->nP
6e30: 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74 2b 31 29  Sample)!=(nLt+1)
6e40: 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a  /p->nPSample ){.
6e50: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
6e60: 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a  .isPSample = 1;.
6e70: 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74        p->current
6e80: 2e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  .iCol = 0;.     
6e90: 20 73 61 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c   sampleInsert(p,
6ea0: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 70 2d   &p->current, p-
6eb0: 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  >nCol-1);.      
6ec0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61  p->current.isPSa
6ed0: 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  mple = 0;.    }.
6ee0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
6ef0: 68 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79  he aBest[] array
6f00: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  . */.    for(i=0
6f10: 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c 2d 31 29 3b  ; i<(p->nCol-1);
6f20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
6f30: 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20 3d 20 69  current.iCol = i
6f40: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69  ;.      if( i>=i
6f50: 43 68 6e 67 20 7c 7c 20 73 61 6d 70 6c 65 49 73  Chng || sampleIs
6f60: 42 65 74 74 65 72 50 6f 73 74 28 70 2c 20 26 70  BetterPost(p, &p
6f70: 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70 2d 3e 61  ->current, &p->a
6f80: 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20 20 20 20  Best[i]) ){.    
6f90: 20 20 20 20 73 61 6d 70 6c 65 43 6f 70 79 28 70      sampleCopy(p
6fa0: 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69 5d 2c 20  , &p->aBest[i], 
6fb0: 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b 0a 20 20  &p->current);.  
6fc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6fd0: 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20  #endif.}.static 
6fe0: 63 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73 74  const FuncDef st
6ff0: 61 74 50 75 73 68 46 75 6e 63 64 65 66 20 3d 20  atPushFuncdef = 
7000: 7b 0a 20 20 32 2b 49 73 53 74 61 74 33 34 2c 20  {.  2+IsStat34, 
7010: 20 20 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a       /* nArg */.
7020: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20    SQLITE_UTF8,  
7030: 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20     /* funcFlags 
7040: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
7050: 20 20 20 20 20 20 2f 2a 20 70 55 73 65 72 44 61        /* pUserDa
7060: 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
7070: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
7080: 74 20 2a 2f 0a 20 20 73 74 61 74 50 75 73 68 2c  t */.  statPush,
7090: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 46 75 6e          /* xSFun
70a0: 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
70b0: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61          /* xFina
70c0: 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f  lize */.  "stat_
70d0: 70 75 73 68 22 2c 20 20 20 20 20 2f 2a 20 7a 4e  push",     /* zN
70e0: 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a  ame */.  {0}.};.
70f0: 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45  .#define STAT_GE
7100: 54 5f 53 54 41 54 31 20 30 20 20 20 20 20 20 20  T_STAT1 0       
7110: 20 20 20 2f 2a 20 22 73 74 61 74 22 20 63 6f 6c     /* "stat" col
7120: 75 6d 6e 20 6f 66 20 73 74 61 74 31 20 74 61 62  umn of stat1 tab
7130: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  le */.#define ST
7140: 41 54 5f 47 45 54 5f 52 4f 57 49 44 20 31 20 20  AT_GET_ROWID 1  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 22 72 6f 77 69          /* "rowi
7160: 64 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61  d" column of sta
7170: 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23  t[34] entry */.#
7180: 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f  define STAT_GET_
7190: 4e 45 51 20 20 20 32 20 20 20 20 20 20 20 20 20  NEQ   2         
71a0: 20 2f 2a 20 22 6e 65 71 22 20 63 6f 6c 75 6d 6e   /* "neq" column
71b0: 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74   of stat[34] ent
71c0: 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  ry */.#define ST
71d0: 41 54 5f 47 45 54 5f 4e 4c 54 20 20 20 33 20 20  AT_GET_NLT   3  
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 22 6e 6c 74 22          /* "nlt"
71f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 5b   column of stat[
7200: 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 23 64 65  34] entry */.#de
7210: 66 69 6e 65 20 53 54 41 54 5f 47 45 54 5f 4e 44  fine STAT_GET_ND
7220: 4c 54 20 20 34 20 20 20 20 20 20 20 20 20 20 2f  LT  4          /
7230: 2a 20 22 6e 64 6c 74 22 20 63 6f 6c 75 6d 6e 20  * "ndlt" column 
7240: 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e 74 72  of stat[34] entr
7250: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  y */../*.** Impl
7260: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7270: 65 20 73 74 61 74 5f 67 65 74 28 50 2c 4a 29 20  e stat_get(P,J) 
7280: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  SQL function.  T
7290: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
72a0: 2a 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20  * used to query 
72b0: 73 74 61 74 69 73 74 69 63 61 6c 20 69 6e 66 6f  statistical info
72c0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73  rmation that has
72d0: 20 62 65 65 6e 20 67 61 74 68 65 72 65 64 20 69   been gathered i
72e0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 53 74 61 74 34  nto.** the Stat4
72f0: 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 62 79 20  Accum object by 
7300: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 73  prior calls to s
7310: 74 61 74 5f 70 75 73 68 28 29 2e 20 20 54 68 65  tat_push().  The
7320: 20 50 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20   P parameter.** 
7330: 68 61 73 20 74 79 70 65 20 42 4c 4f 42 20 62 75  has type BLOB bu
7340: 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  t it is really j
7350: 75 73 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ust a pointer to
7360: 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 20   the Stat4Accum 
7370: 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20 63  object..** The c
7380: 6f 6e 74 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  ontent to return
7390: 65 64 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ed is determined
73a0: 20 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65   by the paramete
73b0: 72 20 4a 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  r J.** which is 
73c0: 6f 6e 65 20 6f 66 20 74 68 65 20 53 54 41 54 5f  one of the STAT_
73d0: 47 45 54 5f 78 78 78 78 20 76 61 6c 75 65 73 20  GET_xxxx values 
73e0: 64 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a  defined above..*
73f0: 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 5f 67 65  *.** The stat_ge
7400: 74 28 50 2c 4a 29 20 66 75 6e 63 74 69 6f 6e 20  t(P,J) function 
7410: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
7420: 20 74 6f 20 67 65 6e 65 72 69 63 20 53 51 4c 2e   to generic SQL.
7430: 20 20 49 74 20 69 73 0a 2a 2a 20 69 6e 73 65 72    It is.** inser
7440: 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ted as part of a
7450: 20 6d 61 6e 75 61 6c 6c 79 20 63 6f 6e 73 74 72   manually constr
7460: 75 63 74 65 64 20 62 79 74 65 63 6f 64 65 20 70  ucted bytecode p
7470: 72 6f 67 72 61 6d 2e 20 20 28 53 65 65 0a 2a 2a  rogram.  (See.**
7480: 20 74 68 65 20 63 61 6c 6c 53 74 61 74 47 65 74   the callStatGet
7490: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77  () routine below
74a0: 2e 29 20 20 49 74 20 69 73 20 67 75 61 72 61 6e  .)  It is guaran
74b0: 74 65 65 64 20 74 68 61 74 20 74 68 65 20 50 0a  teed that the P.
74c0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  ** parameter wil
74d0: 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 70 6f  l always be a po
74e0: 69 6e 65 72 20 74 6f 20 61 20 53 74 61 74 34 41  iner to a Stat4A
74f0: 63 63 75 6d 20 6f 62 6a 65 63 74 2c 20 6e 65 76  ccum object, nev
7500: 65 72 20 61 0a 2a 2a 20 4e 55 4c 4c 2e 0a 2a 2a  er a.** NULL..**
7510: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 53  .** If neither S
7520: 54 41 54 33 20 6e 6f 72 20 53 54 41 54 34 20 61  TAT3 nor STAT4 a
7530: 72 65 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  re enabled, then
7540: 20 4a 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20   J is always.** 
7550: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 61  STAT_GET_STAT1 a
7560: 6e 64 20 69 73 20 68 65 6e 63 65 20 6f 6d 69 74  nd is hence omit
7570: 74 65 64 20 61 6e 64 20 74 68 69 73 20 72 6f 75  ted and this rou
7580: 74 69 6e 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20  tine becomes.** 
7590: 61 20 6f 6e 65 2d 70 61 72 61 6d 65 74 65 72 20  a one-parameter 
75a0: 66 75 6e 63 74 69 6f 6e 2c 20 73 74 61 74 5f 67  function, stat_g
75b0: 65 74 28 50 29 2c 20 74 68 61 74 20 61 6c 77 61  et(P), that alwa
75c0: 79 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ys returns the.*
75d0: 2a 20 73 74 61 74 31 20 74 61 62 6c 65 20 65 6e  * stat1 table en
75e0: 74 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  try information.
75f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7600: 73 74 61 74 47 65 74 28 0a 20 20 73 71 6c 69 74  statGet(.  sqlit
7610: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
7620: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
7630: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7640: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53 74 61   **argv.){.  Sta
7650: 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53 74  t4Accum *p = (St
7660: 61 74 34 41 63 63 75 6d 2a 29 73 71 6c 69 74 65  at4Accum*)sqlite
7670: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
7680: 76 5b 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51  v[0]);.#ifdef SQ
7690: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
76a0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20  3_OR_STAT4.  /* 
76b0: 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 20  STAT3 and STAT4 
76c0: 68 61 76 65 20 61 20 70 61 72 61 6d 65 74 65 72  have a parameter
76d0: 20 6f 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   on this routine
76e0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 43 61 6c 6c  . */.  int eCall
76f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
7700: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
7710: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32   assert( argc==2
7720: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 43   );.  assert( eC
7730: 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54  all==STAT_GET_ST
7740: 41 54 31 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54  AT1 || eCall==ST
7750: 41 54 5f 47 45 54 5f 4e 45 51 20 0a 20 20 20 20  AT_GET_NEQ .    
7760: 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53 54 41     || eCall==STA
7770: 54 5f 47 45 54 5f 52 4f 57 49 44 20 7c 7c 20 65  T_GET_ROWID || e
7780: 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e  Call==STAT_GET_N
7790: 4c 54 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 61  LT.       || eCa
77a0: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 4e 44 4c  ll==STAT_GET_NDL
77b0: 54 20 0a 20 20 29 3b 0a 20 20 69 66 28 20 65 43  T .  );.  if( eC
77c0: 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54  all==STAT_GET_ST
77d0: 41 54 31 20 29 0a 23 65 6c 73 65 0a 20 20 61 73  AT1 ).#else.  as
77e0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
77f0: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
7800: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  /* Return the va
7810: 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 69 6e 20  lue to store in 
7820: 74 68 65 20 22 73 74 61 74 22 20 63 6f 6c 75 6d  the "stat" colum
7830: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
7840: 73 74 61 74 31 0a 20 20 20 20 2a 2a 20 74 61 62  stat1.    ** tab
7850: 6c 65 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  le for this inde
7860: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
7870: 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20   The value is a 
7880: 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73 65 64 20  string composed 
7890: 6f 66 20 61 20 6c 69 73 74 20 6f 66 20 69 6e 74  of a list of int
78a0: 65 67 65 72 73 20 64 65 73 63 72 69 62 69 6e 67  egers describing
78b0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64   .    ** the ind
78c0: 65 78 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e  ex. The first in
78d0: 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69 73  teger in the lis
78e0: 74 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  t is the total n
78f0: 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a  umber of .    **
7900: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
7910: 69 6e 64 65 78 2e 20 54 68 65 72 65 20 69 73 20  index. There is 
7920: 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  one additional i
7930: 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6c 69  nteger in the li
7940: 73 74 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  st .    ** for e
7950: 61 63 68 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  ach indexed colu
7960: 6d 6e 2e 20 54 68 69 73 20 61 64 64 69 74 69 6f  mn. This additio
7970: 6e 61 6c 20 69 6e 74 65 67 65 72 20 69 73 20 61  nal integer is a
7980: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 0a 20 20  n estimate of.  
7990: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
79a0: 6f 66 20 72 6f 77 73 20 6d 61 74 63 68 65 64 20  of rows matched 
79b0: 62 79 20 61 20 73 74 61 62 62 69 6e 67 20 71 75  by a stabbing qu
79c0: 65 72 79 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  ery on the index
79d0: 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20   using.    ** a 
79e0: 6b 65 79 20 77 69 74 68 20 74 68 65 20 63 6f 72  key with the cor
79f0: 72 65 73 70 6f 6e 64 69 6e 67 20 6e 75 6d 62 65  responding numbe
7a00: 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 6e 20  r of fields. In 
7a10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
7a20: 20 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78   ** if the index
7a30: 20 69 73 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 28   is on columns (
7a40: 61 2c 62 29 20 61 6e 64 20 74 68 65 20 73 71 6c  a,b) and the sql
7a50: 69 74 65 5f 73 74 61 74 31 20 76 61 6c 75 65 20  ite_stat1 value 
7a60: 69 73 20 0a 20 20 20 20 2a 2a 20 22 31 30 30 20  is .    ** "100 
7a70: 31 30 20 32 22 2c 20 74 68 65 6e 20 53 51 4c 69  10 2", then SQLi
7a80: 74 65 20 65 73 74 69 6d 61 74 65 73 20 74 68 61  te estimates tha
7a90: 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t:.    **.    **
7aa0: 20 20 20 2a 20 74 68 65 20 69 6e 64 65 78 20 63     * the index c
7ab0: 6f 6e 74 61 69 6e 73 20 31 30 30 20 72 6f 77 73  ontains 100 rows
7ac0: 2c 0a 20 20 20 20 2a 2a 20 20 20 2a 20 22 57 48  ,.    **   * "WH
7ad0: 45 52 45 20 61 3d 3f 22 20 6d 61 74 63 68 65 73  ERE a=?" matches
7ae0: 20 31 30 20 72 6f 77 73 2c 20 61 6e 64 0a 20 20   10 rows, and.  
7af0: 20 20 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20    **   * "WHERE 
7b00: 61 3d 3f 20 41 4e 44 20 62 3d 3f 22 20 6d 61 74  a=? AND b=?" mat
7b10: 63 68 65 73 20 32 20 72 6f 77 73 2e 0a 20 20 20  ches 2 rows..   
7b20: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 44 20   **.    ** If D 
7b30: 69 73 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  is the count of 
7b40: 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 73 20  distinct values 
7b50: 61 6e 64 20 4b 20 69 73 20 74 68 65 20 74 6f 74  and K is the tot
7b60: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20  al number of .  
7b70: 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
7b80: 65 61 63 68 20 65 73 74 69 6d 61 74 65 20 69 73  each estimate is
7b90: 20 63 6f 6d 70 75 74 65 64 20 61 73 3a 0a 20 20   computed as:.  
7ba0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
7bb0: 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31 29 2f 44     I = (K+D-1)/D
7bc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
7bd0: 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   *z;.    int i;.
7be0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 74 20  .    char *zRet 
7bf0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
7c00: 65 72 6f 28 20 28 70 2d 3e 6e 4b 65 79 43 6f 6c  ero( (p->nKeyCol
7c10: 2b 31 29 2a 32 35 20 29 3b 0a 20 20 20 20 69 66  +1)*25 );.    if
7c20: 28 20 7a 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zRet==0 ){.   
7c30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c40: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
7c50: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65  ntext);.      re
7c60: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
7c70: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7c80: 66 28 32 34 2c 20 7a 52 65 74 2c 20 22 25 6c 6c  f(24, zRet, "%ll
7c90: 75 22 2c 20 28 75 36 34 29 70 2d 3e 6e 52 6f 77  u", (u64)p->nRow
7ca0: 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 52 65 74 20  );.    z = zRet 
7cb0: 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
7cc0: 30 28 7a 52 65 74 29 3b 0a 20 20 20 20 66 6f 72  0(zRet);.    for
7cd0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4b 65 79 43  (i=0; i<p->nKeyC
7ce0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7cf0: 75 36 34 20 6e 44 69 73 74 69 6e 63 74 20 3d 20  u64 nDistinct = 
7d00: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74  p->current.anDLt
7d10: 5b 69 5d 20 2b 20 31 3b 0a 20 20 20 20 20 20 75  [i] + 1;.      u
7d20: 36 34 20 69 56 61 6c 20 3d 20 28 70 2d 3e 6e 52  64 iVal = (p->nR
7d30: 6f 77 20 2b 20 6e 44 69 73 74 69 6e 63 74 20 2d  ow + nDistinct -
7d40: 20 31 29 20 2f 20 6e 44 69 73 74 69 6e 63 74 3b   1) / nDistinct;
7d50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7d60: 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c 20 22  nprintf(24, z, "
7d70: 20 25 6c 6c 75 22 2c 20 69 56 61 6c 29 3b 0a 20   %llu", iVal);. 
7d80: 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
7d90: 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
7da0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 63      assert( p->c
7db0: 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 29  urrent.anEq[i] )
7dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
7dd0: 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 26  rt( z[0]=='\0' &
7de0: 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 0a 20 20 20  & z>zRet );..   
7df0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7e00: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
7e10: 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  et, -1, sqlite3_
7e20: 66 72 65 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  free);.  }.#ifde
7e30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7e40: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
7e50: 20 65 6c 73 65 20 69 66 28 20 65 43 61 6c 6c 3d   else if( eCall=
7e60: 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20  =STAT_GET_ROWID 
7e70: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 47  ){.    if( p->iG
7e80: 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 61  et<0 ){.      sa
7e90: 6d 70 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73  mplePushPrevious
7ea0: 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d  (p, 0);.      p-
7eb0: 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d  >iGet = 0;.    }
7ec0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 47 65 74  .    if( p->iGet
7ed0: 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20  <p->nSample ){. 
7ee0: 20 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c 65       Stat4Sample
7ef0: 20 2a 70 53 20 3d 20 70 2d 3e 61 20 2b 20 70 2d   *pS = p->a + p-
7f00: 3e 69 47 65 74 3b 0a 20 20 20 20 20 20 69 66 28  >iGet;.      if(
7f10: 20 70 53 2d 3e 6e 52 6f 77 69 64 3d 3d 30 20 29   pS->nRowid==0 )
7f20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7f30: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
7f40: 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75 2e 69 52  ontext, pS->u.iR
7f50: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  owid);.      }el
7f60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7f70: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
7f80: 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75 2e 61  context, pS->u.a
7f90: 52 6f 77 69 64 2c 20 70 53 2d 3e 6e 52 6f 77 69  Rowid, pS->nRowi
7fa0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
7fc0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
7fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 52 6f    }else{.    tRo
7ff0: 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20 30 3b 0a  wcnt *aCnt = 0;.
8000: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8010: 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20  iGet<p->nSample 
8020: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 65  );.    switch( e
8030: 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 61  Call ){.      ca
8040: 73 65 20 53 54 41 54 5f 47 45 54 5f 4e 45 51 3a  se STAT_GET_NEQ:
8050: 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d    aCnt = p->a[p-
8060: 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20 62 72 65  >iGet].anEq; bre
8070: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8080: 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20 20 61 43  TAT_GET_NLT:  aC
8090: 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47 65  nt = p->a[p->iGe
80a0: 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61 6b 3b 0a  t].anLt; break;.
80b0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
80c0: 0a 20 20 20 20 20 20 20 20 61 43 6e 74 20 3d 20  .        aCnt = 
80d0: 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e  p->a[p->iGet].an
80e0: 44 4c 74 3b 20 0a 20 20 20 20 20 20 20 20 70 2d  DLt; .        p-
80f0: 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20 20 20 20  >iGet++;.       
8100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8110: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 49      }..    if( I
8120: 73 53 74 61 74 33 20 29 7b 0a 20 20 20 20 20 20  sStat3 ){.      
8130: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
8140: 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 69  nt64(context, (i
8150: 36 34 29 61 43 6e 74 5b 30 5d 29 3b 0a 20 20 20  64)aCnt[0]);.   
8160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
8170: 61 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c 69 74  ar *zRet = sqlit
8180: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e  e3MallocZero(p->
8190: 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20 20 20 20  nCol * 25);.    
81a0: 20 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b    if( zRet==0 ){
81b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
81c0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
81d0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
81e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
81f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
8200: 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 52 65 74    char *z = zRet
8210: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
8220: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
8230: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
8240: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32  lite3_snprintf(2
8250: 34 2c 20 7a 2c 20 22 25 6c 6c 75 20 22 2c 20 28  4, z, "%llu ", (
8260: 75 36 34 29 61 43 6e 74 5b 69 5d 29 3b 0a 20 20  u64)aCnt[i]);.  
8270: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c          z += sql
8280: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
8290: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
82a0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
82b0: 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52 65 74 20  ='\0' && z>zRet 
82c0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 5b 2d 31 5d  );.        z[-1]
82d0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
82e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
82f0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
8300: 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  et, -1, sqlite3_
8310: 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  free);.      }. 
8320: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
8330: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
8340: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
8350: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8360: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
8370: 5f 50 41 52 41 4d 45 54 45 52 28 20 61 72 67 63  _PARAMETER( argc
8380: 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61   );.#endif.}.sta
8390: 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65  tic const FuncDe
83a0: 66 20 73 74 61 74 47 65 74 46 75 6e 63 64 65 66  f statGetFuncdef
83b0: 20 3d 20 7b 0a 20 20 31 2b 49 73 53 74 61 74 33   = {.  1+IsStat3
83c0: 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  4,      /* nArg 
83d0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
83e0: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61  ,     /* funcFla
83f0: 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  gs */.  0,      
8400: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
8410: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
8420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
8430: 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 47 65  Next */.  statGe
8440: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53  t,         /* xS
8450: 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Func */.  0,    
8460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
8470: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74  inalize */.  "st
8480: 61 74 5f 67 65 74 22 2c 20 20 20 20 20 20 2f 2a  at_get",      /*
8490: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
84a0: 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  };..static void 
84b0: 63 61 6c 6c 53 74 61 74 47 65 74 28 56 64 62 65  callStatGet(Vdbe
84c0: 20 2a 76 2c 20 69 6e 74 20 72 65 67 53 74 61 74   *v, int regStat
84d0: 34 2c 20 69 6e 74 20 69 50 61 72 61 6d 2c 20 69  4, int iParam, i
84e0: 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20 20 61 73  nt regOut){.  as
84f0: 73 65 72 74 28 20 72 65 67 4f 75 74 21 3d 72 65  sert( regOut!=re
8500: 67 53 74 61 74 34 20 26 26 20 72 65 67 4f 75 74  gStat4 && regOut
8510: 21 3d 72 65 67 53 74 61 74 34 2b 31 20 29 3b 0a  !=regStat4+1 );.
8520: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8530: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
8540: 41 54 34 0a 20 20 73 71 6c 69 74 65 33 56 64 62  AT4.  sqlite3Vdb
8550: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8560: 74 65 67 65 72 2c 20 69 50 61 72 61 6d 2c 20 72  teger, iParam, r
8570: 65 67 53 74 61 74 34 2b 31 29 3b 0a 23 65 6c 69  egStat4+1);.#eli
8580: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8590: 20 61 73 73 65 72 74 28 20 69 50 61 72 61 6d 3d   assert( iParam=
85a0: 3d 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20  =STAT_GET_STAT1 
85b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
85c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 69 50 61  D_PARAMETER( iPa
85d0: 72 61 6d 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ram );.#endif.  
85e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
85f0: 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
8600: 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2c 20  0, 0, regStat4, 
8610: 72 65 67 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  regOut,.        
8620: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
8630: 72 2a 29 26 73 74 61 74 47 65 74 46 75 6e 63 64  r*)&statGetFuncd
8640: 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
8650: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
8660: 61 6e 67 65 50 35 28 76 2c 20 31 20 2b 20 49 73  angeP5(v, 1 + Is
8670: 53 74 61 74 33 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Stat34);.}../*.*
8680: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8690: 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73 69  to do an analysi
86a0: 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73  s of all indices
86b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
86c0: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62  .** a single tab
86d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
86e0: 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62  id analyzeOneTab
86f0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
8700: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
8710: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
8720: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
8730: 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20 69 6e  * Table whose in
8740: 64 69 63 65 73 20 61 72 65 20 74 6f 20 62 65 20  dices are to be 
8750: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
8760: 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 2c 20 2f  dex *pOnlyIdx, /
8770: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f  * If not NULL, o
8780: 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74 68 69 73  nly analyze this
8790: 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   one index */.  
87a0: 69 6e 74 20 69 53 74 61 74 43 75 72 2c 20 20 20  int iStatCur,   
87b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 56 64 62   /* Index of Vdb
87c0: 65 43 75 72 73 6f 72 20 74 68 61 74 20 77 72 69  eCursor that wri
87d0: 74 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 73  tes the sqlite_s
87e0: 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tat1 table */.  
87f0: 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20 20 20 20  int iMem,       
8800: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65   /* Available me
8810: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 62  mory locations b
8820: 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  egin here */.  i
8830: 6e 74 20 69 54 61 62 20 20 20 20 20 20 20 20 20  nt iTab         
8840: 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
8850: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  e cursor */.){. 
8860: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8870: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 2f 2a  Parse->db;    /*
8880: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
8890: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
88a0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
88b0: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 74     /* An index t
88c0: 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  o being analyzed
88d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
88e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
88f0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
8900: 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65 69 6e 67  n on index being
8910: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 69   analyzed */.  i
8920: 6e 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20  nt iTabCur;     
8930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8940: 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20  able cursor */. 
8950: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8970: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
8980: 68 69 6e 65 20 62 65 69 6e 67 20 62 75 69 6c 74  hine being built
8990: 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20   up */.  int i; 
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
89c0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  unter */.  int j
89d0: 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31 3b 20 20  ZeroRows = -1;  
89e0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
89f0: 66 72 6f 6d 20 68 65 72 65 20 69 66 20 6e 75 6d  from here if num
8a00: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 73 20 7a  ber of rows is z
8a10: 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ero */.  int iDb
8a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8a30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
8a40: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
8a50: 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20  ining pTab */.  
8a60: 75 38 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20  u8 needTableCnt 
8a70: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 1;         /* 
8a80: 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20 74 68  True to count th
8a90: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
8aa0: 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20 69   regNewRowid = i
8ab0: 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20 52 6f 77  Mem++;    /* Row
8ac0: 69 64 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72  id for the inser
8ad0: 74 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ted record */.  
8ae0: 69 6e 74 20 72 65 67 53 74 61 74 34 20 3d 20 69  int regStat4 = i
8af0: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20  Mem++;       /* 
8b00: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
8b10: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
8b20: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  ct */.  int regC
8b30: 68 6e 67 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20  hng = iMem++;   
8b40: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8b50: 20 63 68 61 6e 67 65 64 20 69 6e 64 65 78 20 66   changed index f
8b60: 69 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  ield */.#ifdef S
8b70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
8b80: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 6e  T3_OR_STAT4.  in
8b90: 74 20 72 65 67 52 6f 77 69 64 20 3d 20 69 4d 65  t regRowid = iMe
8ba0: 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  m++;       /* Ro
8bb0: 77 69 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  wid argument pas
8bc0: 73 65 64 20 74 6f 20 73 74 61 74 5f 70 75 73 68  sed to stat_push
8bd0: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
8be0: 6e 74 20 72 65 67 54 65 6d 70 20 3d 20 69 4d 65  nt regTemp = iMe
8bf0: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  m++;        /* T
8c00: 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
8c10: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
8c20: 65 67 54 61 62 6e 61 6d 65 20 3d 20 69 4d 65 6d  egTabname = iMem
8c30: 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ++;     /* Regis
8c40: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
8c50: 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  able name */.  i
8c60: 6e 74 20 72 65 67 49 64 78 6e 61 6d 65 20 3d 20  nt regIdxname = 
8c70: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52  iMem++;     /* R
8c80: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
8c90: 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65 20 2a 2f  ng index name */
8ca0: 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 31 20  .  int regStat1 
8cb0: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
8cc0: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 74 68 65  /* Value for the
8cd0: 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   stat column of 
8ce0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 2a 2f 0a  sqlite_stat1 */.
8cf0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 20 3d 20    int regPrev = 
8d00: 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  iMem;          /
8d10: 2a 20 4d 55 53 54 20 42 45 20 4c 41 53 54 20 28  * MUST BE LAST (
8d20: 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f 0a 0a 20  see below) */.. 
8d30: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
8d40: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  MAX(pParse->nMem
8d50: 2c 20 69 4d 65 6d 29 3b 0a 20 20 76 20 3d 20 73  , iMem);.  v = s
8d60: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
8d70: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
8d80: 30 20 7c 7c 20 4e 45 56 45 52 28 70 54 61 62 3d  0 || NEVER(pTab=
8d90: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
8da0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  n;.  }.  if( pTa
8db0: 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  b->tnum==0 ){.  
8dc0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74 68    /* Do not gath
8dd0: 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e  er statistics on
8de0: 20 76 69 65 77 73 20 6f 72 20 76 69 72 74 75 61   views or virtua
8df0: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  l tables */.    
8e00: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8e10: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
8e20: 65 28 22 73 71 6c 69 74 65 5f 25 22 2c 20 70 54  e("sqlite_%", pT
8e30: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3d 3d 30  ab->zName, 0)==0
8e40: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   ){.    /* Do no
8e50: 74 20 67 61 74 68 65 72 20 73 74 61 74 69 73 74  t gather statist
8e60: 69 63 73 20 6f 6e 20 73 79 73 74 65 6d 20 74 61  ics on system ta
8e70: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  bles */.    retu
8e80: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
8e90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
8ea0: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
8eb0: 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ) );.  iDb = sql
8ec0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
8ed0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
8ee0: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
8ef0: 69 44 62 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  iDb>=0 );.  asse
8f00: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
8f10: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
8f20: 44 62 2c 20 30 29 20 29 3b 0a 23 69 66 6e 64 65  Db, 0) );.#ifnde
8f30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
8f40: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
8f50: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
8f60: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
8f70: 45 5f 41 4e 41 4c 59 5a 45 2c 20 70 54 61 62 2d  E_ANALYZE, pTab-
8f80: 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
8f90: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
8fa0: 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  bSName ) ){.    
8fb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
8fc0: 69 66 0a 0a 20 20 2f 2a 20 45 73 74 61 62 6c 69  if..  /* Establi
8fd0: 73 68 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  sh a read-lock o
8fe0: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 74 20 74  n the table at t
8ff0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
9000: 6c 65 76 65 6c 2e 20 0a 20 20 2a 2a 20 4f 70 65  level. .  ** Ope
9010: 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
9020: 72 73 6f 72 20 6f 6e 20 74 68 65 20 74 61 62 6c  rsor on the tabl
9030: 65 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  e. Also allocate
9040: 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
9050: 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72  .  ** to use for
9060: 20 73 63 61 6e 6e 69 6e 67 20 69 6e 64 65 78 65   scanning indexe
9070: 73 20 28 69 49 64 78 43 75 72 29 2e 20 4e 6f 20  s (iIdxCur). No 
9080: 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73 20  index cursor is 
9090: 6f 70 65 6e 65 64 20 61 74 0a 20 20 2a 2a 20 74  opened at.  ** t
90a0: 68 69 73 20 74 69 6d 65 20 74 68 6f 75 67 68 2e  his time though.
90b0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61    */.  sqlite3Ta
90c0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
90d0: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
90e0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
90f0: 3b 0a 20 20 69 54 61 62 43 75 72 20 3d 20 69 54  ;.  iTabCur = iT
9100: 61 62 2b 2b 3b 0a 20 20 69 49 64 78 43 75 72 20  ab++;.  iIdxCur 
9110: 3d 20 69 54 61 62 2b 2b 3b 0a 20 20 70 50 61 72  = iTab++;.  pPar
9120: 73 65 2d 3e 6e 54 61 62 20 3d 20 4d 41 58 28 70  se->nTab = MAX(p
9130: 50 61 72 73 65 2d 3e 6e 54 61 62 2c 20 69 54 61  Parse->nTab, iTa
9140: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65  b);.  sqlite3Ope
9150: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
9160: 54 61 62 43 75 72 2c 20 69 44 62 2c 20 70 54 61  TabCur, iDb, pTa
9170: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
9180: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f  .  sqlite3VdbeLo
9190: 61 64 53 74 72 69 6e 67 28 76 2c 20 72 65 67 54  adString(v, regT
91a0: 61 62 6e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  abname, pTab->zN
91b0: 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 70 49 64  ame);..  for(pId
91c0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
91d0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
91e0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
91f0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
9200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9210: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9220: 69 6e 20 70 49 64 78 2e 20 22 4e 22 20 2a 2f 0a  in pIdx. "N" */.
9230: 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 77 69      int addrRewi
9240: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
9250: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
9260: 22 4f 50 5f 52 65 77 69 6e 64 20 69 49 64 78 43  "OP_Rewind iIdxC
9270: 75 72 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ur" */.    int a
9280: 64 64 72 4e 65 78 74 52 6f 77 3b 20 20 20 20 20  ddrNextRow;     
9290: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
92a0: 65 73 73 20 6f 66 20 22 6e 65 78 74 5f 72 6f 77  ess of "next_row
92b0: 3a 22 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  :" */.    const 
92c0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 3b 20  char *zIdxName; 
92d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
92e0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
92f0: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 54 65 73 74      int nColTest
9300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9310: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9320: 6f 6c 75 6d 6e 73 20 74 6f 20 74 65 73 74 20 66  olumns to test f
9330: 6f 72 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  or changes */.. 
9340: 20 20 20 69 66 28 20 70 4f 6e 6c 79 49 64 78 20     if( pOnlyIdx 
9350: 26 26 20 70 4f 6e 6c 79 49 64 78 21 3d 70 49 64  && pOnlyIdx!=pId
9360: 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  x ) continue;.  
9370: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
9380: 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20 6e  tIdxWhere==0 ) n
9390: 65 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 30 3b  eedTableCnt = 0;
93a0: 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
93b0: 69 64 28 70 54 61 62 29 20 26 26 20 49 73 50 72  id(pTab) && IsPr
93c0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
93d0: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  dx) ){.      nCo
93e0: 6c 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l = pIdx->nKeyCo
93f0: 6c 3b 0a 20 20 20 20 20 20 7a 49 64 78 4e 61 6d  l;.      zIdxNam
9400: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
9410: 0a 20 20 20 20 20 20 6e 43 6f 6c 54 65 73 74 20  .      nColTest 
9420: 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  = nCol - 1;.    
9430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 43 6f  }else{.      nCo
9440: 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
9450: 6e 3b 0a 20 20 20 20 20 20 7a 49 64 78 4e 61 6d  n;.      zIdxNam
9460: 65 20 3d 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 3b  e = pIdx->zName;
9470: 0a 20 20 20 20 20 20 6e 43 6f 6c 54 65 73 74 20  .      nColTest 
9480: 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  = pIdx->uniqNotN
9490: 75 6c 6c 20 3f 20 70 49 64 78 2d 3e 6e 4b 65 79  ull ? pIdx->nKey
94a0: 43 6f 6c 2d 31 20 3a 20 6e 43 6f 6c 2d 31 3b 0a  Col-1 : nCol-1;.
94b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
94c0: 70 75 6c 61 74 65 20 74 68 65 20 72 65 67 69 73  pulate the regis
94d0: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
94e0: 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 2a  he index name. *
94f0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
9500: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 72  eLoadString(v, r
9510: 65 67 49 64 78 6e 61 6d 65 2c 20 7a 49 64 78 4e  egIdxname, zIdxN
9520: 61 6d 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ame);.    VdbeCo
9530: 6d 6d 65 6e 74 28 28 76 2c 20 22 41 6e 61 6c 79  mment((v, "Analy
9540: 73 69 73 20 66 6f 72 20 25 73 2e 25 73 22 2c 20  sis for %s.%s", 
9550: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 64  pTab->zName, zId
9560: 78 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  xName));..    /*
9570: 0a 20 20 20 20 2a 2a 20 50 73 65 75 64 6f 2d 63  .    ** Pseudo-c
9580: 6f 64 65 20 66 6f 72 20 6c 6f 6f 70 20 74 68 61  ode for loop tha
9590: 74 20 63 61 6c 6c 73 20 73 74 61 74 5f 70 75 73  t calls stat_pus
95a0: 68 28 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  h():.    **.    
95b0: 2a 2a 20 20 20 52 65 77 69 6e 64 20 63 73 72 0a  **   Rewind csr.
95c0: 20 20 20 20 2a 2a 20 20 20 69 66 20 65 6f 66 28      **   if eof(
95d0: 63 73 72 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  csr) goto end_of
95e0: 5f 73 63 61 6e 3b 0a 20 20 20 20 2a 2a 20 20 20  _scan;.    **   
95f0: 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20  regChng = 0.    
9600: 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f 61  **   goto chng_a
9610: 64 64 72 5f 30 3b 0a 20 20 20 20 2a 2a 0a 20 20  ddr_0;.    **.  
9620: 20 20 2a 2a 20 20 6e 65 78 74 5f 72 6f 77 3a 0a    **  next_row:.
9630: 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67      **   regChng
9640: 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 69 66   = 0.    **   if
9650: 28 20 69 64 78 28 30 29 20 21 3d 20 72 65 67 50  ( idx(0) != regP
9660: 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20 63 68  rev(0) ) goto ch
9670: 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20 20 2a 2a  ng_addr_0.    **
9680: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 31 0a 20     regChng = 1. 
9690: 20 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28     **   if( idx(
96a0: 31 29 20 21 3d 20 72 65 67 50 72 65 76 28 31 29  1) != regPrev(1)
96b0: 20 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64   ) goto chng_add
96c0: 72 5f 31 0a 20 20 20 20 2a 2a 20 20 20 2e 2e 2e  r_1.    **   ...
96d0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
96e0: 67 20 3d 20 4e 0a 20 20 20 20 2a 2a 20 20 20 67  g = N.    **   g
96f0: 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 4e 0a  oto chng_addr_N.
9700: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 63      **.    **  c
9710: 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20 20 20  hng_addr_0:.    
9720: 2a 2a 20 20 20 72 65 67 50 72 65 76 28 30 29 20  **   regPrev(0) 
9730: 3d 20 69 64 78 28 30 29 0a 20 20 20 20 2a 2a 20  = idx(0).    ** 
9740: 20 63 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20   chng_addr_1:.  
9750: 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 31    **   regPrev(1
9760: 29 20 3d 20 69 64 78 28 31 29 0a 20 20 20 20 2a  ) = idx(1).    *
9770: 2a 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20  *  ....    **.  
9780: 20 20 2a 2a 20 20 65 6e 64 44 69 73 74 69 6e 63    **  endDistinc
9790: 74 54 65 73 74 3a 0a 20 20 20 20 2a 2a 20 20 20  tTest:.    **   
97a0: 72 65 67 52 6f 77 69 64 20 3d 20 69 64 78 28 72  regRowid = idx(r
97b0: 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20 20 20 73  owid).    **   s
97c0: 74 61 74 5f 70 75 73 68 28 50 2c 20 72 65 67 43  tat_push(P, regC
97d0: 68 6e 67 2c 20 72 65 67 52 6f 77 69 64 29 0a 20  hng, regRowid). 
97e0: 20 20 20 2a 2a 20 20 20 4e 65 78 74 20 63 73 72     **   Next csr
97f0: 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 21 65 6f  .    **   if !eo
9800: 66 28 63 73 72 29 20 67 6f 74 6f 20 6e 65 78 74  f(csr) goto next
9810: 5f 72 6f 77 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  _row;.    **.   
9820: 20 2a 2a 20 20 65 6e 64 5f 6f 66 5f 73 63 61 6e   **  end_of_scan
9830: 3a 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a  :.    */..    /*
9840: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
9850: 20 61 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f   are enough memo
9860: 72 79 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ry cells allocat
9870: 65 64 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  ed to accommodat
9880: 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  e .    ** the re
9890: 67 50 72 65 76 20 61 72 72 61 79 20 61 6e 64 20  gPrev array and 
98a0: 61 20 74 72 61 69 6c 69 6e 67 20 72 6f 77 69 64  a trailing rowid
98b0: 20 28 74 68 65 20 72 6f 77 69 64 20 73 6c 6f 74   (the rowid slot
98c0: 20 69 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   is required.   
98d0: 20 2a 2a 20 77 68 65 6e 20 62 75 69 6c 64 69 6e   ** when buildin
98e0: 67 20 61 20 72 65 63 6f 72 64 20 74 6f 20 69 6e  g a record to in
98f0: 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 73 61  sert into the sa
9900: 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 0a  mple column of .
9910: 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74      ** the sqlit
9920: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20 20  e_stat4 table.  
9930: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
9940: 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65  Mem = MAX(pParse
9950: 2d 3e 6e 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b  ->nMem, regPrev+
9960: 6e 43 6f 6c 54 65 73 74 29 3b 0a 0a 20 20 20 20  nColTest);..    
9970: 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
9980: 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  nly cursor on th
9990: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e  e index being an
99a0: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 61  alyzed. */.    a
99b0: 73 73 65 72 74 28 20 69 44 62 3d 3d 73 71 6c 69  ssert( iDb==sqli
99c0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
99d0: 28 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65  (db, pIdx->pSche
99e0: 6d 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ma) );.    sqlit
99f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9a00: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
9a10: 78 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  xCur, pIdx->tnum
9a20: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
9a30: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
9a40: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
9a50: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
9a60: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
9a70: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20  x->zName));..   
9a80: 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73   /* Invoke the s
9a90: 74 61 74 5f 69 6e 69 74 28 29 20 66 75 6e 63 74  tat_init() funct
9aa0: 69 6f 6e 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ion. The argumen
9ab0: 74 73 20 61 72 65 3a 0a 20 20 20 20 2a 2a 20 0a  ts are:.    ** .
9ac0: 20 20 20 20 2a 2a 20 20 20 20 28 31 29 20 74 68      **    (1) th
9ad0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
9ae0: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
9af0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 72   including the r
9b00: 6f 77 69 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  owid.    **     
9b10: 20 20 20 28 6f 72 20 66 6f 72 20 61 20 57 49 54     (or for a WIT
9b20: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
9b30: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  , the number of 
9b40: 50 4b 20 63 6f 6c 75 6d 6e 73 29 2c 0a 20 20 20  PK columns),.   
9b50: 20 2a 2a 20 20 20 20 28 32 29 20 74 68 65 20 6e   **    (2) the n
9b60: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9b70: 20 69 6e 20 74 68 65 20 6b 65 79 20 77 69 74 68   in the key with
9b80: 6f 75 74 20 74 68 65 20 72 6f 77 69 64 2f 70 6b  out the rowid/pk
9b90: 0a 20 20 20 20 2a 2a 20 20 20 20 28 33 29 20 74  .    **    (3) t
9ba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9bb0: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
9bc0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 0a 20 20      **.    **.  
9bd0: 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61    ** The third a
9be0: 72 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20  rgument is only 
9bf0: 75 73 65 64 20 66 6f 72 20 53 54 41 54 33 20 61  used for STAT3 a
9c00: 6e 64 20 53 54 41 54 34 0a 20 20 20 20 2a 2f 0a  nd STAT4.    */.
9c10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9c20: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
9c30: 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT4.    sqlite3V
9c40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9c50: 43 6f 75 6e 74 2c 20 69 49 64 78 43 75 72 2c 20  Count, iIdxCur, 
9c60: 72 65 67 53 74 61 74 34 2b 33 29 3b 0a 23 65 6e  regStat4+3);.#en
9c70: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
9c80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9c90: 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 2c 20 72  Integer, nCol, r
9ca0: 65 67 53 74 61 74 34 2b 31 29 3b 0a 20 20 20 20  egStat4+1);.    
9cb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9cc0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9cd0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
9ce0: 72 65 67 53 74 61 74 34 2b 32 29 3b 0a 20 20 20  regStat4+2);.   
9cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9d00: 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
9d10: 6e 30 2c 20 30 2c 20 72 65 67 53 74 61 74 34 2b  n0, 0, regStat4+
9d20: 31 2c 20 72 65 67 53 74 61 74 34 2c 0a 20 20 20  1, regStat4,.   
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 28 63 68 61 72 2a 29 26 73 74 61 74 49 6e    (char*)&statIn
9d50: 69 74 46 75 6e 63 64 65 66 2c 20 50 34 5f 46 55  itFuncdef, P4_FU
9d60: 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
9d70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9d80: 76 2c 20 32 2b 49 73 53 74 61 74 33 34 29 3b 0a  v, 2+IsStat34);.
9d90: 0a 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  .    /* Implemen
9da0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  tation of the fo
9db0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  llowing:.    **.
9dc0: 20 20 20 20 2a 2a 20 20 20 52 65 77 69 6e 64 20      **   Rewind 
9dd0: 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20  csr.    **   if 
9de0: 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 65 6e  eof(csr) goto en
9df0: 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20 20 20 2a  d_of_scan;.    *
9e00: 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 30 0a  *   regChng = 0.
9e10: 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 6e 65      **   goto ne
9e20: 78 74 5f 70 75 73 68 5f 30 3b 0a 20 20 20 20 2a  xt_push_0;.    *
9e30: 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64  *.    */.    add
9e40: 72 52 65 77 69 6e 64 20 3d 20 73 71 6c 69 74 65  rRewind = sqlite
9e50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
9e60: 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75  P_Rewind, iIdxCu
9e70: 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  r);.    VdbeCove
9e80: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
9e90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9ea0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
9eb0: 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20 20 61   regChng);.    a
9ec0: 64 64 72 4e 65 78 74 52 6f 77 20 3d 20 73 71 6c  ddrNextRow = sql
9ed0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9ee0: 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 69 66 28  ddr(v);..    if(
9ef0: 20 6e 43 6f 6c 54 65 73 74 3e 30 20 29 7b 0a 20   nColTest>0 ){. 
9f00: 20 20 20 20 20 69 6e 74 20 65 6e 64 44 69 73 74       int endDist
9f10: 69 6e 63 74 54 65 73 74 20 3d 20 73 71 6c 69 74  inctTest = sqlit
9f20: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
9f30: 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  v);.      int *a
9f40: 47 6f 74 6f 43 68 6e 67 3b 20 20 20 20 20 20 20  GotoChng;       
9f50: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
9f60: 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   of jump instruc
9f70: 74 69 6f 6e 20 61 64 64 72 65 73 73 65 73 20 2a  tion addresses *
9f80: 2f 0a 20 20 20 20 20 20 61 47 6f 74 6f 43 68 6e  /.      aGotoChn
9f90: 67 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  g = sqlite3DbMal
9fa0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
9fb0: 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 54 65 73  eof(int)*nColTes
9fc0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 47  t);.      if( aG
9fd0: 6f 74 6f 43 68 6e 67 3d 3d 30 20 29 20 63 6f 6e  otoChng==0 ) con
9fe0: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  tinue;..      /*
9ff0: 0a 20 20 20 20 20 20 2a 2a 20 20 6e 65 78 74 5f  .      **  next_
a000: 72 6f 77 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20  row:.      **   
a010: 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20  regChng = 0.    
a020: 20 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30    **   if( idx(0
a030: 29 20 21 3d 20 72 65 67 50 72 65 76 28 30 29 20  ) != regPrev(0) 
a040: 29 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72  ) goto chng_addr
a050: 5f 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  _0.      **   re
a060: 67 43 68 6e 67 20 3d 20 31 0a 20 20 20 20 20 20  gChng = 1.      
a070: 2a 2a 20 20 20 69 66 28 20 69 64 78 28 31 29 20  **   if( idx(1) 
a080: 21 3d 20 72 65 67 50 72 65 76 28 31 29 20 29 20  != regPrev(1) ) 
a090: 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 31  goto chng_addr_1
a0a0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 2e 2e 2e 0a  .      **   ....
a0b0: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68        **   regCh
a0c0: 6e 67 20 3d 20 4e 0a 20 20 20 20 20 20 2a 2a 20  ng = N.      ** 
a0d0: 20 20 67 6f 74 6f 20 65 6e 64 44 69 73 74 69 6e    goto endDistin
a0e0: 63 74 54 65 73 74 0a 20 20 20 20 20 20 2a 2f 0a  ctTest.      */.
a0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a100: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
a110: 74 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4e  to);.      addrN
a120: 65 78 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  extRow = sqlite3
a130: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a140: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  v);.      if( nC
a150: 6f 6c 54 65 73 74 3d 3d 31 20 26 26 20 70 49 64  olTest==1 && pId
a160: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26  x->nKeyCol==1 &&
a170: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
a180: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
a190: 2f 2a 20 46 6f 72 20 61 20 73 69 6e 67 6c 65 2d  /* For a single-
a1a0: 63 6f 6c 75 6d 6e 20 55 4e 49 51 55 45 20 69 6e  column UNIQUE in
a1b0: 64 65 78 2c 20 6f 6e 63 65 20 77 65 20 68 61 76  dex, once we hav
a1c0: 65 20 66 6f 75 6e 64 20 61 20 6e 6f 6e 2d 4e 55  e found a non-NU
a1d0: 4c 4c 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  LL.        ** ro
a1e0: 77 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  w, we know that 
a1f0: 61 6c 6c 20 74 68 65 20 72 65 73 74 20 77 69 6c  all the rest wil
a200: 6c 20 62 65 20 64 69 73 74 69 6e 63 74 2c 20 73  l be distinct, s
a210: 6f 20 73 6b 69 70 20 0a 20 20 20 20 20 20 20 20  o skip .        
a220: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 64 69  ** subsequent di
a230: 73 74 69 6e 63 74 6e 65 73 73 20 74 65 73 74 73  stinctness tests
a240: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
a250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a260: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65  , OP_NotNull, re
a270: 67 50 72 65 76 2c 20 65 6e 64 44 69 73 74 69 6e  gPrev, endDistin
a280: 63 74 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ctTest);.       
a290: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54  for(i=0; i<nColT
a2c0: 65 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  est; i++){.     
a2d0: 20 20 20 63 68 61 72 20 2a 70 43 6f 6c 6c 20 3d     char *pColl =
a2e0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4c   (char*)sqlite3L
a2f0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
a300: 72 73 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  rse, pIdx->azCol
a310: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  l[i]);.        s
a320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a330: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a340: 69 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20  i, regChng);.   
a350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a360: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a370: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c  umn, iIdxCur, i,
a380: 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20   regTemp);.     
a390: 20 20 20 61 47 6f 74 6f 43 68 6e 67 5b 69 5d 20     aGotoChng[i] 
a3a0: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
a3b0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a3c0: 4f 50 5f 4e 65 2c 20 72 65 67 54 65 6d 70 2c 20  OP_Ne, regTemp, 
a3d0: 30 2c 20 72 65 67 50 72 65 76 2b 69 2c 20 70 43  0, regPrev+i, pC
a3e0: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
a3f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a400: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a410: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
a420: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
a430: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
a440: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
a450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a460: 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6c 54 65 73  Integer, nColTes
a470: 74 2c 20 72 65 67 43 68 6e 67 29 3b 0a 20 20 20  t, regChng);.   
a480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
a490: 74 6f 28 76 2c 20 65 6e 64 44 69 73 74 69 6e 63  to(v, endDistinc
a4a0: 74 54 65 73 74 29 3b 0a 20 20 0a 20 20 0a 20 20  tTest);.  .  .  
a4b0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20      /*.      ** 
a4c0: 20 63 68 6e 67 5f 61 64 64 72 5f 30 3a 0a 20 20   chng_addr_0:.  
a4d0: 20 20 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76      **   regPrev
a4e0: 28 30 29 20 3d 20 69 64 78 28 30 29 0a 20 20 20  (0) = idx(0).   
a4f0: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
a500: 5f 31 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72  _1:.      **   r
a510: 65 67 50 72 65 76 28 31 29 20 3d 20 69 64 78 28  egPrev(1) = idx(
a520: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 2e 2e 2e  1).      **  ...
a530: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a540: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a550: 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 52  ere(v, addrNextR
a560: 6f 77 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72  ow-1);.      for
a570: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 54 65 73 74  (i=0; i<nColTest
a580: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a590: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a5a0: 65 72 65 28 76 2c 20 61 47 6f 74 6f 43 68 6e 67  ere(v, aGotoChng
a5b0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
a5c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a5d0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
a5e0: 64 78 43 75 72 2c 20 69 2c 20 72 65 67 50 72 65  dxCur, i, regPre
a5f0: 76 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  v+i);.      }.  
a600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
a610: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
a620: 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b  ndDistinctTest);
a630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a640: 46 72 65 65 28 64 62 2c 20 61 47 6f 74 6f 43 68  Free(db, aGotoCh
a650: 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ng);.    }.  .  
a660: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 63 68 6e    /*.    **  chn
a670: 67 5f 61 64 64 72 5f 4e 3a 0a 20 20 20 20 2a 2a  g_addr_N:.    **
a680: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 69 64     regRowid = id
a690: 78 28 72 6f 77 69 64 29 20 20 20 20 20 20 20 20  x(rowid)        
a6a0: 20 20 20 20 2f 2f 20 53 54 41 54 33 34 20 6f 6e      // STAT34 on
a6b0: 6c 79 0a 20 20 20 20 2a 2a 20 20 20 73 74 61 74  ly.    **   stat
a6c0: 5f 70 75 73 68 28 50 2c 20 72 65 67 43 68 6e 67  _push(P, regChng
a6d0: 2c 20 72 65 67 52 6f 77 69 64 29 20 20 2f 2f 20  , regRowid)  // 
a6e0: 33 72 64 20 70 61 72 61 6d 65 74 65 72 20 53 54  3rd parameter ST
a6f0: 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  AT34 only.    **
a700: 20 20 20 4e 65 78 74 20 63 73 72 0a 20 20 20 20     Next csr.    
a710: 2a 2a 20 20 20 69 66 20 21 65 6f 66 28 63 73 72  **   if !eof(csr
a720: 29 20 67 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b  ) goto next_row;
a730: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
a740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
a750: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
a760: 61 73 73 65 72 74 28 20 72 65 67 52 6f 77 69 64  assert( regRowid
a770: 3d 3d 28 72 65 67 53 74 61 74 34 2b 32 29 20 29  ==(regStat4+2) )
a780: 3b 0a 20 20 20 20 69 66 28 20 48 61 73 52 6f 77  ;.    if( HasRow
a790: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
a7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a7b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
a7c0: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67  id, iIdxCur, reg
a7d0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Rowid);.    }els
a7e0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
a7f0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
a800: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
a810: 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  x->pTable);.    
a820: 20 20 69 6e 74 20 6a 2c 20 6b 2c 20 72 65 67 4b    int j, k, regK
a830: 65 79 3b 0a 20 20 20 20 20 20 72 65 67 4b 65 79  ey;.      regKey
a840: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a850: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
a860: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
a870: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
a880: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  Pk->nKeyCol; j++
a890: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 73  ){.        k = s
a8a0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
a8b0: 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61  dex(pIdx, pPk->a
a8c0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 29 3b 0a 20 20 20  iColumn[j]);.   
a8d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3e 3d       assert( k>=
a8e0: 30 20 26 26 20 6b 3c 70 54 61 62 2d 3e 6e 43 6f  0 && k<pTab->nCo
a8f0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
a900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a910: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
a920: 78 43 75 72 2c 20 6b 2c 20 72 65 67 4b 65 79 2b  xCur, k, regKey+
a930: 6a 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  j);.        Vdbe
a940: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
a950: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b  , pTab->aCol[pPk
a960: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  ->aiColumn[j]].z
a970: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
a980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a990: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
a9a0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4b 65 79  keRecord, regKey
a9b0: 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  , pPk->nKeyCol, 
a9c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
a9d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a9e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
a9f0: 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e 4b   regKey, pPk->nK
aa00: 65 79 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 23 65  eyCol);.    }.#e
aa10: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
aa20: 20 72 65 67 43 68 6e 67 3d 3d 28 72 65 67 53 74   regChng==(regSt
aa30: 61 74 34 2b 31 29 20 29 3b 0a 20 20 20 20 73 71  at4+1) );.    sq
aa40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
aa50: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c  v, OP_Function0,
aa60: 20 31 2c 20 72 65 67 53 74 61 74 34 2c 20 72 65   1, regStat4, re
aa70: 67 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  gTemp,.         
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
aa90: 72 2a 29 26 73 74 61 74 50 75 73 68 46 75 6e 63  r*)&statPushFunc
aaa0: 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  def, P4_FUNCDEF)
aab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aac0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49  eChangeP5(v, 2+I
aad0: 73 53 74 61 74 33 34 29 3b 0a 20 20 20 20 73 71  sStat34);.    sq
aae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aaf0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78  v, OP_Next, iIdx
ab00: 43 75 72 2c 20 61 64 64 72 4e 65 78 74 52 6f 77  Cur, addrNextRow
ab10: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ab20: 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20  v);..    /* Add 
ab30: 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
ab40: 20 73 74 61 74 31 20 74 61 62 6c 65 2e 20 2a 2f   stat1 table. */
ab50: 0a 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74  .    callStatGet
ab60: 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54  (v, regStat4, ST
ab70: 41 54 5f 47 45 54 5f 53 54 41 54 31 2c 20 72 65  AT_GET_STAT1, re
ab80: 67 53 74 61 74 31 29 3b 0a 20 20 20 20 61 73 73  gStat1);.    ass
ab90: 65 72 74 28 20 22 42 42 42 22 5b 30 5d 3d 3d 53  ert( "BBB"[0]==S
aba0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
abb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
abc0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
abd0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62  keRecord, regTab
abe0: 6e 61 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70  name, 3, regTemp
abf0: 2c 20 22 42 42 42 22 2c 20 30 29 3b 0a 20 20 20  , "BBB", 0);.   
ac00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac10: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
ac20: 64 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67  d, iStatCur, reg
ac30: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  NewRowid);.    s
ac40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ac50: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
ac60: 53 74 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70  StatCur, regTemp
ac70: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
ac80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ac90: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
aca0: 47 5f 41 50 50 45 4e 44 29 3b 0a 0a 20 20 20 20  G_APPEND);..    
acb0: 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 69  /* Add the entri
acc0: 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 33 20  es to the stat3 
acd0: 6f 72 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20  or stat4 table. 
ace0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
acf0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
ad00: 5f 53 54 41 54 34 0a 20 20 20 20 7b 0a 20 20 20  _STAT4.    {.   
ad10: 20 20 20 69 6e 74 20 72 65 67 45 71 20 3d 20 72     int regEq = r
ad20: 65 67 53 74 61 74 31 3b 0a 20 20 20 20 20 20 69  egStat1;.      i
ad30: 6e 74 20 72 65 67 4c 74 20 3d 20 72 65 67 53 74  nt regLt = regSt
ad40: 61 74 31 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74  at1+1;.      int
ad50: 20 72 65 67 44 4c 74 20 3d 20 72 65 67 53 74 61   regDLt = regSta
ad60: 74 31 2b 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  t1+2;.      int 
ad70: 72 65 67 53 61 6d 70 6c 65 20 3d 20 72 65 67 53  regSample = regS
ad80: 74 61 74 31 2b 33 3b 0a 20 20 20 20 20 20 69 6e  tat1+3;.      in
ad90: 74 20 72 65 67 43 6f 6c 20 3d 20 72 65 67 53 74  t regCol = regSt
ada0: 61 74 31 2b 34 3b 0a 20 20 20 20 20 20 69 6e 74  at1+4;.      int
adb0: 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20   regSampleRowid 
adc0: 3d 20 72 65 67 43 6f 6c 20 2b 20 6e 43 6f 6c 3b  = regCol + nCol;
add0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e  .      int addrN
ade0: 65 78 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  ext;.      int a
adf0: 64 64 72 49 73 4e 75 6c 6c 3b 0a 20 20 20 20 20  ddrIsNull;.     
ae00: 20 75 38 20 73 65 65 6b 4f 70 20 3d 20 48 61 73   u8 seekOp = Has
ae10: 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 4f 50  Rowid(pTab) ? OP
ae20: 5f 4e 6f 74 45 78 69 73 74 73 20 3a 20 4f 50 5f  _NotExists : OP_
ae30: 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 20 20 20  NotFound;..     
ae40: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
ae50: 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  MAX(pParse->nMem
ae60: 2c 20 72 65 67 43 6f 6c 2b 6e 43 6f 6c 29 3b 0a  , regCol+nCol);.
ae70: 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
ae80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ae90: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
aea0: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
aeb0: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
aec0: 5f 47 45 54 5f 52 4f 57 49 44 2c 20 72 65 67 53  _GET_ROWID, regS
aed0: 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20 20  ampleRowid);.   
aee0: 20 20 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20     addrIsNull = 
aef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af00: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
af10: 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b  regSampleRowid);
af20: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
af30: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 63 61  age(v);.      ca
af40: 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67  llStatGet(v, reg
af50: 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f  Stat4, STAT_GET_
af60: 4e 45 51 2c 20 72 65 67 45 71 29 3b 0a 20 20 20  NEQ, regEq);.   
af70: 20 20 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76     callStatGet(v
af80: 2c 20 72 65 67 53 74 61 74 34 2c 20 53 54 41 54  , regStat4, STAT
af90: 5f 47 45 54 5f 4e 4c 54 2c 20 72 65 67 4c 74 29  _GET_NLT, regLt)
afa0: 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74  ;.      callStat
afb0: 47 65 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c  Get(v, regStat4,
afc0: 20 53 54 41 54 5f 47 45 54 5f 4e 44 4c 54 2c 20   STAT_GET_NDLT, 
afd0: 72 65 67 44 4c 74 29 3b 0a 20 20 20 20 20 20 73  regDLt);.      s
afe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
aff0: 49 6e 74 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69  Int(v, seekOp, i
b000: 54 61 62 43 75 72 2c 20 61 64 64 72 4e 65 78 74  TabCur, addrNext
b010: 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64  , regSampleRowid
b020: 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 57  , 0);.      /* W
b030: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
b040: 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20 72  regSampleRowid r
b050: 6f 77 20 65 78 69 73 74 73 20 62 65 63 61 75 73  ow exists becaus
b060: 65 20 69 74 20 77 61 73 20 72 65 61 64 20 62 79  e it was read by
b070: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
b080: 65 76 69 6f 75 73 20 6c 6f 6f 70 2e 20 20 54 68  evious loop.  Th
b090: 75 73 20 74 68 65 20 6e 6f 74 2d 66 6f 75 6e 64  us the not-found
b0a0: 20 6a 75 6d 70 20 6f 66 20 73 65 65 6b 4f 70 20   jump of seekOp 
b0b0: 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 20  will never.     
b0c0: 20 2a 2a 20 62 65 20 74 61 6b 65 6e 20 2a 2f 0a   ** be taken */.
b0d0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b0e0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
b0f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b100: 4e 41 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20  NABLE_STAT3.    
b110: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b120: 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
b130: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69  (pParse, pIdx, i
b140: 54 61 62 43 75 72 2c 20 30 2c 20 72 65 67 53 61  TabCur, 0, regSa
b150: 6d 70 6c 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  mple);.#else.   
b160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
b170: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
b180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b190: 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e  eLoadIndexColumn
b1a0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69  (pParse, pIdx, i
b1b0: 54 61 62 43 75 72 2c 20 69 2c 20 72 65 67 43 6f  TabCur, i, regCo
b1c0: 6c 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l+i);.      }.  
b1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b1e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
b1f0: 52 65 63 6f 72 64 2c 20 72 65 67 43 6f 6c 2c 20  Record, regCol, 
b200: 6e 43 6f 6c 2c 20 72 65 67 53 61 6d 70 6c 65 29  nCol, regSample)
b210: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73  ;.#endif.      s
b220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b230: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b240: 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 36  d, regTabname, 6
b250: 2c 20 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20  , regTemp);.    
b260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b270: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
b280: 69 64 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20  id, iStatCur+1, 
b290: 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20  regNewRowid);.  
b2a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b2c0: 72 74 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20  rt, iStatCur+1, 
b2d0: 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52  regTemp, regNewR
b2e0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b300: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 61 64  , OP_Goto, 1, ad
b310: 64 72 4e 65 78 74 29 3b 20 2f 2a 20 50 31 3d 3d  drNext); /* P1==
b320: 31 20 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  1 for end-of-loo
b330: 70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  p */.      sqlit
b340: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b350: 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20  , addrIsNull);. 
b360: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
b370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
b380: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
b390: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6e      /* End of an
b3a0: 61 6c 79 73 69 73 20 2a 2f 0a 20 20 20 20 73 71  alysis */.    sq
b3b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b3c0: 65 28 76 2c 20 61 64 64 72 52 65 77 69 6e 64 29  e(v, addrRewind)
b3d0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65  ;.  }...  /* Cre
b3e0: 61 74 65 20 61 20 73 69 6e 67 6c 65 20 73 71 6c  ate a single sql
b3f0: 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 79 20  ite_stat1 entry 
b400: 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20  containing NULL 
b410: 61 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  as the index.  *
b420: 2a 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 72  * name and the r
b430: 6f 77 20 63 6f 75 6e 74 20 61 73 20 74 68 65 20  ow count as the 
b440: 63 6f 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  content..  */.  
b450: 69 66 28 20 70 4f 6e 6c 79 49 64 78 3d 3d 30 20  if( pOnlyIdx==0 
b460: 26 26 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20  && needTableCnt 
b470: 29 7b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  ){.    VdbeComme
b480: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61  nt((v, "%s", pTa
b490: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
b4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b4b0: 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
b4c0: 54 61 62 43 75 72 2c 20 72 65 67 53 74 61 74 31  TabCur, regStat1
b4d0: 29 3b 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73  );.    jZeroRows
b4e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b4f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
b500: 2c 20 72 65 67 53 74 61 74 31 29 3b 20 56 64 62  , regStat1); Vdb
b510: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b530: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
b540: 30 2c 20 72 65 67 49 64 78 6e 61 6d 65 29 3b 0a  0, regIdxname);.
b550: 20 20 20 20 61 73 73 65 72 74 28 20 22 42 42 42      assert( "BBB
b560: 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  "[0]==SQLITE_AFF
b570: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 73 71 6c  _TEXT );.    sql
b580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b590: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b5a0: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20   regTabname, 3, 
b5b0: 72 65 67 54 65 6d 70 2c 20 22 42 42 42 22 2c 20  regTemp, "BBB", 
b5c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
b5d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b5e0: 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43  NewRowid, iStatC
b5f0: 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29  ur, regNewRowid)
b600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b620: 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20  sert, iStatCur, 
b630: 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52  regTemp, regNewR
b640: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
b650: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
b660: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
b670: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b680: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 5a 65  eJumpHere(v, jZe
b690: 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  roRows);.  }.}..
b6a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b6b0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
b6c0: 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ause the most re
b6d0: 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61 6c 79  cent index analy
b6e0: 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c 6f 61  sis to.** be loa
b6f0: 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72 6e 61  ded into interna
b700: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20 77 68  l hash tables wh
b710: 65 72 65 20 69 73 20 63 61 6e 20 62 65 20 75 73  ere is can be us
b720: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
b730: 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28  id loadAnalysis(
b740: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
b750: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
b760: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b770: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
b780: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
b790: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b7a0: 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73   OP_LoadAnalysis
b7b0: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , iDb);.  }.}../
b7c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
b7d0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20  de that will do 
b7e0: 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61  an analysis of a
b7f0: 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  n entire databas
b800: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
b810: 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61 73 65   analyzeDatabase
b820: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b830: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
b840: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b850: 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61 20 2a  ->db;.  Schema *
b860: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
b870: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 20  b[iDb].pSchema; 
b880: 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20     /* Schema of 
b890: 64 61 74 61 62 61 73 65 20 69 44 62 20 2a 2f 0a  database iDb */.
b8a0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 0a 20    HashElem *k;. 
b8b0: 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b 0a 20   int iStatCur;. 
b8c0: 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74   int iMem;.  int
b8d0: 20 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69 74 65   iTab;..  sqlite
b8e0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
b8f0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
b900: 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72  iDb);.  iStatCur
b910: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
b920: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
b930: 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74 61 74  += 3;.  openStat
b940: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
b950: 62 2c 20 69 53 74 61 74 43 75 72 2c 20 30 2c 20  b, iStatCur, 0, 
b960: 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70 50 61  0);.  iMem = pPa
b970: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69  rse->nMem+1;.  i
b980: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
b990: 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ab;.  assert( sq
b9a0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
b9b0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
b9c0: 20 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71 6c 69   );.  for(k=sqli
b9d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
b9e0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
b9f0: 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
ba00: 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 54 61 62  ext(k)){.    Tab
ba10: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
ba20: 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
ba30: 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c 79 7a  a(k);.    analyz
ba40: 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65  eOneTable(pParse
ba50: 2c 20 70 54 61 62 2c 20 30 2c 20 69 53 74 61 74  , pTab, 0, iStat
ba60: 43 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61 62 29  Cur, iMem, iTab)
ba70: 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e 61 6c  ;.  }.  loadAnal
ba80: 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62  ysis(pParse, iDb
ba90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
baa0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
bab0: 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79 73  ill do an analys
bac0: 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74  is of a single t
bad0: 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64 61 74  able in.** a dat
bae0: 61 62 61 73 65 2e 20 20 49 66 20 70 4f 6e 6c 79  abase.  If pOnly
baf0: 49 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Idx is not NULL 
bb00: 74 68 65 6e 20 69 74 20 69 73 20 61 20 73 69 6e  then it is a sin
bb10: 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 20  gle index.** in 
bb20: 70 54 61 62 20 74 68 61 74 20 73 68 6f 75 6c 64  pTab that should
bb30: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2f   be analyzed..*/
bb40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e 61  .static void ana
bb50: 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73 65 20  lyzeTable(Parse 
bb60: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
bb70: 70 54 61 62 2c 20 49 6e 64 65 78 20 2a 70 4f 6e  pTab, Index *pOn
bb80: 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 44  lyIdx){.  int iD
bb90: 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75  b;.  int iStatCu
bba0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  r;..  assert( pT
bbb0: 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
bbc0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
bbd0: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70  oldsAllMutexes(p
bbe0: 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20  Parse->db) );.  
bbf0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
bc00: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
bc10: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
bc20: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
bc30: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
bc40: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
bc50: 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75 72 20  Db);.  iStatCur 
bc60: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
bc70: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b    pParse->nTab +
bc80: 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e 6c 79  = 3;.  if( pOnly
bc90: 49 64 78 20 29 7b 0a 20 20 20 20 6f 70 65 6e 53  Idx ){.    openS
bca0: 74 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  tatTable(pParse,
bcb0: 20 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20   iDb, iStatCur, 
bcc0: 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d 65 2c  pOnlyIdx->zName,
bcd0: 20 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c 73 65   "idx");.  }else
bce0: 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74 54 61  {.    openStatTa
bcf0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ble(pParse, iDb,
bd00: 20 69 53 74 61 74 43 75 72 2c 20 70 54 61 62 2d   iStatCur, pTab-
bd10: 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29 3b 0a  >zName, "tbl");.
bd20: 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f 6e 65    }.  analyzeOne
bd30: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
bd40: 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20 69 53  ab, pOnlyIdx, iS
bd50: 74 61 74 43 75 72 2c 70 50 61 72 73 65 2d 3e 6e  tatCur,pParse->n
bd60: 4d 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e 6e 54  Mem+1,pParse->nT
bd70: 61 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61 6c 79  ab);.  loadAnaly
bd80: 73 69 73 28 70 50 61 72 73 65 2c 20 69 44 62 29  sis(pParse, iDb)
bd90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
bda0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
bdb0: 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
bdc0: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61  .  The parser ca
bdd0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
bde0: 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65 63 6f  .** when it reco
bdf0: 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c 59 5a  gnizes an ANALYZ
be00: 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
be10: 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a 45 20          ANALYZE 
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
be40: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
be50: 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20 20 20  E  <database>   
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
be70: 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  2.**        ANAL
be80: 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  YZE  ?<database>
be90: 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
bea0: 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 3.**.** Form 1
beb0: 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
bec0: 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
bed0: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
bee0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a 2a 2a   be analyzed..**
bef0: 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a 65 73   Form 2 analyzes
bf00: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74 68 65   all indices the
bf10: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
bf20: 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20   named..** Form 
bf30: 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69  3 analyzes all i
bf40: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
bf50: 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
bf60: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
bf70: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 50  sqlite3Analyze(P
bf80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
bf90: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b  ken *pName1, Tok
bfa0: 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 73  en *pName2){.  s
bfb0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
bfc0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
bfd0: 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  Db;.  int i;.  c
bfe0: 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a 20 20  har *z, *zDb;.  
bff0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
c000: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 54 6f  ndex *pIdx;.  To
c010: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b  ken *pTableName;
c020: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 2f  .  Vdbe *v;..  /
c030: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
c040: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
c050: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c060: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
c070: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
c080: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
c090: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
c0a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
c0b0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
c0c0: 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73 65 2d  lMutexes(pParse-
c0d0: 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20 53 51  >db) );.  if( SQ
c0e0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
c0f0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
c100: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
c110: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
c120: 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20 70 4e   pName2!=0 || pN
c130: 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ame1==0 );.  if(
c140: 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
c150: 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20 41 6e    /* Form 1:  An
c160: 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alyze everything
c170: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
c180: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
c190: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  {.      if( i==1
c1a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
c1b0: 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a 65 20   Do not analyze 
c1c0: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
c1d0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61 6c 79  e */.      analy
c1e0: 7a 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73  zeDatabase(pPars
c1f0: 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
c200: 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32 2d  else if( pName2-
c210: 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==0 ){.    /* 
c220: 46 6f 72 6d 20 32 3a 20 20 41 6e 61 6c 79 7a 65  Form 2:  Analyze
c230: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
c240: 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 2a 2f 0a   table named */.
c250: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
c260: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
c270: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
c280: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 6e 61  >=0 ){.      ana
c290: 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61  lyzeDatabase(pPa
c2a0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d  rse, iDb);.    }
c2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
c2c0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
c2d0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 31 29  oken(db, pName1)
c2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 20 29 7b  ;.      if( z ){
c2f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
c300: 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  dx = sqlite3Find
c310: 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 30 29 29  Index(db, z, 0))
c320: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
c330: 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50   analyzeTable(pP
c340: 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  arse, pIdx->pTab
c350: 6c 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  le, pIdx);.     
c360: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
c370: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
c380: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
c390: 30 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a  0, z, 0))!=0 ){.
c3a0: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
c3b0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c3c0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
c3d0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
c3e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
c3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
c410: 6f 72 6d 20 33 3a 20 41 6e 61 6c 79 7a 65 20 74  orm 3: Analyze t
c420: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
c430: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  ed table name */
c440: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
c450: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
c460: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
c470: 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e 61 6d  ame2, &pTableNam
c480: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e  e);.    if( iDb>
c490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20  =0 ){.      zDb 
c4a0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
c4b0: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7a  DbSName;.      z
c4c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
c4d0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
c4e0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  leName);.      i
c4f0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
c500: 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69  if( (pIdx = sqli
c510: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
c520: 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a   z, zDb))!=0 ){.
c530: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
c540: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c550: 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64  Idx->pTable, pId
c560: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
c570: 65 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71  e if( (pTab = sq
c580: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
c590: 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 7a  (pParse, 0, z, z
c5a0: 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Db))!=0 ){.     
c5b0: 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c       analyzeTabl
c5c0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
c5d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
c5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c5f0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
c600: 20 20 7d 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d    }.    }   .  }
c610: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
c620: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c630: 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33   if( v ) sqlite3
c640: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c650: 5f 45 78 70 69 72 65 29 3b 0a 7d 0a 0a 2f 2a 0a  _Expire);.}../*.
c660: 2a 2a 20 55 73 65 64 20 74 6f 20 70 61 73 73 20  ** Used to pass 
c670: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
c680: 20 74 68 65 20 61 6e 61 6c 79 7a 65 72 20 72 65   the analyzer re
c690: 61 64 65 72 20 74 68 72 6f 75 67 68 20 74 6f 20  ader through to 
c6a0: 74 68 65 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  the.** callback 
c6b0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
c6c0: 64 65 66 20 73 74 72 75 63 74 20 61 6e 61 6c 79  def struct analy
c6d0: 73 69 73 49 6e 66 6f 20 61 6e 61 6c 79 73 69 73  sisInfo analysis
c6e0: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 61 6e 61  Info;.struct ana
c6f0: 6c 79 73 69 73 49 6e 66 6f 20 7b 0a 20 20 73 71  lysisInfo {.  sq
c700: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
c710: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
c720: 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  se;.};../*.** Th
c730: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c740: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
c750: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
c760: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ng containing a.
c770: 2a 2a 20 6c 69 73 74 20 6f 66 20 73 70 61 63 65  ** list of space
c780: 20 73 65 70 61 72 61 74 65 64 20 69 6e 74 65 67   separated integ
c790: 65 72 73 2e 20 52 65 61 64 20 74 68 65 20 66 69  ers. Read the fi
c7a0: 72 73 74 20 6e 4f 75 74 20 6f 66 20 74 68 65 73  rst nOut of thes
c7b0: 65 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 61 72  e into.** the ar
c7c0: 72 61 79 20 61 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73  ray aOut[]..*/.s
c7d0: 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f 64  tatic void decod
c7e0: 65 49 6e 74 41 72 72 61 79 28 0a 20 20 63 68 61  eIntArray(.  cha
c7f0: 72 20 2a 7a 49 6e 74 41 72 72 61 79 2c 20 20 20  r *zIntArray,   
c800: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f      /* String co
c810: 6e 74 61 69 6e 69 6e 67 20 69 6e 74 20 61 72 72  ntaining int arr
c820: 61 79 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  ay to decode */.
c830: 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20    int nOut,     
c840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c850: 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61  er of slots in a
c860: 4f 75 74 5b 5d 20 2a 2f 0a 20 20 74 52 6f 77 63  Out[] */.  tRowc
c870: 6e 74 20 2a 61 4f 75 74 2c 20 20 20 20 20 20 20  nt *aOut,       
c880: 20 20 2f 2a 20 53 74 6f 72 65 20 69 6e 74 65 67    /* Store integ
c890: 65 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 4c 6f  ers here */.  Lo
c8a0: 67 45 73 74 20 2a 61 4c 6f 67 2c 20 20 20 20 20  gEst *aLog,     
c8b0: 20 20 20 20 20 2f 2a 20 4f 72 2c 20 69 66 20 61       /* Or, if a
c8c0: 4f 75 74 3d 3d 30 2c 20 68 65 72 65 20 2a 2f 0a  Out==0, here */.
c8d0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
c8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
c8f0: 6c 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 66  le extra flags f
c900: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  or this index, i
c910: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
c920: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 49 6e  .  char *z = zIn
c930: 74 41 72 72 61 79 3b 0a 20 20 69 6e 74 20 63 3b  tArray;.  int c;
c940: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77  .  int i;.  tRow
c950: 63 6e 74 20 76 3b 0a 0a 23 69 66 64 65 66 20 53  cnt v;..#ifdef S
c960: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
c970: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66  T3_OR_STAT4.  if
c980: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
c990: 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28  .#else.  assert(
c9a0: 20 7a 21 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a   z!=0 );.#endif.
c9b0: 20 20 66 6f 72 28 69 3d 30 3b 20 2a 7a 20 26 26    for(i=0; *z &&
c9c0: 20 69 3c 6e 4f 75 74 3b 20 69 2b 2b 29 7b 0a 20   i<nOut; i++){. 
c9d0: 20 20 20 76 20 3d 20 30 3b 0a 20 20 20 20 77 68     v = 0;.    wh
c9e0: 69 6c 65 28 20 28 63 3d 7a 5b 30 5d 29 3e 3d 27  ile( (c=z[0])>='
c9f0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a  0' && c<='9' ){.
ca00: 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b        v = v*10 +
ca10: 20 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20   c - '0';.      
ca20: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  z++;.    }.#ifde
ca30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ca40: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
ca50: 20 20 20 69 66 28 20 61 4f 75 74 20 29 20 61 4f     if( aOut ) aO
ca60: 75 74 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20 69  ut[i] = v;.    i
ca70: 66 28 20 61 4c 6f 67 20 29 20 61 4c 6f 67 5b 69  f( aLog ) aLog[i
ca80: 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ] = sqlite3LogEs
ca90: 74 28 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  t(v);.#else.    
caa0: 61 73 73 65 72 74 28 20 61 4f 75 74 3d 3d 30 20  assert( aOut==0 
cab0: 29 3b 0a 20 20 20 20 55 4e 55 53 45 44 5f 50 41  );.    UNUSED_PA
cac0: 52 41 4d 45 54 45 52 28 61 4f 75 74 29 3b 0a 20  RAMETER(aOut);. 
cad0: 20 20 20 61 73 73 65 72 74 28 20 61 4c 6f 67 21     assert( aLog!
cae0: 3d 30 20 29 3b 0a 20 20 20 20 61 4c 6f 67 5b 69  =0 );.    aLog[i
caf0: 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ] = sqlite3LogEs
cb00: 74 28 76 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  t(v);.#endif.   
cb10: 20 69 66 28 20 2a 7a 3d 3d 27 20 27 20 29 20 7a   if( *z==' ' ) z
cb20: 2b 2b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ++;.  }.#ifndef 
cb30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
cb40: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 61  AT3_OR_STAT4.  a
cb50: 73 73 65 72 74 28 20 70 49 6e 64 65 78 21 3d 30  ssert( pIndex!=0
cb60: 20 29 3b 20 7b 0a 23 65 6c 73 65 0a 20 20 69 66   ); {.#else.  if
cb70: 28 20 70 49 6e 64 65 78 20 29 7b 0a 23 65 6e 64  ( pIndex ){.#end
cb80: 69 66 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 62  if.    pIndex->b
cb90: 55 6e 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20  Unordered = 0;. 
cba0: 20 20 20 70 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69     pIndex->noSki
cbb0: 70 53 63 61 6e 20 3d 20 30 3b 0a 20 20 20 20 77  pScan = 0;.    w
cbc0: 68 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20  hile( z[0] ){.  
cbd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
cbe0: 73 74 72 67 6c 6f 62 28 22 75 6e 6f 72 64 65 72  strglob("unorder
cbf0: 65 64 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20  ed*", z)==0 ){. 
cc00: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 62         pIndex->b
cc10: 55 6e 6f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20  Unordered = 1;. 
cc20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
cc30: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
cc40: 73 7a 3d 5b 30 2d 39 5d 2a 22 2c 20 7a 29 3d 3d  sz=[0-9]*", z)==
cc50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
cc60: 64 65 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  dex->szIdxRow = 
cc70: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 71  sqlite3LogEst(sq
cc80: 6c 69 74 65 33 41 74 6f 69 28 7a 2b 33 29 29 3b  lite3Atoi(z+3));
cc90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
cca0: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
ccb0: 28 22 6e 6f 73 6b 69 70 73 63 61 6e 2a 22 2c 20  ("noskipscan*", 
ccc0: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
ccd0: 20 70 49 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70 53   pIndex->noSkipS
cce0: 63 61 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  can = 1;.      }
ccf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cd00: 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 20  NABLE_COSTMULT. 
cd10: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 71       else if( sq
cd20: 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 63  lite3_strglob("c
cd30: 6f 73 74 6d 75 6c 74 3d 5b 30 2d 39 5d 2a 22 2c  ostmult=[0-9]*",
cd40: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
cd50: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
cd60: 3e 63 6f 73 74 4d 75 6c 74 20 3d 20 73 71 6c 69  >costMult = sqli
cd70: 74 65 33 4c 6f 67 45 73 74 28 73 71 6c 69 74 65  te3LogEst(sqlite
cd80: 33 41 74 6f 69 28 7a 2b 39 29 29 3b 0a 20 20 20  3Atoi(z+9));.   
cd90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
cda0: 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 21 3d 30    while( z[0]!=0
cdb0: 20 26 26 20 7a 5b 30 5d 21 3d 27 20 27 20 29 20   && z[0]!=' ' ) 
cdc0: 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  z++;.      while
cdd0: 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b  ( z[0]==' ' ) z+
cde0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
cdf0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62  /*.** This callb
ce00: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ack is invoked o
ce10: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 64  nce for each ind
ce20: 65 78 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ex when reading 
ce30: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74  the.** sqlite_st
ce40: 61 74 31 20 74 61 62 6c 65 2e 20 20 0a 2a 2a 0a  at1 table.  .**.
ce50: 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d  **     argv[0] =
ce60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
ce70: 6c 65 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 31  le.**     argv[1
ce80: 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ] = name of the 
ce90: 69 6e 64 65 78 20 28 6d 69 67 68 74 20 62 65 20  index (might be 
cea0: 4e 55 4c 4c 29 0a 2a 2a 20 20 20 20 20 61 72 67  NULL).**     arg
ceb0: 76 5b 32 5d 20 3d 20 72 65 73 75 6c 74 73 20 6f  v[2] = results o
cec0: 66 20 61 6e 61 6c 79 73 69 73 20 2d 20 6f 6e 20  f analysis - on 
ced0: 69 6e 74 65 67 65 72 20 66 6f 72 20 65 61 63 68  integer for each
cee0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e   column.**.** En
cef0: 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20  tries for which 
cf00: 61 72 67 76 5b 31 5d 3d 3d 4e 55 4c 4c 20 73 69  argv[1]==NULL si
cf10: 6d 70 6c 79 20 72 65 63 6f 72 64 20 74 68 65 20  mply record the 
cf20: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
cf30: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a  n.** the table..
cf40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
cf50: 61 6c 79 73 69 73 4c 6f 61 64 65 72 28 76 6f 69  alysisLoader(voi
cf60: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72  d *pData, int ar
cf70: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
cf80: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
cf90: 7b 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f  {.  analysisInfo
cfa0: 20 2a 70 49 6e 66 6f 20 3d 20 28 61 6e 61 6c 79   *pInfo = (analy
cfb0: 73 69 73 49 6e 66 6f 2a 29 70 44 61 74 61 3b 0a  sisInfo*)pData;.
cfc0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
cfd0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
cfe0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
cff0: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  z;..  assert( ar
d000: 67 63 3d 3d 33 20 29 3b 0a 20 20 55 4e 55 53 45  gc==3 );.  UNUSE
d010: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
d020: 55 73 65 64 2c 20 61 72 67 63 29 3b 0a 0a 20 20  Used, argc);..  
d030: 69 66 28 20 61 72 67 76 3d 3d 30 20 7c 7c 20 61  if( argv==0 || a
d040: 72 67 76 5b 30 5d 3d 3d 30 20 7c 7c 20 61 72 67  rgv[0]==0 || arg
d050: 76 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  v[2]==0 ){.    r
d060: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
d070: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
d080: 69 6e 64 54 61 62 6c 65 28 70 49 6e 66 6f 2d 3e  indTable(pInfo->
d090: 64 62 2c 20 61 72 67 76 5b 30 5d 2c 20 70 49 6e  db, argv[0], pIn
d0a0: 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  fo->zDatabase);.
d0b0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
d0c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d0d0: 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76 5b  .  }.  if( argv[
d0e0: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e  1]==0 ){.    pIn
d0f0: 64 65 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  dex = 0;.  }else
d100: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
d110: 69 63 6d 70 28 61 72 67 76 5b 30 5d 2c 61 72 67  icmp(argv[0],arg
d120: 76 5b 31 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  v[1])==0 ){.    
d130: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
d140: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
d150: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
d160: 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 73  {.    pIndex = s
d170: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
d180: 70 49 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b  pInfo->db, argv[
d190: 31 5d 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61  1], pInfo->zData
d1a0: 62 61 73 65 29 3b 0a 20 20 7d 0a 20 20 7a 20 3d  base);.  }.  z =
d1b0: 20 61 72 67 76 5b 32 5d 3b 0a 0a 20 20 69 66 28   argv[2];..  if(
d1c0: 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 74   pIndex ){.    t
d1d0: 52 6f 77 63 6e 74 20 2a 61 69 52 6f 77 45 73 74  Rowcnt *aiRowEst
d1e0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43   = 0;.    int nC
d1f0: 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  ol = pIndex->nKe
d200: 79 43 6f 6c 2b 31 3b 0a 23 69 66 64 65 66 20 53  yCol+1;.#ifdef S
d210: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
d220: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
d230: 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
d240: 74 20 6d 61 79 20 61 6c 72 65 61 64 79 20 62 65  t may already be
d250: 20 73 65 74 20 68 65 72 65 20 69 66 20 74 68 65   set here if the
d260: 72 65 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  re are duplicate
d270: 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f   .    ** sqlite_
d280: 73 74 61 74 31 20 65 6e 74 72 69 65 73 20 66 6f  stat1 entries fo
d290: 72 20 74 68 69 73 20 69 6e 64 65 78 2e 20 49 6e  r this index. In
d2a0: 20 74 68 61 74 20 63 61 73 65 20 6a 75 73 74 20   that case just 
d2b0: 63 6c 6f 62 62 65 72 0a 20 20 20 20 2a 2a 20 74  clobber.    ** t
d2c0: 68 65 20 6f 6c 64 20 64 61 74 61 20 77 69 74 68  he old data with
d2d0: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 65 61 64   the new instead
d2e0: 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61   of allocating a
d2f0: 20 6e 65 77 20 61 72 72 61 79 2e 20 20 2a 2f 0a   new array.  */.
d300: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
d310: 61 69 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20  aiRowEst==0 ){. 
d320: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 52       pIndex->aiR
d330: 6f 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74  owEst = (tRowcnt
d340: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
d350: 65 72 6f 28 73 69 7a 65 6f 66 28 74 52 6f 77 63  ero(sizeof(tRowc
d360: 6e 74 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 20  nt) * nCol);.   
d370: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
d380: 69 52 6f 77 45 73 74 3d 3d 30 20 29 20 73 71 6c  iRowEst==0 ) sql
d390: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 70 49 6e  ite3OomFault(pIn
d3a0: 66 6f 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  fo->db);.    }. 
d3b0: 20 20 20 61 69 52 6f 77 45 73 74 20 3d 20 70 49     aiRowEst = pI
d3c0: 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  ndex->aiRowEst;.
d3d0: 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 64 65  #endif.    pInde
d3e0: 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d 20  x->bUnordered = 
d3f0: 30 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e 74  0;.    decodeInt
d400: 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a 2c 20  Array((char*)z, 
d410: 6e 43 6f 6c 2c 20 61 69 52 6f 77 45 73 74 2c 20  nCol, aiRowEst, 
d420: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67  pIndex->aiRowLog
d430: 45 73 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  Est, pIndex);.  
d440: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 50    if( pIndex->pP
d450: 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29  artIdxWhere==0 )
d460: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
d470: 45 73 74 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  Est = pIndex->ai
d480: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
d490: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
d4a0: 20 66 61 6b 65 49 64 78 3b 0a 20 20 20 20 66 61   fakeIdx;.    fa
d4b0: 6b 65 49 64 78 2e 73 7a 49 64 78 52 6f 77 20 3d  keIdx.szIdxRow =
d4c0: 20 70 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f   pTable->szTabRo
d4d0: 77 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  w;.#ifdef SQLITE
d4e0: 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54  _ENABLE_COSTMULT
d4f0: 0a 20 20 20 20 66 61 6b 65 49 64 78 2e 70 54 61  .    fakeIdx.pTa
d500: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 23 65  ble = pTable;.#e
d510: 6e 64 69 66 0a 20 20 20 20 64 65 63 6f 64 65 49  ndif.    decodeI
d520: 6e 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 7a  ntArray((char*)z
d530: 2c 20 31 2c 20 30 2c 20 26 70 54 61 62 6c 65 2d  , 1, 0, &pTable-
d540: 3e 6e 52 6f 77 4c 6f 67 45 73 74 2c 20 26 66 61  >nRowLogEst, &fa
d550: 6b 65 49 64 78 29 3b 0a 20 20 20 20 70 54 61 62  keIdx);.    pTab
d560: 6c 65 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 66  le->szTabRow = f
d570: 61 6b 65 49 64 78 2e 73 7a 49 64 78 52 6f 77 3b  akeIdx.szIdxRow;
d580: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
d590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
d5a0: 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 20  e Index.aSample 
d5b0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
d5c0: 4e 55 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65  NULL, delete the
d5d0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
d5e0: 0a 2a 2a 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  .** and its cont
d5f0: 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
d600: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
d610: 53 61 6d 70 6c 65 73 28 73 71 6c 69 74 65 33 20  Samples(sqlite3 
d620: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
d630: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d640: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d650: 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 49 64  _STAT4.  if( pId
d660: 78 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->aSample ){.  
d670: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72    int j;.    for
d680: 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 53  (j=0; j<pIdx->nS
d690: 61 6d 70 6c 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ample; j++){.   
d6a0: 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a     IndexSample *
d6b0: 70 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70  p = &pIdx->aSamp
d6c0: 6c 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 71 6c  le[j];.      sql
d6d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d6e0: 2d 3e 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->p);.    }.    
d6f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d700: 2c 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29  , pIdx->aSample)
d710: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 20 26  ;.  }.  if( db &
d720: 26 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  & db->pnBytesFre
d730: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 64  ed==0 ){.    pId
d740: 78 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 30 3b 0a  x->nSample = 0;.
d750: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
d760: 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6c 73 65  e = 0;.  }.#else
d770: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
d780: 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
d790: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 49 64 78  D_PARAMETER(pIdx
d7a0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
d7b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
d7c0: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 7d 0a 0a  _OR_STAT4 */.}..
d7d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d7e0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
d7f0: 41 54 34 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  AT4./*.** Popula
d800: 74 65 20 74 68 65 20 70 49 64 78 2d 3e 61 41 76  te the pIdx->aAv
d810: 67 45 71 5b 5d 20 61 72 72 61 79 20 62 61 73 65  gEq[] array base
d820: 64 20 6f 6e 20 74 68 65 20 73 61 6d 70 6c 65 73  d on the samples
d830: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74   currently.** st
d840: 6f 72 65 64 20 69 6e 20 70 49 64 78 2d 3e 61 53  ored in pIdx->aS
d850: 61 6d 70 6c 65 5b 5d 2e 20 0a 2a 2f 0a 73 74 61  ample[]. .*/.sta
d860: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 41 76 67  tic void initAvg
d870: 45 71 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  Eq(Index *pIdx){
d880: 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20  .  if( pIdx ){. 
d890: 20 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a     IndexSample *
d8a0: 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  aSample = pIdx->
d8b0: 61 53 61 6d 70 6c 65 3b 0a 20 20 20 20 49 6e 64  aSample;.    Ind
d8c0: 65 78 53 61 6d 70 6c 65 20 2a 70 46 69 6e 61 6c  exSample *pFinal
d8d0: 20 3d 20 26 61 53 61 6d 70 6c 65 5b 70 49 64 78   = &aSample[pIdx
d8e0: 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 3b 0a 20 20  ->nSample-1];.  
d8f0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
d900: 69 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20  int nCol = 1;.  
d910: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 53 61 6d    if( pIdx->nSam
d920: 70 6c 65 43 6f 6c 3e 31 20 29 7b 0a 20 20 20 20  pleCol>1 ){.    
d930: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
d940: 73 74 61 74 34 20 64 61 74 61 2c 20 74 68 65 6e  stat4 data, then
d950: 20 63 61 6c 63 75 6c 61 74 65 20 61 41 76 67 45   calculate aAvgE
d960: 71 5b 5d 20 76 61 6c 75 65 73 20 66 6f 72 20 61  q[] values for a
d970: 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 73 61 6d 70  ll.      ** samp
d980: 6c 65 20 63 6f 6c 75 6d 6e 73 20 65 78 63 65 70  le columns excep
d990: 74 20 74 68 65 20 6c 61 73 74 2e 20 54 68 65 20  t the last. The 
d9a0: 6c 61 73 74 20 69 73 20 61 6c 77 61 79 73 20 73  last is always s
d9b0: 65 74 20 74 6f 20 31 2c 20 61 73 0a 20 20 20 20  et to 1, as.    
d9c0: 20 20 2a 2a 20 6f 6e 63 65 20 74 68 65 20 74 72    ** once the tr
d9d0: 61 69 6c 69 6e 67 20 50 4b 20 66 69 65 6c 64 73  ailing PK fields
d9e0: 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
d9f0: 61 6c 6c 20 69 6e 64 65 78 20 6b 65 79 73 20 61  all index keys a
da00: 72 65 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71  re.      ** uniq
da10: 75 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6e 43  ue.  */.      nC
da20: 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ol = pIdx->nSamp
da30: 6c 65 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 70  leCol-1;.      p
da40: 49 64 78 2d 3e 61 41 76 67 45 71 5b 6e 43 6f 6c  Idx->aAvgEq[nCol
da50: 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 1;.    }.   
da60: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
da70: 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  l<nCol; iCol++){
da80: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70  .      int nSamp
da90: 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70  le = pIdx->nSamp
daa0: 6c 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  le;.      int i;
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
dad0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
dae0: 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  amples */.      
daf0: 74 52 6f 77 63 6e 74 20 73 75 6d 45 71 20 3d 20  tRowcnt sumEq = 
db00: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 75 6d  0;        /* Sum
db10: 20 6f 66 20 74 68 65 20 6e 45 71 20 76 61 6c 75   of the nEq valu
db20: 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77  es */.      tRow
db30: 63 6e 74 20 61 76 67 45 71 20 3d 20 30 3b 0a 20  cnt avgEq = 0;. 
db40: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f       tRowcnt nRo
db50: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  w;             /
db60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
db70: 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20   in index */.   
db80: 20 20 20 69 36 34 20 6e 53 75 6d 31 30 30 20 3d     i64 nSum100 =
db90: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
dba0: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
dbb0: 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 74 6f 20  contributing to 
dbc0: 73 75 6d 45 71 20 2a 2f 0a 20 20 20 20 20 20 69  sumEq */.      i
dbd0: 36 34 20 6e 44 69 73 74 31 30 30 3b 20 20 20 20  64 nDist100;    
dbe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dbf0: 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 76  er of distinct v
dc00: 61 6c 75 65 73 20 69 6e 20 69 6e 64 65 78 20 2a  alues in index *
dc10: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 49  /..      if( !pI
dc20: 64 78 2d 3e 61 69 52 6f 77 45 73 74 20 7c 7c 20  dx->aiRowEst || 
dc30: 69 43 6f 6c 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  iCol>=pIdx->nKey
dc40: 43 6f 6c 20 7c 7c 20 70 49 64 78 2d 3e 61 69 52  Col || pIdx->aiR
dc50: 6f 77 45 73 74 5b 69 43 6f 6c 2b 31 5d 3d 3d 30  owEst[iCol+1]==0
dc60: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77   ){.        nRow
dc70: 20 3d 20 70 46 69 6e 61 6c 2d 3e 61 6e 4c 74 5b   = pFinal->anLt[
dc80: 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 6e  iCol];.        n
dc90: 44 69 73 74 31 30 30 20 3d 20 28 69 36 34 29 31  Dist100 = (i64)1
dca0: 30 30 20 2a 20 70 46 69 6e 61 6c 2d 3e 61 6e 44  00 * pFinal->anD
dcb0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  Lt[iCol];.      
dcc0: 20 20 6e 53 61 6d 70 6c 65 2d 2d 3b 0a 20 20 20    nSample--;.   
dcd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dce0: 20 20 6e 52 6f 77 20 3d 20 70 49 64 78 2d 3e 61    nRow = pIdx->a
dcf0: 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20  iRowEst[0];.    
dd00: 20 20 20 20 6e 44 69 73 74 31 30 30 20 3d 20 28      nDist100 = (
dd10: 28 69 36 34 29 31 30 30 20 2a 20 70 49 64 78 2d  (i64)100 * pIdx-
dd20: 3e 61 69 52 6f 77 45 73 74 5b 30 5d 29 20 2f 20  >aiRowEst[0]) / 
dd30: 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69  pIdx->aiRowEst[i
dd40: 43 6f 6c 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  Col+1];.      }.
dd50: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 52 6f 77        pIdx->nRow
dd60: 45 73 74 30 20 3d 20 6e 52 6f 77 3b 0a 0a 20 20  Est0 = nRow;..  
dd70: 20 20 20 20 2f 2a 20 53 65 74 20 6e 53 75 6d 20      /* Set nSum 
dd80: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
dd90: 20 64 69 73 74 69 6e 63 74 20 28 69 43 6f 6c 2b   distinct (iCol+
dda0: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 65  1) field prefixe
ddb0: 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  s that.      ** 
ddc0: 6f 63 63 75 72 20 69 6e 20 74 68 65 20 73 74 61  occur in the sta
ddd0: 74 34 20 74 61 62 6c 65 20 66 6f 72 20 74 68 69  t4 table for thi
dde0: 73 20 69 6e 64 65 78 2e 20 53 65 74 20 73 75 6d  s index. Set sum
ddf0: 45 71 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  Eq to the sum of
de00: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e   .      ** the n
de10: 45 71 20 76 61 6c 75 65 73 20 66 6f 72 20 63 6f  Eq values for co
de20: 6c 75 6d 6e 20 69 43 6f 6c 20 66 6f 72 20 74 68  lumn iCol for th
de30: 65 20 73 61 6d 65 20 73 65 74 20 28 61 64 64 69  e same set (addi
de40: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 0a 20 20  ng the value .  
de50: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65      ** only once
de60: 20 77 68 65 72 65 20 74 68 65 72 65 20 65 78 69   where there exi
de70: 73 74 20 64 75 70 6c 69 63 61 74 65 20 70 72 65  st duplicate pre
de80: 66 69 78 65 73 29 2e 20 20 2a 2f 0a 20 20 20 20  fixes).  */.    
de90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61    for(i=0; i<nSa
dea0: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
deb0: 20 20 20 20 69 66 28 20 69 3d 3d 28 70 49 64 78      if( i==(pIdx
dec0: 2d 3e 6e 53 61 6d 70 6c 65 2d 31 29 0a 20 20 20  ->nSample-1).   
ded0: 20 20 20 20 20 20 7c 7c 20 61 53 61 6d 70 6c 65        || aSample
dee0: 5b 69 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 21  [i].anDLt[iCol]!
def0: 3d 61 53 61 6d 70 6c 65 5b 69 2b 31 5d 2e 61 6e  =aSample[i+1].an
df00: 44 4c 74 5b 69 43 6f 6c 5d 20 0a 20 20 20 20 20  DLt[iCol] .     
df10: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
df20: 73 75 6d 45 71 20 2b 3d 20 61 53 61 6d 70 6c 65  sumEq += aSample
df30: 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a  [i].anEq[iCol];.
df40: 20 20 20 20 20 20 20 20 20 20 6e 53 75 6d 31 30            nSum10
df50: 30 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  0 += 100;.      
df60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
df70: 20 20 20 69 66 28 20 6e 44 69 73 74 31 30 30 3e     if( nDist100>
df80: 6e 53 75 6d 31 30 30 20 26 26 20 73 75 6d 45 71  nSum100 && sumEq
df90: 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  <nRow ){.       
dfa0: 20 61 76 67 45 71 20 3d 20 28 28 69 36 34 29 31   avgEq = ((i64)1
dfb0: 30 30 20 2a 20 28 6e 52 6f 77 20 2d 20 73 75 6d  00 * (nRow - sum
dfc0: 45 71 29 29 2f 28 6e 44 69 73 74 31 30 30 20 2d  Eq))/(nDist100 -
dfd0: 20 6e 53 75 6d 31 30 30 29 3b 0a 20 20 20 20 20   nSum100);.     
dfe0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 76 67   }.      if( avg
dff0: 45 71 3d 3d 30 20 29 20 61 76 67 45 71 20 3d 20  Eq==0 ) avgEq = 
e000: 31 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  1;.      pIdx->a
e010: 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3d 20 61 76  AvgEq[iCol] = av
e020: 67 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  gEq;.    }.  }.}
e030: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20  ../*.** Look up 
e040: 61 6e 20 69 6e 64 65 78 20 62 79 20 6e 61 6d 65  an index by name
e050: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 6e 61  .  Or, if the na
e060: 6d 65 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20  me of a WITHOUT 
e070: 52 4f 57 49 44 20 74 61 62 6c 65 0a 2a 2a 20 69  ROWID table.** i
e080: 73 20 73 75 70 70 6c 69 65 64 20 69 6e 73 74 65  s supplied inste
e090: 61 64 2c 20 66 69 6e 64 20 74 68 65 20 50 52 49  ad, find the PRI
e0a0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66  MARY KEY index f
e0b0: 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  or that table..*
e0c0: 2f 0a 73 74 61 74 69 63 20 49 6e 64 65 78 20 2a  /.static Index *
e0d0: 66 69 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61  findIndexOrPrima
e0e0: 72 79 4b 65 79 28 0a 20 20 73 71 6c 69 74 65 33  ryKey(.  sqlite3
e0f0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
e100: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 63 6f 6e  ar *zName,.  con
e110: 73 74 20 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a  st char *zDb.){.
e120: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
e130: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
e140: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
e150: 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20  ;.  if( pIdx==0 
e160: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
e170: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
e180: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
e190: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
e1a0: 54 61 62 20 26 26 20 21 48 61 73 52 6f 77 69 64  Tab && !HasRowid
e1b0: 28 70 54 61 62 29 20 29 20 70 49 64 78 20 3d 20  (pTab) ) pIdx = 
e1c0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
e1d0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
e1e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 3b  }.  return pIdx;
e1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
e200: 68 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  he content from 
e210: 65 69 74 68 65 72 20 74 68 65 20 73 71 6c 69 74  either the sqlit
e220: 65 5f 73 74 61 74 34 20 6f 72 20 73 71 6c 69 74  e_stat4 or sqlit
e230: 65 5f 73 74 61 74 33 20 74 61 62 6c 65 20 0a 2a  e_stat3 table .*
e240: 2a 20 69 6e 74 6f 20 74 68 65 20 72 65 6c 65 76  * into the relev
e250: 61 6e 74 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c  ant Index.aSampl
e260: 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a  e[] arrays..**.*
e270: 2a 20 41 72 67 75 6d 65 6e 74 73 20 7a 53 71 6c  * Arguments zSql
e280: 31 20 61 6e 64 20 7a 53 71 6c 32 20 6d 75 73 74  1 and zSql2 must
e290: 20 70 6f 69 6e 74 20 74 6f 20 53 51 4c 20 73 74   point to SQL st
e2a0: 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 72 65  atements that re
e2b0: 74 75 72 6e 0a 2a 2a 20 64 61 74 61 20 65 71 75  turn.** data equ
e2c0: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66  ivalent to the f
e2d0: 6f 6c 6c 6f 77 69 6e 67 20 28 73 74 61 74 65 6d  ollowing (statem
e2e0: 65 6e 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ents are differe
e2f0: 6e 74 20 66 6f 72 20 73 74 61 74 33 2c 0a 2a 2a  nt for stat3,.**
e300: 20 73 65 65 20 74 68 65 20 63 61 6c 6c 65 72 20   see the caller 
e310: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e320: 20 66 6f 72 20 64 65 74 61 69 6c 73 29 3a 0a 2a   for details):.*
e330: 2a 0a 2a 2a 20 20 20 20 7a 53 71 6c 31 3a 20 53  *.**    zSql1: S
e340: 45 4c 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28  ELECT idx,count(
e350: 2a 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  *) FROM %Q.sqlit
e360: 65 5f 73 74 61 74 34 20 47 52 4f 55 50 20 42 59  e_stat4 GROUP BY
e370: 20 69 64 78 0a 2a 2a 20 20 20 20 7a 53 71 6c 32   idx.**    zSql2
e380: 3a 20 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71  : SELECT idx,neq
e390: 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65  ,nlt,ndlt,sample
e3a0: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
e3b0: 73 74 61 74 34 0a 2a 2a 0a 2a 2a 20 77 68 65 72  stat4.**.** wher
e3c0: 65 20 25 51 20 69 73 20 72 65 70 6c 61 63 65 64  e %Q is replaced
e3d0: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
e3e0: 73 65 20 6e 61 6d 65 20 62 65 66 6f 72 65 20 74  se name before t
e3f0: 68 65 20 53 51 4c 20 69 73 20 65 78 65 63 75 74  he SQL is execut
e400: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e410: 74 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 0a 20  t loadStatTbl(. 
e420: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e440: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
e450: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 53 74 61 74  e */.  int bStat
e460: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
e470: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 73       /* Assume s
e480: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 63  ingle column rec
e490: 6f 72 64 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63  ords only */.  c
e4a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31  onst char *zSql1
e4b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e4c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 31 20  SQL statement 1 
e4d0: 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20  (see above) */. 
e4e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
e4f0: 6c 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  l2,            /
e500: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
e510: 32 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  2 (see above) */
e520: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e530: 44 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Db              
e540: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
e550: 65 20 28 65 2e 67 2e 20 22 6d 61 69 6e 22 29 20  e (e.g. "main") 
e560: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
e590: 63 6f 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f  codes from subro
e5a0: 75 74 69 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69  utines */.  sqli
e5b0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
e5c0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20  = 0;      /* An 
e5d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
e5e0: 69 6e 67 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61  ing run */.  cha
e5f0: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
e600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
e610: 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
e620: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 49 6e 64  atement */.  Ind
e630: 65 78 20 2a 70 50 72 65 76 49 64 78 20 3d 20 30  ex *pPrevIdx = 0
e640: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ;          /* Pr
e650: 65 76 69 6f 75 73 20 69 6e 64 65 78 20 69 6e 20  evious index in 
e660: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 49 6e  the loop */.  In
e670: 64 65 78 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70  dexSample *pSamp
e680: 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  le;         /* A
e690: 20 73 6c 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61   slot in pIdx->a
e6a0: 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 61  Sample[] */..  a
e6b0: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
e6c0: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
e6d0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
e6e0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 53 71  3MPrintf(db, zSq
e6f0: 6c 31 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  l1, zDb);.  if( 
e700: 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65 74  !zSql ){.    ret
e710: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e720: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
e730: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
e740: 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  e(db, zSql, -1, 
e750: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71  &pStmt, 0);.  sq
e760: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e770: 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  zSql);.  if( rc 
e780: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
e790: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
e7a0: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
e7b0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
e7c0: 74 20 6e 49 64 78 43 6f 6c 20 3d 20 31 3b 20 20  t nIdxCol = 1;  
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e7e0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
e7f0: 20 69 6e 20 73 74 61 74 34 20 72 65 63 6f 72 64   in stat4 record
e800: 73 20 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a  s */..    char *
e810: 7a 49 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64  zIndex;   /* Ind
e820: 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49  ex name */.    I
e830: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f  ndex *pIdx;    /
e840: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
e850: 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
e860: 0a 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65  .    int nSample
e870: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
e880: 66 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20  f samples */.   
e890: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
e8a0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
e8b0: 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  ce required */. 
e8c0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
e8d0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
e8e0: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f  pace required */
e8f0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 70 53  .    tRowcnt *pS
e900: 70 61 63 65 3b 0a 0a 20 20 20 20 7a 49 6e 64 65  pace;..    zInde
e910: 78 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  x = (char *)sqli
e920: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
e930: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
e940: 66 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63  f( zIndex==0 ) c
e950: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 53 61  ontinue;.    nSa
e960: 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  mple = sqlite3_c
e970: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
e980: 20 31 29 3b 0a 20 20 20 20 70 49 64 78 20 3d 20   1);.    pIdx = 
e990: 66 69 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61  findIndexOrPrima
e9a0: 72 79 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78  ryKey(db, zIndex
e9b0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 61 73 73 65  , zDb);.    asse
e9c0: 72 74 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 62  rt( pIdx==0 || b
e9d0: 53 74 61 74 33 20 7c 7c 20 70 49 64 78 2d 3e 6e  Stat3 || pIdx->n
e9e0: 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  Sample==0 );.   
e9f0: 20 2f 2a 20 49 6e 64 65 78 2e 6e 53 61 6d 70 6c   /* Index.nSampl
ea00: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 74  e is non-zero at
ea10: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66 20 64   this point if d
ea20: 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20  ata has already 
ea30: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  been.    ** load
ea40: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
ea50: 34 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73  4 table. In this
ea60: 20 63 61 73 65 20 69 67 6e 6f 72 65 20 73 74 61   case ignore sta
ea70: 74 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20  t3 data.  */.   
ea80: 20 69 66 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20   if( pIdx==0 || 
ea90: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 20  pIdx->nSample ) 
eaa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
eab0: 28 20 62 53 74 61 74 33 3d 3d 30 20 29 7b 0a 20  ( bStat3==0 ){. 
eac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 48 61       assert( !Ha
ead0: 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61  sRowid(pIdx->pTa
eae0: 62 6c 65 29 20 7c 7c 20 70 49 64 78 2d 3e 6e 43  ble) || pIdx->nC
eaf0: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 6e 4b 65  olumn==pIdx->nKe
eb00: 79 43 6f 6c 2b 31 20 29 3b 0a 20 20 20 20 20 20  yCol+1 );.      
eb10: 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49  if( !HasRowid(pI
eb20: 64 78 2d 3e 70 54 61 62 6c 65 29 20 26 26 20 49  dx->pTable) && I
eb30: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
eb40: 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  (pIdx) ){.      
eb50: 20 20 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64 78    nIdxCol = pIdx
eb60: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
eb70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eb80: 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nIdxCol = pIdx->
eb90: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7d  nColumn;.      }
eba0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d  .    }.    pIdx-
ebb0: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 3d 20 6e 49  >nSampleCol = nI
ebc0: 64 78 43 6f 6c 3b 0a 20 20 20 20 6e 42 79 74 65  dxCol;.    nByte
ebd0: 20 3d 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 53   = sizeof(IndexS
ebe0: 61 6d 70 6c 65 29 20 2a 20 6e 53 61 6d 70 6c 65  ample) * nSample
ebf0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73  ;.    nByte += s
ec00: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a  izeof(tRowcnt) *
ec10: 20 6e 49 64 78 43 6f 6c 20 2a 20 33 20 2a 20 6e   nIdxCol * 3 * n
ec20: 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74  Sample;.    nByt
ec30: 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 20 2a 20 73  e += nIdxCol * s
ec40: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 3b 20  izeof(tRowcnt); 
ec50: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
ec60: 20 49 6e 64 65 78 2e 61 41 76 67 45 71 5b 5d 20   Index.aAvgEq[] 
ec70: 2a 2f 0a 0a 20 20 20 20 70 49 64 78 2d 3e 61 53  */..    pIdx->aS
ec80: 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  ample = sqlite3D
ec90: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
eca0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
ecb0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3d 3d 30  pIdx->aSample==0
ecc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ecd0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
ece0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ecf0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
ed00: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 70  T;.    }.    pSp
ed10: 61 63 65 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29  ace = (tRowcnt*)
ed20: 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6e  &pIdx->aSample[n
ed30: 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 49 64  Sample];.    pId
ed40: 78 2d 3e 61 41 76 67 45 71 20 3d 20 70 53 70 61  x->aAvgEq = pSpa
ed50: 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49  ce; pSpace += nI
ed60: 64 78 43 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69  dxCol;.    for(i
ed70: 3d 30 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20 69  =0; i<nSample; i
ed80: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
ed90: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71  >aSample[i].anEq
eda0: 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63   = pSpace; pSpac
edb0: 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  e += nIdxCol;.  
edc0: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
edd0: 65 5b 69 5d 2e 61 6e 4c 74 20 3d 20 70 53 70 61  e[i].anLt = pSpa
ede0: 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49  ce; pSpace += nI
edf0: 64 78 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64  dxCol;.      pId
ee00: 78 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e  x->aSample[i].an
ee10: 44 4c 74 20 3d 20 70 53 70 61 63 65 3b 20 70 53  DLt = pSpace; pS
ee20: 70 61 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b  pace += nIdxCol;
ee30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
ee40: 74 28 20 28 28 75 38 2a 29 70 53 70 61 63 65 29  t( ((u8*)pSpace)
ee50: 2d 6e 42 79 74 65 3d 3d 28 75 38 2a 29 28 70 49  -nByte==(u8*)(pI
ee60: 64 78 2d 3e 61 53 61 6d 70 6c 65 29 20 29 3b 0a  dx->aSample) );.
ee70: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
ee80: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
ee90: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
eea0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 7a 53 71  eturn rc;..  zSq
eeb0: 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
eec0: 74 66 28 64 62 2c 20 7a 53 71 6c 32 2c 20 7a 44  tf(db, zSql2, zD
eed0: 62 29 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20  b);.  if( !zSql 
eee0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
eef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
ef00: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
ef10: 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20  te3_prepare(db, 
ef20: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
ef30: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , 0);.  sqlite3D
ef40: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
ef50: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
ef60: 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28  rn rc;..  while(
ef70: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
ef80: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
ef90: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49   ){.    char *zI
efa0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
efb0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
efc0: 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  ame */.    Index
efd0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
efe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
eff0: 74 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ter to the index
f000: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
f010: 6e 74 20 6e 43 6f 6c 20 3d 20 31 3b 20 20 20 20  nt nCol = 1;    
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f030: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
f040: 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  s in index */.. 
f050: 20 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61     zIndex = (cha
f060: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
f070: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
f080: 29 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65  );.    if( zInde
f090: 78 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  x==0 ) continue;
f0a0: 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69 6e 64  .    pIdx = find
f0b0: 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79 4b 65  IndexOrPrimaryKe
f0c0: 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44  y(db, zIndex, zD
f0d0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  b);.    if( pIdx
f0e0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
f0f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 6e 65 78 74      /* This next
f100: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
f110: 75 65 20 69 66 20 64 61 74 61 20 68 61 73 20 61  ue if data has a
f120: 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64  lready been load
f130: 65 64 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20  ed from .    ** 
f140: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34  the sqlite_stat4
f150: 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20   table. In this 
f160: 63 61 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74  case ignore stat
f170: 33 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20  3 data.  */.    
f180: 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53 61  nCol = pIdx->nSa
f190: 6d 70 6c 65 43 6f 6c 3b 0a 20 20 20 20 69 66 28  mpleCol;.    if(
f1a0: 20 62 53 74 61 74 33 20 26 26 20 6e 43 6f 6c 3e   bStat3 && nCol>
f1b0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  1 ) continue;.  
f1c0: 20 20 69 66 28 20 70 49 64 78 21 3d 70 50 72 65    if( pIdx!=pPre
f1d0: 76 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e  vIdx ){.      in
f1e0: 69 74 41 76 67 45 71 28 70 50 72 65 76 49 64 78  itAvgEq(pPrevIdx
f1f0: 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 49 64  );.      pPrevId
f200: 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a  x = pIdx;.    }.
f210: 20 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70      pSample = &p
f220: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 70 49 64  Idx->aSample[pId
f230: 78 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20  x->nSample];.   
f240: 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28   decodeIntArray(
f250: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
f260: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
f270: 2c 31 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65  ,1),nCol,pSample
f280: 2d 3e 61 6e 45 71 2c 30 2c 30 29 3b 0a 20 20 20  ->anEq,0,0);.   
f290: 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28   decodeIntArray(
f2a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
f2b0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
f2c0: 2c 32 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65  ,2),nCol,pSample
f2d0: 2d 3e 61 6e 4c 74 2c 30 2c 30 29 3b 0a 20 20 20  ->anLt,0,0);.   
f2e0: 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28   decodeIntArray(
f2f0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
f300: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
f310: 2c 33 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65  ,3),nCol,pSample
f320: 2d 3e 61 6e 44 4c 74 2c 30 2c 30 29 3b 0a 0a 20  ->anDLt,0,0);.. 
f330: 20 20 20 2f 2a 20 54 61 6b 65 20 61 20 63 6f 70     /* Take a cop
f340: 79 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 2e  y of the sample.
f350: 20 41 64 64 20 74 77 6f 20 30 78 30 30 20 62 79   Add two 0x00 by
f360: 74 65 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74  tes the end of t
f370: 68 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  he buffer..    *
f380: 2a 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  * This is in cas
f390: 65 20 74 68 65 20 73 61 6d 70 6c 65 20 72 65 63  e the sample rec
f3a0: 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 65 64  ord is corrupted
f3b0: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
f3c0: 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  the.    ** sqlit
f3d0: 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
f3e0: 61 72 65 28 29 20 6d 61 79 20 72 65 61 64 20 75  are() may read u
f3f0: 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73  p to two varints
f400: 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a   past the.    **
f410: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
f420: 63 61 74 65 64 20 62 75 66 66 65 72 20 62 65 66  cated buffer bef
f430: 6f 72 65 20 69 74 20 72 65 61 6c 69 7a 65 73 20  ore it realizes 
f440: 69 74 20 69 73 20 64 65 61 6c 69 6e 67 20 77 69  it is dealing wi
f450: 74 68 0a 20 20 20 20 2a 2a 20 61 20 63 6f 72 72  th.    ** a corr
f460: 75 70 74 20 72 65 63 6f 72 64 2e 20 41 64 64 69  upt record. Addi
f470: 6e 67 20 74 68 65 20 74 77 6f 20 30 78 30 30 20  ng the two 0x00 
f480: 62 79 74 65 73 20 70 72 65 76 65 6e 74 73 20 74  bytes prevents t
f490: 68 69 73 20 66 72 6f 6d 20 63 61 75 73 69 6e 67  his from causing
f4a0: 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
f4b0: 20 6f 76 65 72 72 65 61 64 2e 20 20 2a 2f 0a 20   overread.  */. 
f4c0: 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 3d 20     pSample->n = 
f4d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
f4e0: 79 74 65 73 28 70 53 74 6d 74 2c 20 34 29 3b 0a  ytes(pStmt, 4);.
f4f0: 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 70 20 3d      pSample->p =
f500: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
f510: 5a 65 72 6f 28 64 62 2c 20 70 53 61 6d 70 6c 65  Zero(db, pSample
f520: 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 20 20 69 66  ->n + 2);.    if
f530: 28 20 70 53 61 6d 70 6c 65 2d 3e 70 3d 3d 30 20  ( pSample->p==0 
f540: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f550: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
f560: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
f570: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
f580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f590: 70 53 61 6d 70 6c 65 2d 3e 6e 20 29 7b 0a 20 20  pSample->n ){.  
f5a0: 20 20 20 20 6d 65 6d 63 70 79 28 70 53 61 6d 70      memcpy(pSamp
f5b0: 6c 65 2d 3e 70 2c 20 73 71 6c 69 74 65 33 5f 63  le->p, sqlite3_c
f5c0: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
f5d0: 2c 20 34 29 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e  , 4), pSample->n
f5e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64  );.    }.    pId
f5f0: 78 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 20 20  x->nSample++;.  
f600: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f610: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
f620: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
f630: 54 45 5f 4f 4b 20 29 20 69 6e 69 74 41 76 67 45  TE_OK ) initAvgE
f640: 71 28 70 50 72 65 76 49 64 78 29 3b 0a 20 20 72  q(pPrevIdx);.  r
f650: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f660: 2a 2a 20 4c 6f 61 64 20 63 6f 6e 74 65 6e 74 20  ** Load content 
f670: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
f680: 73 74 61 74 34 20 61 6e 64 20 73 71 6c 69 74 65  stat4 and sqlite
f690: 5f 73 74 61 74 33 20 74 61 62 6c 65 73 20 69 6e  _stat3 tables in
f6a0: 74 6f 20 0a 2a 2a 20 74 68 65 20 49 6e 64 65 78  to .** the Index
f6b0: 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79  .aSample[] array
f6c0: 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73  s of all indices
f6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f6e0: 6c 6f 61 64 53 74 61 74 34 28 73 71 6c 69 74 65  loadStat4(sqlite
f6f0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
f700: 72 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72  r *zDb){.  int r
f710: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
f720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f730: 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d 20  sult codes from 
f740: 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 0a  subroutines */..
f750: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
f760: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
f770: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
f780: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
f790: 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 7a  sqlite_stat4", z
f7a0: 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Db) ){.    rc = 
f7b0: 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62 2c 20  loadStatTbl(db, 
f7c0: 30 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  0,.      "SELECT
f7d0: 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52   idx,count(*) FR
f7e0: 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
f7f0: 74 34 20 47 52 4f 55 50 20 42 59 20 69 64 78 22  t4 GROUP BY idx"
f800: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
f810: 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c   idx,neq,nlt,ndl
f820: 74 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51  t,sample FROM %Q
f830: 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a  .sqlite_stat4",.
f840: 20 20 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b        zDb.    );
f850: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
f860: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
f870: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
f880: 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22  , "sqlite_stat3"
f890: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 63  , zDb) ){.    rc
f8a0: 20 3d 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 64   = loadStatTbl(d
f8b0: 62 2c 20 31 2c 0a 20 20 20 20 20 20 22 53 45 4c  b, 1,.      "SEL
f8c0: 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29  ECT idx,count(*)
f8d0: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
f8e0: 73 74 61 74 33 20 47 52 4f 55 50 20 42 59 20 69  stat3 GROUP BY i
f8f0: 64 78 22 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  dx", .      "SEL
f900: 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c  ECT idx,neq,nlt,
f910: 6e 64 6c 74 2c 73 71 6c 69 74 65 5f 72 65 63 6f  ndlt,sqlite_reco
f920: 72 64 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20  rd(sample) FROM 
f930: 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 22  %Q.sqlite_stat3"
f940: 2c 0a 20 20 20 20 20 20 7a 44 62 0a 20 20 20 20  ,.      zDb.    
f950: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
f960: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
f970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
f980: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
f990: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
f9a0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
f9b0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64  sqlite_stat1 and
f9c0: 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20   sqlite_stat3/4 
f9d0: 74 61 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63  tables. The.** c
f9e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74  ontents of sqlit
f9f0: 65 5f 73 74 61 74 31 20 61 72 65 20 75 73 65 64  e_stat1 are used
fa00: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
fa10: 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
fa20: 5d 0a 2a 2a 20 61 72 72 61 79 73 2e 20 54 68 65  ].** arrays. The
fa30: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c   contents of sql
fa40: 69 74 65 5f 73 74 61 74 33 2f 34 20 61 72 65 20  ite_stat3/4 are 
fa50: 75 73 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65  used to populate
fa60: 20 74 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53   the.** Index.aS
fa70: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a  ample[] arrays..
fa80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
fa90: 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20  ite_stat1 table 
faa0: 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
fab0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
fac0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20  SQLITE_ERROR.** 
fad0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
fae0: 74 68 69 73 20 63 61 73 65 2c 20 65 76 65 6e 20  this case, even 
faf0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
fb00: 5f 53 54 41 54 33 2f 34 20 77 61 73 20 64 65 66  _STAT3/4 was def
fb10: 69 6e 65 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20  ined .** during 
fb20: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20  compilation and 
fb30: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33  the sqlite_stat3
fb40: 2f 34 20 74 61 62 6c 65 20 69 73 20 70 72 65 73  /4 table is pres
fb50: 65 6e 74 2c 20 6e 6f 20 64 61 74 61 20 69 73 20  ent, no data is 
fb60: 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 69 74  .** read from it
fb70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
fb80: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34  E_ENABLE_STAT3/4
fb90: 20 77 61 73 20 64 65 66 69 6e 65 64 20 64 75 72   was defined dur
fba0: 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ing compilation 
fbb0: 61 6e 64 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69  and the .** sqli
fbc0: 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65 20 69  te_stat4 table i
fbd0: 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
fbe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53   the database, S
fbf0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a  QLITE_ERROR is.*
fc00: 2a 20 72 65 74 75 72 6e 65 64 2e 20 48 6f 77 65  * returned. Howe
fc10: 76 65 72 2c 20 69 6e 20 74 68 69 73 20 63 61 73  ver, in this cas
fc20: 65 2c 20 64 61 74 61 20 69 73 20 72 65 61 64 20  e, data is read 
fc30: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
fc40: 73 74 61 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28  stat1.** table (
fc50: 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
fc60: 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
fc70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
fc80: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
fc90: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
fca0: 61 6c 77 61 79 73 20 73 65 74 73 20 64 62 2d 3e  always sets db->
fcb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a  mallocFailed..**
fcc0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
fcd0: 68 65 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e  he caller does n
fce0: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 6f 74  ot care about ot
fcf0: 68 65 72 20 65 72 72 6f 72 73 2c 20 74 68 65 20  her errors, the 
fd00: 72 65 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d  return.** code m
fd10: 61 79 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a  ay be ignored..*
fd20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 41 6e 61  /.int sqlite3Ana
fd30: 6c 79 73 69 73 4c 6f 61 64 28 73 71 6c 69 74 65  lysisLoad(sqlite
fd40: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
fd50: 0a 20 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20  .  analysisInfo 
fd60: 73 49 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65  sInfo;.  HashEle
fd70: 6d 20 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53  m *i;.  char *zS
fd80: 71 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ql;.  int rc = S
fd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
fda0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
fdb0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
fdc0: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
fdd0: 69 44 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 0a  iDb].pBt!=0 );..
fde0: 20 20 2f 2a 20 43 6c 65 61 72 20 61 6e 79 20 70    /* Clear any p
fdf0: 72 69 6f 72 20 73 74 61 74 69 73 74 69 63 73 20  rior statistics 
fe00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
fe10: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
fe20: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
fe30: 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  );.  for(i=sqlit
fe40: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
fe50: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
fe60: 2d 3e 69 64 78 48 61 73 68 29 3b 69 3b 69 3d 73  ->idxHash);i;i=s
fe70: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
fe80: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
fe90: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
fea0: 61 74 61 28 69 29 3b 0a 20 20 20 20 70 49 64 78  ata(i);.    pIdx
feb0: 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
fec0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
fed0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
fee0: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71  _OR_STAT4.    sq
fef0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
ff00: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 49 64 78  Samples(db, pIdx
ff10: 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61  );.    pIdx->aSa
ff20: 6d 70 6c 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  mple = 0;.#endif
ff30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  .  }..  /* Load 
ff40: 6e 65 77 20 73 74 61 74 69 73 74 69 63 73 20 6f  new statistics o
ff50: 75 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ut of the sqlite
ff60: 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a  _stat1 table */.
ff70: 20 20 73 49 6e 66 6f 2e 64 62 20 3d 20 64 62 3b    sInfo.db = db;
ff80: 0a 20 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61  .  sInfo.zDataba
ff90: 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  se = db->aDb[iDb
ffa0: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 69 66  ].zDbSName;.  if
ffb0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
ffc0: 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
ffd0: 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61  tat1", sInfo.zDa
ffe0: 74 61 62 61 73 65 29 21 3d 30 20 29 7b 0a 20 20  tabase)!=0 ){.  
fff0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
10000 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
10010 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 62 6c       "SELECT tbl
10020 2c 69 64 78 2c 73 74 61 74 20 46 52 4f 4d 20 25  ,idx,stat FROM %
10030 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  Q.sqlite_stat1",
10040 20 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65   sInfo.zDatabase
10050 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
10060 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
10070 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
10080 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
10090 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
100a0 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
100b0 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65 72 2c   analysisLoader,
100c0 20 26 73 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20   &sInfo, 0);.   
100d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
100e0 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  (db, zSql);.    
100f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
10100 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
10110 75 6c 74 73 20 6f 6e 20 61 6c 6c 20 69 6e 64 65  ults on all inde
10120 78 65 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73  xes not in the s
10130 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c  qlite_stat1 tabl
10140 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  e */.  assert( s
10150 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
10160 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
10170 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ) );.  for(i=sql
10180 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
10190 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
101a0 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 69 3b 69  ma->idxHash);i;i
101b0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
101c0 69 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  i)){.    Index *
101d0 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
101e0 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
101f0 28 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  ( pIdx->aiRowLog
10200 45 73 74 5b 30 5d 3d 3d 30 20 29 20 73 71 6c 69  Est[0]==0 ) sqli
10210 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
10220 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
10230 2a 20 4c 6f 61 64 20 74 68 65 20 73 74 61 74 69  * Load the stati
10240 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73  stics from the s
10250 71 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c  qlite_stat4 tabl
10260 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e. */.#ifdef SQL
10270 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
10280 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20  _OR_STAT4.  if( 
10290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
102a0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
102b0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
102c0 53 74 61 74 33 34 29 20 29 7b 0a 20 20 20 20 64  Stat34) ){.    d
102d0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
102e0 73 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 72 63 20  sable++;.    rc 
102f0 3d 20 6c 6f 61 64 53 74 61 74 34 28 64 62 2c 20  = loadStat4(db, 
10300 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29  sInfo.zDatabase)
10310 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
10320 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a  ide.bDisable--;.
10330 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
10340 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
10350 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
10360 61 2d 3e 69 64 78 48 61 73 68 29 3b 69 3b 69 3d  a->idxHash);i;i=
10370 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
10380 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
10390 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
103a0 44 61 74 61 28 69 29 3b 0a 20 20 20 20 73 71 6c  Data(i);.    sql
103b0 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 2d 3e  ite3_free(pIdx->
103c0 61 69 52 6f 77 45 73 74 29 3b 0a 20 20 20 20 70  aiRowEst);.    p
103d0 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  Idx->aiRowEst = 
103e0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
103f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10400 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
10410 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
10420 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10430 63 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a  c;.}...#endif /*
10440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
10450 4c 59 5a 45 20 2a 2f 0a                          LYZE */.