/ Hex Artifact Content
Login

Artifact 6b42e36a5dcc2703a771f2411bd5e99524bd62c7ecde209bb88dfb04c72f046e:


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 23 69 66 64 65 66         );.#ifdef
2970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
2980: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
2990: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62      }else if( db
29a0: 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
29b0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
29c0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
29d0: 73 65 28 70 50 61 72 73 65 2c 20 22 44 45 4c 45  se(pParse, "DELE
29e0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 22 2c 20  TE FROM %Q.%s", 
29f0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
2a00: 54 61 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Tab);.#endif.   
2a10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a20: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 5f    /* The sqlite_
2a30: 73 74 61 74 5b 31 33 34 5d 20 74 61 62 6c 65 20  stat[134] table 
2a40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
2a50: 20 44 65 6c 65 74 65 20 61 6c 6c 20 72 6f 77 73   Delete all rows
2a60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
2a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a80: 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 61 52 6f 6f  , OP_Clear, aRoo
2a90: 74 5b 69 5d 2c 20 69 44 62 29 3b 0a 20 20 20 20  t[i], iDb);.    
2aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ab0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c   /* Open the sql
2ac0: 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61  ite_stat[134] ta
2ad0: 62 6c 65 73 20 66 6f 72 20 77 72 69 74 69 6e 67  bles for writing
2ae0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
2af0: 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73 3b  aTable[i].zCols;
2b00: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2b10: 74 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  t( i<ArraySize(a
2b20: 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 73 71  Table) );.    sq
2b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2b40: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
2b50: 74 65 2c 20 69 53 74 61 74 43 75 72 2b 69 2c 20  te, iStatCur+i, 
2b60: 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 2c 20 33  aRoot[i], iDb, 3
2b70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2b80: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 43  beChangeP5(v, aC
2b90: 72 65 61 74 65 54 62 6c 5b 69 5d 29 3b 0a 20 20  reateTbl[i]);.  
2ba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bb0: 2c 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 4e 61 6d  , aTable[i].zNam
2bc0: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e));.  }.}../*.*
2bd0: 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64 20 6e 75  * Recommended nu
2be0: 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20  mber of samples 
2bf0: 66 6f 72 20 73 71 6c 69 74 65 5f 73 74 61 74 34  for sqlite_stat4
2c00: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2c10: 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53  TE_STAT4_SAMPLES
2c20: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
2c30: 5f 53 54 41 54 34 5f 53 41 4d 50 4c 45 53 20 32  _STAT4_SAMPLES 2
2c40: 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  4.#endif../*.** 
2c50: 54 68 72 65 65 20 53 51 4c 20 66 75 6e 63 74 69  Three SQL functi
2c60: 6f 6e 73 20 2d 20 73 74 61 74 5f 69 6e 69 74 28  ons - stat_init(
2c70: 29 2c 20 73 74 61 74 5f 70 75 73 68 28 29 2c 20  ), stat_push(), 
2c80: 61 6e 64 20 73 74 61 74 5f 67 65 74 28 29 20 2d  and stat_get() -
2c90: 0a 2a 2a 20 73 68 61 72 65 20 61 6e 20 69 6e 73  .** share an ins
2ca0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2cb0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2cc0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 69 72 20 73   to hold their s
2cd0: 74 61 74 65 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  tate.** informat
2ce0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
2cf0: 73 74 72 75 63 74 20 53 74 61 74 34 41 63 63 75  struct Stat4Accu
2d00: 6d 20 53 74 61 74 34 41 63 63 75 6d 3b 0a 74 79  m Stat4Accum;.ty
2d10: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 61  pedef struct Sta
2d20: 74 34 53 61 6d 70 6c 65 20 53 74 61 74 34 53 61  t4Sample Stat4Sa
2d30: 6d 70 6c 65 3b 0a 73 74 72 75 63 74 20 53 74 61  mple;.struct Sta
2d40: 74 34 53 61 6d 70 6c 65 20 7b 0a 20 20 74 52 6f  t4Sample {.  tRo
2d50: 77 63 6e 74 20 2a 61 6e 45 71 3b 20 20 20 20 20  wcnt *anEq;     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d70: 73 71 6c 69 74 65 5f 73 74 61 74 34 2e 6e 45 71  sqlite_stat4.nEq
2d80: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
2d90: 6e 44 4c 74 3b 20 20 20 20 20 20 20 20 20 20 20  nDLt;           
2da0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f        /* sqlite_
2db0: 73 74 61 74 34 2e 6e 44 4c 74 20 2a 2f 0a 23 69  stat4.nDLt */.#i
2dc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2dd0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
2de0: 34 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e 4c  4.  tRowcnt *anL
2df0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e00: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74      /* sqlite_st
2e10: 61 74 34 2e 6e 4c 74 20 2a 2f 0a 20 20 75 6e 69  at4.nLt */.  uni
2e20: 6f 6e 20 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  on {.    i64 iRo
2e30: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2e50: 64 20 69 6e 20 6d 61 69 6e 20 74 61 62 6c 65 20  d in main table 
2e60: 6f 66 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  of the key */.  
2e70: 20 20 75 38 20 2a 61 52 6f 77 69 64 3b 20 20 20    u8 *aRowid;   
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20 57 49 54    /* Key for WIT
2ea0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
2eb0: 73 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20 20 75 33  s */.  } u;.  u3
2ec0: 32 20 6e 52 6f 77 69 64 3b 20 20 20 20 20 20 20  2 nRowid;       
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee0: 20 53 69 7a 65 6f 66 20 61 52 6f 77 69 64 5b 5d   Sizeof aRowid[]
2ef0: 20 2a 2f 0a 20 20 75 38 20 69 73 50 53 61 6d 70   */.  u8 isPSamp
2f00: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2f10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f20: 20 61 20 70 65 72 69 6f 64 69 63 20 73 61 6d 70   a periodic samp
2f30: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  le */.  int iCol
2f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 21 69          /* If !i
2f60: 73 50 53 61 6d 70 6c 65 2c 20 74 68 65 20 72 65  sPSample, the re
2f70: 61 73 6f 6e 20 66 6f 72 20 69 6e 63 6c 75 73 69  ason for inclusi
2f80: 6f 6e 20 2a 2f 0a 20 20 75 33 32 20 69 48 61 73  on */.  u32 iHas
2f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 69 65 62 72          /* Tiebr
2fb0: 65 61 6b 65 72 20 68 61 73 68 20 2a 2f 0a 23 65  eaker hash */.#e
2fc0: 6e 64 69 66 0a 7d 3b 20 20 20 20 20 20 20 20 20  ndif.};         
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 0a 73 74 72 75             .stru
3000: 63 74 20 53 74 61 74 34 41 63 63 75 6d 20 7b 0a  ct Stat4Accum {.
3010: 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b 20    tRowcnt nRow; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3030: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
3040: 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
3050: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
3060: 50 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  PSample;        
3070: 20 2f 2a 20 48 6f 77 20 6f 66 74 65 6e 20 74 6f   /* How often to
3080: 20 64 6f 20 61 20 70 65 72 69 6f 64 69 63 20 73   do a periodic s
3090: 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ample */.  int n
30a0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
30b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64  f columns in ind
30d0: 65 78 20 2b 20 70 6b 2f 72 6f 77 69 64 20 2a 2f  ex + pk/rowid */
30e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
3110: 63 6f 6c 75 6d 6e 73 20 77 2f 6f 20 74 68 65 20  columns w/o the 
3120: 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  pk/rowid */.  in
3130: 74 20 6d 78 53 61 6d 70 6c 65 3b 20 20 20 20 20  t mxSample;     
3140: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3150: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  um number of sam
3160: 70 6c 65 73 20 74 6f 20 61 63 63 75 6d 75 6c 61  ples to accumula
3170: 74 65 20 2a 2f 0a 20 20 53 74 61 74 34 53 61 6d  te */.  Stat4Sam
3180: 70 6c 65 20 63 75 72 72 65 6e 74 3b 20 20 20 20  ple current;    
3190: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
31a0: 20 61 73 20 61 20 53 74 61 74 34 53 61 6d 70 6c   as a Stat4Sampl
31b0: 65 20 2a 2f 0a 20 20 75 33 32 20 69 50 72 6e 3b  e */.  u32 iPrn;
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 2f 2a 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f   /* Pseudo-rando
31e0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
31f0: 72 20 73 61 6d 70 6c 69 6e 67 20 2a 2f 0a 20 20  r sampling */.  
3200: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 42 65  Stat4Sample *aBe
3210: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  st;       /* Arr
3220: 61 79 20 6f 66 20 6e 43 6f 6c 20 62 65 73 74 20  ay of nCol best 
3230: 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  samples */.  int
3240: 20 69 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20   iMin;          
3250: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3260: 69 6e 20 61 5b 5d 20 6f 66 20 65 6e 74 72 79 20  in a[] of entry 
3270: 77 69 74 68 20 6d 69 6e 69 6d 75 6d 20 73 63 6f  with minimum sco
3280: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 6d  re */.  int nSam
3290: 70 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ple;            
32a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
32b0: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 2a  ber of samples *
32c0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 45 71 5a 65  /.  int nMaxEqZe
32d0: 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ro;           /*
32e0: 20 4d 61 78 20 6c 65 61 64 69 6e 67 20 30 20 69   Max leading 0 i
32f0: 6e 20 61 6e 45 71 5b 5d 20 66 6f 72 20 61 6e 79  n anEq[] for any
3300: 20 61 5b 5d 20 65 6e 74 72 79 20 2a 2f 0a 20 20   a[] entry */.  
3310: 69 6e 74 20 69 47 65 74 3b 20 20 20 20 20 20 20  int iGet;       
3320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
3330: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 73 61  ex of current sa
3340: 6d 70 6c 65 20 61 63 63 65 73 73 65 64 20 62 79  mple accessed by
3350: 20 73 74 61 74 5f 67 65 74 28 29 20 2a 2f 0a 20   stat_get() */. 
3360: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 61 3b   Stat4Sample *a;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
3380: 72 61 79 20 6f 66 20 6d 78 53 61 6d 70 6c 65 20  ray of mxSample 
3390: 53 74 61 74 34 53 61 6d 70 6c 65 20 6f 62 6a 65  Stat4Sample obje
33a0: 63 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  cts */.  sqlite3
33b0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
33c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
33d0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 66 6f 72 20 6d  onnection, for m
33e0: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  alloc() */.};../
33f0: 2a 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  * Reclaim memory
3400: 20 75 73 65 64 20 62 79 20 61 20 53 74 61 74 34   used by a Stat4
3410: 53 61 6d 70 6c 65 0a 2a 2f 0a 23 69 66 64 65 66  Sample.*/.#ifdef
3420: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3430: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3440: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3450: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
3460: 62 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  b, Stat4Sample *
3470: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62  p){.  assert( db
3480: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
3490: 6e 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71  nRowid ){.    sq
34a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
34b0: 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20  p->u.aRowid);.  
34c0: 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b    p->nRowid = 0;
34d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
34e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
34f0: 20 42 4c 4f 42 20 76 61 6c 75 65 20 6f 66 20 61   BLOB value of a
3500: 20 52 4f 57 49 44 0a 2a 2f 0a 23 69 66 64 65 66   ROWID.*/.#ifdef
3510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3520: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
3530: 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70 6c 65  atic void sample
3540: 53 65 74 52 6f 77 69 64 28 73 71 6c 69 74 65 33  SetRowid(sqlite3
3550: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
3560: 65 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e  e *p, int n, con
3570: 73 74 20 75 38 20 2a 70 44 61 74 61 29 7b 0a 20  st u8 *pData){. 
3580: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
3590: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69  ;.  if( p->nRowi
35a0: 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  d ) sqlite3DbFre
35b0: 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f 77 69  e(db, p->u.aRowi
35c0: 64 29 3b 0a 20 20 70 2d 3e 75 2e 61 52 6f 77 69  d);.  p->u.aRowi
35d0: 64 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  d = sqlite3DbMal
35e0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 29 3b  locRawNN(db, n);
35f0: 0a 20 20 69 66 28 20 70 2d 3e 75 2e 61 52 6f 77  .  if( p->u.aRow
3600: 69 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f  id ){.    p->nRo
3610: 77 69 64 20 3d 20 6e 3b 0a 20 20 20 20 6d 65 6d  wid = n;.    mem
3620: 63 70 79 28 70 2d 3e 75 2e 61 52 6f 77 69 64 2c  cpy(p->u.aRowid,
3630: 20 70 44 61 74 61 2c 20 6e 29 3b 0a 20 20 7d 65   pData, n);.  }e
3640: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 52 6f 77  lse{.    p->nRow
3650: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  id = 0;.  }.}.#e
3660: 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  ndif../* Initial
3670: 69 7a 65 20 74 68 65 20 49 4e 54 45 47 45 52 20  ize the INTEGER 
3680: 76 61 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44  value of a ROWID
3690: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
36a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
36b0: 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69 63 20  OR_STAT4.static 
36c0: 76 6f 69 64 20 73 61 6d 70 6c 65 53 65 74 52 6f  void sampleSetRo
36d0: 77 69 64 49 6e 74 36 34 28 73 71 6c 69 74 65 33  widInt64(sqlite3
36e0: 20 2a 64 62 2c 20 53 74 61 74 34 53 61 6d 70 6c   *db, Stat4Sampl
36f0: 65 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  e *p, i64 iRowid
3700: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ){.  assert( db!
3710: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
3720: 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33 44  Rowid ) sqlite3D
3730: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61  bFree(db, p->u.a
3740: 52 6f 77 69 64 29 3b 0a 20 20 70 2d 3e 6e 52 6f  Rowid);.  p->nRo
3750: 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 75 2e  wid = 0;.  p->u.
3760: 69 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  iRowid = iRowid;
3770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
3780: 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  * Copy the conte
3790: 6e 74 73 20 6f 66 20 6f 62 6a 65 63 74 20 28 2a  nts of object (*
37a0: 70 46 72 6f 6d 29 20 69 6e 74 6f 20 28 2a 70 54  pFrom) into (*pT
37b0: 6f 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  o)..*/.#ifdef SQ
37c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
37d0: 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74 61 74 69  3_OR_STAT4.stati
37e0: 63 20 76 6f 69 64 20 73 61 6d 70 6c 65 43 6f 70  c void sampleCop
37f0: 79 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70 2c  y(Stat4Accum *p,
3800: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 54   Stat4Sample *pT
3810: 6f 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  o, Stat4Sample *
3820: 70 46 72 6f 6d 29 7b 0a 20 20 70 54 6f 2d 3e 69  pFrom){.  pTo->i
3830: 73 50 53 61 6d 70 6c 65 20 3d 20 70 46 72 6f 6d  sPSample = pFrom
3840: 2d 3e 69 73 50 53 61 6d 70 6c 65 3b 0a 20 20 70  ->isPSample;.  p
3850: 54 6f 2d 3e 69 43 6f 6c 20 3d 20 70 46 72 6f 6d  To->iCol = pFrom
3860: 2d 3e 69 43 6f 6c 3b 0a 20 20 70 54 6f 2d 3e 69  ->iCol;.  pTo->i
3870: 48 61 73 68 20 3d 20 70 46 72 6f 6d 2d 3e 69 48  Hash = pFrom->iH
3880: 61 73 68 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ash;.  memcpy(pT
3890: 6f 2d 3e 61 6e 45 71 2c 20 70 46 72 6f 6d 2d 3e  o->anEq, pFrom->
38a0: 61 6e 45 71 2c 20 73 69 7a 65 6f 66 28 74 52 6f  anEq, sizeof(tRo
38b0: 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a  wcnt)*p->nCol);.
38c0: 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e    memcpy(pTo->an
38d0: 4c 74 2c 20 70 46 72 6f 6d 2d 3e 61 6e 4c 74 2c  Lt, pFrom->anLt,
38e0: 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
38f0: 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d  *p->nCol);.  mem
3900: 63 70 79 28 70 54 6f 2d 3e 61 6e 44 4c 74 2c 20  cpy(pTo->anDLt, 
3910: 70 46 72 6f 6d 2d 3e 61 6e 44 4c 74 2c 20 73 69  pFrom->anDLt, si
3920: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
3930: 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 46  >nCol);.  if( pF
3940: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 20 29 7b 0a 20  rom->nRowid ){. 
3950: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
3960: 64 28 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46  d(p->db, pTo, pF
3970: 72 6f 6d 2d 3e 6e 52 6f 77 69 64 2c 20 70 46 72  rom->nRowid, pFr
3980: 6f 6d 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20  om->u.aRowid);. 
3990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70   }else{.    samp
39a0: 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34 28  leSetRowidInt64(
39b0: 70 2d 3e 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  p->db, pTo, pFro
39c0: 6d 2d 3e 75 2e 69 52 6f 77 69 64 29 3b 0a 20 20  m->u.iRowid);.  
39d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
39e0: 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
39f0: 6d 6f 72 79 20 6f 66 20 61 20 53 74 61 74 34 41  mory of a Stat4A
3a00: 63 63 75 6d 20 73 74 72 75 63 74 75 72 65 2e 0a  ccum structure..
3a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3a20: 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 28 76  tat4Destructor(v
3a30: 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 53 74  oid *pOld){.  St
3a40: 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20 28 53  at4Accum *p = (S
3a50: 74 61 74 34 41 63 63 75 6d 2a 29 70 4f 6c 64 3b  tat4Accum*)pOld;
3a60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3a70: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
3a80: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 20 20  TAT4.  int i;.  
3a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
3aa0: 6f 6c 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43  ol; i++) sampleC
3ab0: 6c 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lear(p->db, p->a
3ac0: 42 65 73 74 2b 69 29 3b 0a 20 20 66 6f 72 28 69  Best+i);.  for(i
3ad0: 3d 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c  =0; i<p->mxSampl
3ae0: 65 3b 20 69 2b 2b 29 20 73 61 6d 70 6c 65 43 6c  e; i++) sampleCl
3af0: 65 61 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 2b  ear(p->db, p->a+
3b00: 69 29 3b 0a 20 20 73 61 6d 70 6c 65 43 6c 65 61  i);.  sampleClea
3b10: 72 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  r(p->db, &p->cur
3b20: 72 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rent);.#endif.  
3b30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
3b40: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >db, p);.}../*.*
3b50: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3b60: 20 6f 66 20 74 68 65 20 73 74 61 74 5f 69 6e 69   of the stat_ini
3b70: 74 28 4e 2c 4b 2c 43 29 20 53 51 4c 20 66 75 6e  t(N,K,C) SQL fun
3b80: 63 74 69 6f 6e 2e 20 54 68 65 20 74 68 72 65 65  ction. The three
3b90: 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 61   parameters.** a
3ba0: 72 65 3a 0a 2a 2a 20 20 20 20 20 4e 3a 20 20 20  re:.**     N:   
3bb0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3bc0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3bd0: 64 65 78 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  dex including th
3be0: 65 20 72 6f 77 69 64 2f 70 6b 20 28 6e 6f 74 65  e rowid/pk (note
3bf0: 20 31 29 0a 2a 2a 20 20 20 20 20 4b 3a 20 20 20   1).**     K:   
3c00: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
3c10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
3c20: 64 65 78 20 65 78 63 6c 75 64 69 6e 67 20 74 68  dex excluding th
3c30: 65 20 72 6f 77 69 64 2f 70 6b 2e 0a 2a 2a 20 20  e rowid/pk..**  
3c40: 20 20 20 43 3a 20 20 20 20 54 68 65 20 6e 75 6d     C:    The num
3c50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
3c60: 68 65 20 69 6e 64 65 78 20 28 6e 6f 74 65 20 32  he index (note 2
3c70: 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 31 3a 20  ).**.** Note 1: 
3c80: 20 49 6e 20 74 68 65 20 73 70 65 63 69 61 6c 20   In the special 
3c90: 63 61 73 65 20 6f 66 20 74 68 65 20 63 6f 76 65  case of the cove
3ca0: 72 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ring index that 
3cb0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a 20  implements a.** 
3cc0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
3cd0: 62 6c 65 2c 20 4e 20 69 73 20 74 68 65 20 6e 75  ble, N is the nu
3ce0: 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
3cf0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 74  KEY columns, not
3d00: 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
3d10: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
3d20: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
3d30: 0a 2a 2a 20 4e 6f 74 65 20 32 3a 20 20 43 20 69  .** Note 2:  C i
3d40: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
3d50: 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 2e  STAT3 and STAT4.
3d60: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
3d70: 65 73 20 6f 6e 20 6f 72 64 69 6e 61 72 79 20 72  es on ordinary r
3d80: 6f 77 69 64 20 74 61 62 6c 65 73 2c 20 4e 3d 3d  owid tables, N==
3d90: 4b 2b 31 2e 20 20 42 75 74 20 66 6f 72 20 69 6e  K+1.  But for in
3da0: 64 65 78 65 73 20 6f 6e 0a 2a 2a 20 57 49 54 48  dexes on.** WITH
3db0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
3dc0: 2c 20 4e 3d 4b 2b 50 20 77 68 65 72 65 20 50 20  , N=K+P where P 
3dd0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3de0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
3df0: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
3e00: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
3e10: 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  e covering index
3e20: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
3e30: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
3e40: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
3e50: 61 62 6c 65 20 61 73 20 4e 3d 3d 4b 20 61 73 20  able as N==K as 
3e60: 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 0a  a special case..
3e70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3e80: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  ne allocates the
3e90: 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65   Stat4Accum obje
3ea0: 63 74 20 69 6e 20 68 65 61 70 20 6d 65 6d 6f 72  ct in heap memor
3eb0: 79 2e 20 54 68 65 20 72 65 74 75 72 6e 20 0a 2a  y. The return .*
3ec0: 2a 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  * value is a poi
3ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
3ee0: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2e 20 20  4Accum object.  
3ef0: 54 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  The datatype of 
3f00: 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  the.** return va
3f10: 6c 75 65 20 69 73 20 42 4c 4f 42 2c 20 62 75 74  lue is BLOB, but
3f20: 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   it is really ju
3f30: 73 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  st a pointer to 
3f40: 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 0a 2a  the Stat4Accum.*
3f50: 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  * object..*/.sta
3f60: 74 69 63 20 76 6f 69 64 20 73 74 61 74 49 6e 69  tic void statIni
3f70: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  t(.  sqlite3_con
3f80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
3f90: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
3fa0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
3fb0: 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75  v.){.  Stat4Accu
3fc0: 6d 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  m *p;.  int nCol
3fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3ff0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
4000: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 61 6d 70  index being samp
4010: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  led */.  int nKe
4020: 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
4030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4040: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
4050: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 55  s */.  int nColU
4060: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4070: 20 20 20 20 20 20 20 2f 2a 20 6e 43 6f 6c 20 72         /* nCol r
4080: 6f 75 6e 64 65 64 20 75 70 20 66 6f 72 20 61 6c  ounded up for al
4090: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  ignment */.  int
40a0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
40d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
40e0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
4110: 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  ection */.#ifdef
4120: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
4130: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
4140: 69 6e 74 20 6d 78 53 61 6d 70 6c 65 20 3d 20 53  int mxSample = S
4150: 51 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50  QLITE_STAT4_SAMP
4160: 4c 45 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  LES;.#endif..  /
4170: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 74 68 72  * Decode the thr
4180: 65 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  ee function argu
4190: 6d 65 6e 74 73 20 2a 2f 0a 20 20 55 4e 55 53 45  ments */.  UNUSE
41a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
41b0: 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  );.  nCol = sqli
41c0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
41d0: 67 76 5b 30 5d 29 3b 0a 20 20 61 73 73 65 72 74  gv[0]);.  assert
41e0: 28 20 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 43  ( nCol>0 );.  nC
41f0: 6f 6c 55 70 20 3d 20 73 69 7a 65 6f 66 28 74 52  olUp = sizeof(tR
4200: 6f 77 63 6e 74 29 3c 38 20 3f 20 28 6e 43 6f 6c  owcnt)<8 ? (nCol
4210: 2b 31 29 26 7e 31 20 3a 20 6e 43 6f 6c 3b 0a 20  +1)&~1 : nCol;. 
4220: 20 6e 4b 65 79 43 6f 6c 20 3d 20 73 71 6c 69 74   nKeyCol = sqlit
4230: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
4240: 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  v[1]);.  assert(
4250: 20 6e 4b 65 79 43 6f 6c 3c 3d 6e 43 6f 6c 20 29   nKeyCol<=nCol )
4260: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
4270: 43 6f 6c 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  Col>0 );..  /* A
4280: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
4290: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
42a0: 68 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f 62  he Stat4Accum ob
42b0: 6a 65 63 74 20 2a 2f 0a 20 20 6e 20 3d 20 73 69  ject */.  n = si
42c0: 7a 65 6f 66 28 2a 70 29 20 0a 20 20 20 20 2b 20  zeof(*p) .    + 
42d0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
42e0: 6e 43 6f 6c 55 70 20 20 20 20 20 20 20 20 20 20  nColUp          
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 34          /* Stat4
4300: 41 63 63 75 6d 2e 61 6e 45 71 20 2a 2f 0a 20 20  Accum.anEq */.  
4310: 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77 63    + sizeof(tRowc
4320: 6e 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20 20  nt)*nColUp      
4330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4340: 74 61 74 34 41 63 63 75 6d 2e 61 6e 44 4c 74 20  tat4Accum.anDLt 
4350: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4360: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4370: 5f 53 54 41 54 34 0a 20 20 20 20 2b 20 73 69 7a  _STAT4.    + siz
4380: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f  eof(tRowcnt)*nCo
4390: 6c 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20  lUp             
43a0: 20 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63       /* Stat4Acc
43b0: 75 6d 2e 61 6e 4c 74 20 2a 2f 0a 20 20 20 20 2b  um.anLt */.    +
43c0: 20 73 69 7a 65 6f 66 28 53 74 61 74 34 53 61 6d   sizeof(Stat4Sam
43d0: 70 6c 65 29 2a 28 6e 43 6f 6c 2b 6d 78 53 61 6d  ple)*(nCol+mxSam
43e0: 70 6c 65 29 20 20 20 20 20 2f 2a 20 53 74 61 74  ple)     /* Stat
43f0: 34 41 63 63 75 6d 2e 61 42 65 73 74 5b 5d 2c 20  4Accum.aBest[], 
4400: 61 5b 5d 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a  a[] */.    + siz
4410: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 33 2a 6e  eof(tRowcnt)*3*n
4420: 43 6f 6c 55 70 2a 28 6e 43 6f 6c 2b 6d 78 53 61  ColUp*(nCol+mxSa
4430: 6d 70 6c 65 29 0a 23 65 6e 64 69 66 0a 20 20 3b  mple).#endif.  ;
4440: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
4450: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
4460: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 70 20  e(context);.  p 
4470: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4480: 63 5a 65 72 6f 28 64 62 2c 20 6e 29 3b 0a 20 20  cZero(db, n);.  
4490: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
44a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
44b0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
44c0: 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  xt);.    return;
44d0: 0a 20 20 7d 0a 0a 20 20 70 2d 3e 64 62 20 3d 20  .  }..  p->db = 
44e0: 64 62 3b 0a 20 20 70 2d 3e 6e 52 6f 77 20 3d 20  db;.  p->nRow = 
44f0: 30 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 6e  0;.  p->nCol = n
4500: 43 6f 6c 3b 0a 20 20 70 2d 3e 6e 4b 65 79 43 6f  Col;.  p->nKeyCo
4510: 6c 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  l = nKeyCol;.  p
4520: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74 20  ->current.anDLt 
4530: 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 70 5b 31  = (tRowcnt*)&p[1
4540: 5d 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e  ];.  p->current.
4550: 61 6e 45 71 20 3d 20 26 70 2d 3e 63 75 72 72 65  anEq = &p->curre
4560: 6e 74 2e 61 6e 44 4c 74 5b 6e 43 6f 6c 55 70 5d  nt.anDLt[nColUp]
4570: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
4580: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
4590: 5f 53 54 41 54 34 0a 20 20 7b 0a 20 20 20 20 75  _STAT4.  {.    u
45a0: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45c0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  * Allocated spac
45d0: 65 20 6e 6f 74 20 79 65 74 20 61 73 73 69 67 6e  e not yet assign
45e0: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ed */.    int i;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
4610: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
4620: 6f 75 67 68 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ough p->aSample[
4630: 5d 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 69 47 65  ] */..    p->iGe
4640: 74 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 6d  t = -1;.    p->m
4650: 78 53 61 6d 70 6c 65 20 3d 20 6d 78 53 61 6d 70  xSample = mxSamp
4660: 6c 65 3b 0a 20 20 20 20 70 2d 3e 6e 50 53 61 6d  le;.    p->nPSam
4670: 70 6c 65 20 3d 20 28 74 52 6f 77 63 6e 74 29 28  ple = (tRowcnt)(
4680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
4690: 74 36 34 28 61 72 67 76 5b 32 5d 29 2f 28 6d 78  t64(argv[2])/(mx
46a0: 53 61 6d 70 6c 65 2f 33 2b 31 29 20 2b 20 31 29  Sample/3+1) + 1)
46b0: 3b 0a 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74  ;.    p->current
46c0: 2e 61 6e 4c 74 20 3d 20 26 70 2d 3e 63 75 72 72  .anLt = &p->curr
46d0: 65 6e 74 2e 61 6e 45 71 5b 6e 43 6f 6c 55 70 5d  ent.anEq[nColUp]
46e0: 3b 0a 20 20 20 20 70 2d 3e 69 50 72 6e 20 3d 20  ;.    p->iPrn = 
46f0: 30 78 36 38 39 65 39 36 32 64 2a 28 75 33 32 29  0x689e962d*(u32)
4700: 6e 43 6f 6c 20 5e 20 30 78 64 30 39 34 34 35 36  nCol ^ 0xd094456
4710: 35 2a 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76  5*(u32)sqlite3_v
4720: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
4730: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74  );.  .    /* Set
4740: 20 75 70 20 74 68 65 20 53 74 61 74 34 41 63 63   up the Stat4Acc
4750: 75 6d 2e 61 5b 5d 20 61 6e 64 20 61 42 65 73 74  um.a[] and aBest
4760: 5b 5d 20 61 72 72 61 79 73 20 2a 2f 0a 20 20 20  [] arrays */.   
4770: 20 70 2d 3e 61 20 3d 20 28 73 74 72 75 63 74 20   p->a = (struct 
4780: 53 74 61 74 34 53 61 6d 70 6c 65 2a 29 26 70 2d  Stat4Sample*)&p-
4790: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 6e 43  >current.anLt[nC
47a0: 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d 3e 61 42  olUp];.    p->aB
47b0: 65 73 74 20 3d 20 26 70 2d 3e 61 5b 6d 78 53 61  est = &p->a[mxSa
47c0: 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 53 70 61 63  mple];.    pSpac
47d0: 65 20 3d 20 28 75 38 2a 29 28 26 70 2d 3e 61 5b  e = (u8*)(&p->a[
47e0: 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 5d 29 3b  mxSample+nCol]);
47f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4800: 28 6d 78 53 61 6d 70 6c 65 2b 6e 43 6f 6c 29 3b  (mxSample+nCol);
4810: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4820: 61 5b 69 5d 2e 61 6e 45 71 20 3d 20 28 74 52 6f  a[i].anEq = (tRo
4830: 77 63 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70  wcnt *)pSpace; p
4840: 53 70 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66  Space += (sizeof
4850: 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c  (tRowcnt) * nCol
4860: 55 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  Up);.      p->a[
4870: 69 5d 2e 61 6e 4c 74 20 3d 20 28 74 52 6f 77 63  i].anLt = (tRowc
4880: 6e 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70  nt *)pSpace; pSp
4890: 61 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74  ace += (sizeof(t
48a0: 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70  Rowcnt) * nColUp
48b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  );.      p->a[i]
48c0: 2e 61 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63 6e  .anDLt = (tRowcn
48d0: 74 20 2a 29 70 53 70 61 63 65 3b 20 70 53 70 61  t *)pSpace; pSpa
48e0: 63 65 20 2b 3d 20 28 73 69 7a 65 6f 66 28 74 52  ce += (sizeof(tR
48f0: 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 55 70 29  owcnt) * nColUp)
4900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
4910: 72 74 28 20 28 70 53 70 61 63 65 20 2d 20 28 75  rt( (pSpace - (u
4920: 38 2a 29 70 29 3d 3d 6e 20 29 3b 0a 20 20 0a 20  8*)p)==n );.  . 
4930: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
4940: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4950: 70 2d 3e 61 42 65 73 74 5b 69 5d 2e 69 43 6f 6c  p->aBest[i].iCol
4960: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
4970: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 74  #endif..  /* Ret
4980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
4990: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f   the allocated o
49a0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 63 61 6c  bject to the cal
49b0: 6c 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  ler.  Note that.
49c0: 20 20 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 70 6f    ** only the po
49d0: 69 6e 74 65 72 20 28 74 68 65 20 32 6e 64 20 70  inter (the 2nd p
49e0: 61 72 61 6d 65 74 65 72 29 20 6d 61 74 74 65 72  arameter) matter
49f0: 73 2e 20 20 54 68 65 20 73 69 7a 65 20 6f 66 20  s.  The size of 
4a00: 74 68 65 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20  the object.  ** 
4a10: 28 67 69 76 65 6e 20 62 79 20 74 68 65 20 33 72  (given by the 3r
4a20: 64 20 70 61 72 61 6d 65 74 65 72 29 20 69 73 20  d parameter) is 
4a30: 6e 65 76 65 72 20 75 73 65 64 20 61 6e 64 20 63  never used and c
4a40: 61 6e 20 62 65 20 61 6e 79 20 70 6f 73 69 74 69  an be any positi
4a50: 76 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 2a  ve.  ** value. *
4a60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  /.  sqlite3_resu
4a70: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
4a80: 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 2c 20   p, sizeof(*p), 
4a90: 73 74 61 74 34 44 65 73 74 72 75 63 74 6f 72 29  stat4Destructor)
4aa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.}.static const
4ab0: 20 46 75 6e 63 44 65 66 20 73 74 61 74 49 6e 69   FuncDef statIni
4ac0: 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32  tFuncdef = {.  2
4ad0: 2b 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20  +IsStat34,      
4ae0: 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c  /* nArg */.  SQL
4af0: 49 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a  ITE_UTF8,     /*
4b00: 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20   funcFlags */.  
4b10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4b20: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
4b30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
4b40: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
4b50: 20 20 73 74 61 74 49 6e 69 74 2c 20 20 20 20 20    statInit,     
4b60: 20 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a     /* xSFunc */.
4b70: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4b80: 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20     /* xFinalize 
4b90: 2a 2f 0a 20 20 22 73 74 61 74 5f 69 6e 69 74 22  */.  "stat_init"
4ba0: 2c 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a  ,     /* zName *
4bb0: 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a 0a 23 69 66 64  /.  {0}.};..#ifd
4bc0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4bd0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 70 4e 65  _STAT4./*.** pNe
4be0: 77 20 61 6e 64 20 70 4f 6c 64 20 61 72 65 20 62  w and pOld are b
4bf0: 6f 74 68 20 63 61 6e 64 69 64 61 74 65 20 6e 6f  oth candidate no
4c00: 6e 2d 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c  n-periodic sampl
4c10: 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 20  es selected for 
4c20: 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  .** the same col
4c30: 75 6d 6e 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d  umn (pNew->iCol=
4c40: 3d 70 4f 6c 64 2d 3e 69 43 6f 6c 29 2e 20 49 67  =pOld->iCol). Ig
4c50: 6e 6f 72 69 6e 67 20 74 68 69 73 20 63 6f 6c 75  noring this colu
4c60: 6d 6e 20 61 6e 64 20 0a 2a 2a 20 63 6f 6e 73 69  mn and .** consi
4c70: 64 65 72 69 6e 67 20 6f 6e 6c 79 20 61 6e 79 20  dering only any 
4c80: 74 72 61 69 6c 69 6e 67 20 63 6f 6c 75 6d 6e 73  trailing columns
4c90: 20 61 6e 64 20 74 68 65 20 73 61 6d 70 6c 65 20   and the sample 
4ca0: 68 61 73 68 20 76 61 6c 75 65 2c 20 74 68 69 73  hash value, this
4cb0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
4cc0: 75 72 6e 73 20 74 72 75 65 20 69 66 20 73 61 6d  urns true if sam
4cd0: 70 6c 65 20 70 4e 65 77 20 69 73 20 74 6f 20 62  ple pNew is to b
4ce0: 65 20 70 72 65 66 65 72 72 65 64 20 6f 76 65 72  e preferred over
4cf0: 20 70 4f 6c 64 2e 0a 2a 2a 20 49 6e 20 6f 74 68   pOld..** In oth
4d00: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 77 65 20  er words, if we 
4d10: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
4d20: 63 61 72 64 69 6e 61 6c 69 74 69 65 73 20 6f 66  cardinalities of
4d30: 20 74 68 65 20 73 65 6c 65 63 74 65 64 0a 2a 2a   the selected.**
4d40: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 70 4e 65 77   column for pNew
4d50: 20 61 6e 64 20 70 4f 6c 64 20 61 72 65 20 65 71   and pOld are eq
4d60: 75 61 6c 2c 20 69 73 20 70 4e 65 77 20 74 6f 20  ual, is pNew to 
4d70: 62 65 20 70 72 65 66 65 72 72 65 64 20 6f 76 65  be preferred ove
4d80: 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pOld..**.** Th
4d90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
4da0: 6d 65 73 20 74 68 61 74 20 66 6f 72 20 65 61 63  mes that for eac
4db0: 68 20 61 72 67 75 6d 65 6e 74 20 73 61 6d 70 6c  h argument sampl
4dc0: 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  e, the contents 
4dd0: 6f 66 0a 2a 2a 20 74 68 65 20 61 6e 45 71 5b 5d  of.** the anEq[]
4de0: 20 61 72 72 61 79 20 66 72 6f 6d 20 70 53 61 6d   array from pSam
4df0: 70 6c 65 2d 3e 61 6e 45 71 5b 70 53 61 6d 70 6c  ple->anEq[pSampl
4e00: 65 2d 3e 69 43 6f 6c 2b 31 5d 20 6f 6e 77 61 72  e->iCol+1] onwar
4e10: 64 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a  ds are valid. .*
4e20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6d  /.static int sam
4e30: 70 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74 28  pleIsBetterPost(
4e40: 0a 20 20 53 74 61 74 34 41 63 63 75 6d 20 2a 70  .  Stat4Accum *p
4e50: 41 63 63 75 6d 2c 20 0a 20 20 53 74 61 74 34 53  Accum, .  Stat4S
4e60: 61 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 0a 20 20  ample *pNew, .  
4e70: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f 6c  Stat4Sample *pOl
4e80: 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  d.){.  int nCol 
4e90: 3d 20 70 41 63 63 75 6d 2d 3e 6e 43 6f 6c 3b 0a  = pAccum->nCol;.
4ea0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
4eb0: 74 28 20 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70  t( pNew->iCol==p
4ec0: 4f 6c 64 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20 66  Old->iCol );.  f
4ed0: 6f 72 28 69 3d 70 4e 65 77 2d 3e 69 43 6f 6c 2b  or(i=pNew->iCol+
4ee0: 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  1; i<nCol; i++){
4ef0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  .    if( pNew->a
4f00: 6e 45 71 5b 69 5d 3e 70 4f 6c 64 2d 3e 61 6e 45  nEq[i]>pOld->anE
4f10: 71 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  q[i] ) return 1;
4f20: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  .    if( pNew->a
4f30: 6e 45 71 5b 69 5d 3c 70 4f 6c 64 2d 3e 61 6e 45  nEq[i]<pOld->anE
4f40: 71 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  q[i] ) return 0;
4f50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d  .  }.  if( pNew-
4f60: 3e 69 48 61 73 68 3e 70 4f 6c 64 2d 3e 69 48 61  >iHash>pOld->iHa
4f70: 73 68 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  sh ) return 1;. 
4f80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
4f90: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4fa0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
4fb0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 52  OR_STAT4./*.** R
4fc0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 4e  eturn true if pN
4fd0: 65 77 20 69 73 20 74 6f 20 62 65 20 70 72 65 66  ew is to be pref
4fe0: 65 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e  erred over pOld.
4ff0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
5000: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
5010: 74 20 66 6f 72 20 65 61 63 68 20 61 72 67 75 6d  t for each argum
5020: 65 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65 20  ent sample, the 
5030: 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74  contents of.** t
5040: 68 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20  he anEq[] array 
5050: 66 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e  from pSample->an
5060: 45 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c  Eq[pSample->iCol
5070: 5d 20 6f 6e 77 61 72 64 73 20 61 72 65 20 76 61  ] onwards are va
5080: 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  lid. .*/.static 
5090: 69 6e 74 20 73 61 6d 70 6c 65 49 73 42 65 74 74  int sampleIsBett
50a0: 65 72 28 0a 20 20 53 74 61 74 34 41 63 63 75 6d  er(.  Stat4Accum
50b0: 20 2a 70 41 63 63 75 6d 2c 20 0a 20 20 53 74 61   *pAccum, .  Sta
50c0: 74 34 53 61 6d 70 6c 65 20 2a 70 4e 65 77 2c 20  t4Sample *pNew, 
50d0: 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a  .  Stat4Sample *
50e0: 70 4f 6c 64 0a 29 7b 0a 20 20 74 52 6f 77 63 6e  pOld.){.  tRowcn
50f0: 74 20 6e 45 71 4e 65 77 20 3d 20 70 4e 65 77 2d  t nEqNew = pNew-
5100: 3e 61 6e 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c  >anEq[pNew->iCol
5110: 5d 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 71  ];.  tRowcnt nEq
5120: 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 61 6e 45 71  Old = pOld->anEq
5130: 5b 70 4f 6c 64 2d 3e 69 43 6f 6c 5d 3b 0a 0a 20  [pOld->iCol];.. 
5140: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 69   assert( pOld->i
5150: 73 50 53 61 6d 70 6c 65 3d 3d 30 20 26 26 20 70  sPSample==0 && p
5160: 4e 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d  New->isPSample==
5170: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 49  0 );.  assert( I
5180: 73 53 74 61 74 34 20 7c 7c 20 28 70 4e 65 77 2d  sStat4 || (pNew-
5190: 3e 69 43 6f 6c 3d 3d 30 20 26 26 20 70 4f 6c 64  >iCol==0 && pOld
51a0: 2d 3e 69 43 6f 6c 3d 3d 30 29 20 29 3b 0a 0a 20  ->iCol==0) );.. 
51b0: 20 69 66 28 20 28 6e 45 71 4e 65 77 3e 6e 45 71   if( (nEqNew>nEq
51c0: 4f 6c 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Old) ) return 1;
51d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
51e0: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 66  NABLE_STAT4.  if
51f0: 28 20 6e 45 71 4e 65 77 3d 3d 6e 45 71 4f 6c 64  ( nEqNew==nEqOld
5200: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   ){.    if( pNew
5210: 2d 3e 69 43 6f 6c 3c 70 4f 6c 64 2d 3e 69 43 6f  ->iCol<pOld->iCo
5220: 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
5230: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 2d 3e    return (pNew->
5240: 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f 6c  iCol==pOld->iCol
5250: 20 26 26 20 73 61 6d 70 6c 65 49 73 42 65 74 74   && sampleIsBett
5260: 65 72 50 6f 73 74 28 70 41 63 63 75 6d 2c 20 70  erPost(pAccum, p
5270: 4e 65 77 2c 20 70 4f 6c 64 29 29 3b 0a 20 20 7d  New, pOld));.  }
5280: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c  .  return 0;.#el
5290: 73 65 0a 20 20 72 65 74 75 72 6e 20 28 6e 45 71  se.  return (nEq
52a0: 4e 65 77 3d 3d 6e 45 71 4f 6c 64 20 26 26 20 70  New==nEqOld && p
52b0: 4e 65 77 2d 3e 69 48 61 73 68 3e 70 4f 6c 64 2d  New->iHash>pOld-
52c0: 3e 69 48 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a  >iHash);.#endif.
52d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
52e0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 73 61  e contents of sa
52f0: 6d 70 6c 65 20 2a 70 4e 65 77 20 69 6e 74 6f 20  mple *pNew into 
5300: 74 68 65 20 70 2d 3e 61 5b 5d 20 61 72 72 61 79  the p->a[] array
5310: 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a  . If necessary,.
5320: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 6c 65  ** remove the le
5330: 61 73 74 20 64 65 73 69 72 61 62 6c 65 20 73 61  ast desirable sa
5340: 6d 70 6c 65 20 66 72 6f 6d 20 70 2d 3e 61 5b 5d  mple from p->a[]
5350: 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 2e 0a 2a   to make room..*
5360: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 61  /.static void sa
5370: 6d 70 6c 65 49 6e 73 65 72 74 28 53 74 61 74 34  mpleInsert(Stat4
5380: 41 63 63 75 6d 20 2a 70 2c 20 53 74 61 74 34 53  Accum *p, Stat4S
5390: 61 6d 70 6c 65 20 2a 70 4e 65 77 2c 20 69 6e 74  ample *pNew, int
53a0: 20 6e 45 71 5a 65 72 6f 29 7b 0a 20 20 53 74 61   nEqZero){.  Sta
53b0: 74 34 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c  t4Sample *pSampl
53c0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  e = 0;.  int i;.
53d0: 0a 20 20 61 73 73 65 72 74 28 20 49 73 53 74 61  .  assert( IsSta
53e0: 74 34 20 7c 7c 20 6e 45 71 5a 65 72 6f 3d 3d 30  t4 || nEqZero==0
53f0: 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
5400: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a  TE_ENABLE_STAT4.
5410: 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e    /* Stat4Accum.
5420: 6e 4d 61 78 45 71 5a 65 72 6f 20 69 73 20 73 65  nMaxEqZero is se
5430: 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  t to the maximum
5440: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 64 69   number of leadi
5450: 6e 67 20 30 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ng 0.  ** values
5460: 20 69 6e 20 74 68 65 20 61 6e 45 71 5b 5d 20 61   in the anEq[] a
5470: 72 72 61 79 20 6f 66 20 61 6e 79 20 73 61 6d 70  rray of any samp
5480: 6c 65 20 69 6e 20 53 74 61 74 34 41 63 63 75 6d  le in Stat4Accum
5490: 2e 61 5b 5d 2e 20 49 6e 0a 20 20 2a 2a 20 6f 74  .a[]. In.  ** ot
54a0: 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 6e 4d  her words, if nM
54b0: 61 78 45 71 5a 65 72 6f 20 69 73 20 6e 2c 20 74  axEqZero is n, t
54c0: 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
54d0: 74 65 65 64 20 74 68 61 74 20 74 68 65 72 65 0a  teed that there.
54e0: 20 20 2a 2a 20 61 72 65 20 6e 6f 20 73 61 6d 70    ** are no samp
54f0: 6c 65 73 20 77 69 74 68 20 53 74 61 74 34 53 61  les with Stat4Sa
5500: 6d 70 6c 65 2e 61 6e 45 71 5b 6d 5d 3d 3d 30 20  mple.anEq[m]==0 
5510: 66 6f 72 20 28 6d 3e 3d 6e 29 2e 20 2a 2f 0a 20  for (m>=n). */. 
5520: 20 69 66 28 20 6e 45 71 5a 65 72 6f 3e 70 2d 3e   if( nEqZero>p->
5530: 6e 4d 61 78 45 71 5a 65 72 6f 20 29 7b 0a 20 20  nMaxEqZero ){.  
5540: 20 20 70 2d 3e 6e 4d 61 78 45 71 5a 65 72 6f 20    p->nMaxEqZero 
5550: 3d 20 6e 45 71 5a 65 72 6f 3b 0a 20 20 7d 0a 20  = nEqZero;.  }. 
5560: 20 69 66 28 20 70 4e 65 77 2d 3e 69 73 50 53 61   if( pNew->isPSa
5570: 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 53  mple==0 ){.    S
5580: 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 55 70 67  tat4Sample *pUpg
5590: 72 61 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  rade = 0;.    as
55a0: 73 65 72 74 28 20 70 4e 65 77 2d 3e 61 6e 45 71  sert( pNew->anEq
55b0: 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3e 30 20 29  [pNew->iCol]>0 )
55c0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 73  ;..    /* This s
55d0: 61 6d 70 6c 65 20 69 73 20 62 65 69 6e 67 20 61  ample is being a
55e0: 64 64 65 64 20 62 65 63 61 75 73 65 20 74 68 65  dded because the
55f0: 20 70 72 65 66 69 78 20 74 68 61 74 20 65 6e 64   prefix that end
5600: 73 20 69 6e 20 63 6f 6c 75 6d 6e 20 0a 20 20 20  s in column .   
5610: 20 2a 2a 20 69 43 6f 6c 20 6f 63 63 75 72 73 20   ** iCol occurs 
5620: 6d 61 6e 79 20 74 69 6d 65 73 20 69 6e 20 74 68  many times in th
5630: 65 20 74 61 62 6c 65 2e 20 48 6f 77 65 76 65 72  e table. However
5640: 2c 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72  , if we have alr
5650: 65 61 64 79 0a 20 20 20 20 2a 2a 20 61 64 64 65  eady.    ** adde
5660: 64 20 61 20 73 61 6d 70 6c 65 20 74 68 61 74 20  d a sample that 
5670: 73 68 61 72 65 73 20 74 68 69 73 20 70 72 65 66  shares this pref
5680: 69 78 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ix, there is no 
5690: 6e 65 65 64 20 74 6f 20 61 64 64 0a 20 20 20 20  need to add.    
56a0: 2a 2a 20 74 68 69 73 20 6f 6e 65 2e 20 49 6e 73  ** this one. Ins
56b0: 74 65 61 64 2c 20 75 70 67 72 61 64 65 20 74 68  tead, upgrade th
56c0: 65 20 70 72 69 6f 72 69 74 79 20 6f 66 20 74 68  e priority of th
56d0: 65 20 68 69 67 68 65 73 74 20 70 72 69 6f 72 69  e highest priori
56e0: 74 79 0a 20 20 20 20 2a 2a 20 65 78 69 73 74 69  ty.    ** existi
56f0: 6e 67 20 73 61 6d 70 6c 65 20 74 68 61 74 20 73  ng sample that s
5700: 68 61 72 65 73 20 74 68 69 73 20 70 72 65 66 69  hares this prefi
5710: 78 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  x.  */.    for(i
5720: 3d 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69  =p->nSample-1; i
5730: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
5740: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 4f   Stat4Sample *pO
5750: 6c 64 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  ld = &p->a[i];. 
5760: 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
5770: 6e 45 71 5b 70 4e 65 77 2d 3e 69 43 6f 6c 5d 3d  nEq[pNew->iCol]=
5780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
5790: 28 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c  ( pOld->isPSampl
57a0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
57b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
57c0: 2d 3e 69 43 6f 6c 3e 70 4e 65 77 2d 3e 69 43 6f  ->iCol>pNew->iCo
57d0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
57e0: 65 72 74 28 20 73 61 6d 70 6c 65 49 73 42 65 74  ert( sampleIsBet
57f0: 74 65 72 28 70 2c 20 70 4e 65 77 2c 20 70 4f 6c  ter(p, pNew, pOl
5800: 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d) );.        if
5810: 28 20 70 55 70 67 72 61 64 65 3d 3d 30 20 7c 7c  ( pUpgrade==0 ||
5820: 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28   sampleIsBetter(
5830: 70 2c 20 70 4f 6c 64 2c 20 70 55 70 67 72 61 64  p, pOld, pUpgrad
5840: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
5850: 70 55 70 67 72 61 64 65 20 3d 20 70 4f 6c 64 3b  pUpgrade = pOld;
5860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5870: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5880: 20 70 55 70 67 72 61 64 65 20 29 7b 0a 20 20 20   pUpgrade ){.   
5890: 20 20 20 70 55 70 67 72 61 64 65 2d 3e 69 43 6f     pUpgrade->iCo
58a0: 6c 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 3b 0a  l = pNew->iCol;.
58b0: 20 20 20 20 20 20 70 55 70 67 72 61 64 65 2d 3e        pUpgrade->
58c0: 61 6e 45 71 5b 70 55 70 67 72 61 64 65 2d 3e 69  anEq[pUpgrade->i
58d0: 43 6f 6c 5d 20 3d 20 70 4e 65 77 2d 3e 61 6e 45  Col] = pNew->anE
58e0: 71 5b 70 55 70 67 72 61 64 65 2d 3e 69 43 6f 6c  q[pUpgrade->iCol
58f0: 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69  ];.      goto fi
5900: 6e 64 5f 6e 65 77 5f 6d 69 6e 3b 0a 20 20 20 20  nd_new_min;.    
5910: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
5920: 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  /* If necessary,
5930: 20 72 65 6d 6f 76 65 20 73 61 6d 70 6c 65 20 69   remove sample i
5940: 4d 69 6e 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  Min to make room
5950: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 61 6d   for the new sam
5960: 70 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ple. */.  if( p-
5970: 3e 6e 53 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78 53  >nSample>=p->mxS
5980: 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 53 74 61  ample ){.    Sta
5990: 74 34 53 61 6d 70 6c 65 20 2a 70 4d 69 6e 20 3d  t4Sample *pMin =
59a0: 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 3b   &p->a[p->iMin];
59b0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e  .    tRowcnt *an
59c0: 45 71 20 3d 20 70 4d 69 6e 2d 3e 61 6e 45 71 3b  Eq = pMin->anEq;
59d0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e  .    tRowcnt *an
59e0: 4c 74 20 3d 20 70 4d 69 6e 2d 3e 61 6e 4c 74 3b  Lt = pMin->anLt;
59f0: 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 6e  .    tRowcnt *an
5a00: 44 4c 74 20 3d 20 70 4d 69 6e 2d 3e 61 6e 44 4c  DLt = pMin->anDL
5a10: 74 3b 0a 20 20 20 20 73 61 6d 70 6c 65 43 6c 65  t;.    sampleCle
5a20: 61 72 28 70 2d 3e 64 62 2c 20 70 4d 69 6e 29 3b  ar(p->db, pMin);
5a30: 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4d 69  .    memmove(pMi
5a40: 6e 2c 20 26 70 4d 69 6e 5b 31 5d 2c 20 73 69 7a  n, &pMin[1], siz
5a50: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 2a 28 70 2d  eof(p->a[0])*(p-
5a60: 3e 6e 53 61 6d 70 6c 65 2d 70 2d 3e 69 4d 69 6e  >nSample-p->iMin
5a70: 2d 31 29 29 3b 0a 20 20 20 20 70 53 61 6d 70 6c  -1));.    pSampl
5a80: 65 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61  e = &p->a[p->nSa
5a90: 6d 70 6c 65 2d 31 5d 3b 0a 20 20 20 20 70 53 61  mple-1];.    pSa
5aa0: 6d 70 6c 65 2d 3e 6e 52 6f 77 69 64 20 3d 20 30  mple->nRowid = 0
5ab0: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61  ;.    pSample->a
5ac0: 6e 45 71 20 3d 20 61 6e 45 71 3b 0a 20 20 20 20  nEq = anEq;.    
5ad0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74 20 3d  pSample->anDLt =
5ae0: 20 61 6e 44 4c 74 3b 0a 20 20 20 20 70 53 61 6d   anDLt;.    pSam
5af0: 70 6c 65 2d 3e 61 6e 4c 74 20 3d 20 61 6e 4c 74  ple->anLt = anLt
5b00: 3b 0a 20 20 20 20 70 2d 3e 6e 53 61 6d 70 6c 65  ;.    p->nSample
5b10: 20 3d 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 2d 31   = p->mxSample-1
5b20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5b30: 22 72 6f 77 73 20 6c 65 73 73 2d 74 68 61 6e 22  "rows less-than"
5b40: 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20 63   for the rowid c
5b50: 6f 6c 75 6d 6e 20 6d 75 73 74 20 62 65 20 67 72  olumn must be gr
5b60: 65 61 74 65 72 20 74 68 61 6e 20 74 68 61 74 0a  eater than that.
5b70: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 61 73    ** for the las
5b80: 74 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  t sample in the 
5b90: 70 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 20 4f 74  p->a[] array. Ot
5ba0: 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 61 6d  herwise, the sam
5bb0: 70 6c 65 73 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  ples would.  ** 
5bc0: 62 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2e  be out of order.
5bd0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
5be0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20  E_ENABLE_STAT4. 
5bf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d   assert( p->nSam
5c00: 70 6c 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  ple==0 .       |
5c10: 7c 20 70 4e 65 77 2d 3e 61 6e 4c 74 5b 70 2d 3e  | pNew->anLt[p->
5c20: 6e 43 6f 6c 2d 31 5d 20 3e 20 70 2d 3e 61 5b 70  nCol-1] > p->a[p
5c30: 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d 2e 61 6e 4c  ->nSample-1].anL
5c40: 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 20 29 3b 0a  t[p->nCol-1] );.
5c50: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 73  #endif..  /* Ins
5c60: 65 72 74 20 74 68 65 20 6e 65 77 20 73 61 6d 70  ert the new samp
5c70: 6c 65 20 2a 2f 0a 20 20 70 53 61 6d 70 6c 65 20  le */.  pSample 
5c80: 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70  = &p->a[p->nSamp
5c90: 6c 65 5d 3b 0a 20 20 73 61 6d 70 6c 65 43 6f 70  le];.  sampleCop
5ca0: 79 28 70 2c 20 70 53 61 6d 70 6c 65 2c 20 70 4e  y(p, pSample, pN
5cb0: 65 77 29 3b 0a 20 20 70 2d 3e 6e 53 61 6d 70 6c  ew);.  p->nSampl
5cc0: 65 2b 2b 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  e++;..  /* Zero 
5cd0: 74 68 65 20 66 69 72 73 74 20 6e 45 71 5a 65 72  the first nEqZer
5ce0: 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  o entries in the
5cf0: 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 2e 20 2a   anEq[] array. *
5d00: 2f 0a 20 20 6d 65 6d 73 65 74 28 70 53 61 6d 70  /.  memset(pSamp
5d10: 6c 65 2d 3e 61 6e 45 71 2c 20 30 2c 20 73 69 7a  le->anEq, 0, siz
5d20: 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 45 71  eof(tRowcnt)*nEq
5d30: 5a 65 72 6f 29 3b 0a 0a 23 69 66 64 65 66 20 53  Zero);..#ifdef S
5d40: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
5d50: 54 34 0a 20 66 69 6e 64 5f 6e 65 77 5f 6d 69 6e  T4. find_new_min
5d60: 3a 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  :.#endif.  if( p
5d70: 2d 3e 6e 53 61 6d 70 6c 65 3e 3d 70 2d 3e 6d 78  ->nSample>=p->mx
5d80: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 69 6e  Sample ){.    in
5d90: 74 20 69 4d 69 6e 20 3d 20 2d 31 3b 0a 20 20 20  t iMin = -1;.   
5da0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6d   for(i=0; i<p->m
5db0: 78 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  xSample; i++){. 
5dc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d       if( p->a[i]
5dd0: 2e 69 73 50 53 61 6d 70 6c 65 20 29 20 63 6f 6e  .isPSample ) con
5de0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5df0: 20 69 4d 69 6e 3c 30 20 7c 7c 20 73 61 6d 70 6c   iMin<0 || sampl
5e00: 65 49 73 42 65 74 74 65 72 28 70 2c 20 26 70 2d  eIsBetter(p, &p-
5e10: 3e 61 5b 69 4d 69 6e 5d 2c 20 26 70 2d 3e 61 5b  >a[iMin], &p->a[
5e20: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
5e30: 4d 69 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d  Min = i;.      }
5e40: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
5e50: 74 28 20 69 4d 69 6e 3e 3d 30 20 29 3b 0a 20 20  t( iMin>=0 );.  
5e60: 20 20 70 2d 3e 69 4d 69 6e 20 3d 20 69 4d 69 6e    p->iMin = iMin
5e70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
5e80: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
5e90: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
5ea0: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 65 6c 64 20 69  /../*.** Field i
5eb0: 43 68 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65  Chng of the inde
5ec0: 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  x being scanned 
5ed0: 68 61 73 20 63 68 61 6e 67 65 64 2e 20 53 6f 20  has changed. So 
5ee0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 2a 2a  at this point.**
5ef0: 20 70 2d 3e 63 75 72 72 65 6e 74 20 63 6f 6e 74   p->current cont
5f00: 61 69 6e 73 20 61 20 73 61 6d 70 6c 65 20 74 68  ains a sample th
5f10: 61 74 20 72 65 66 6c 65 63 74 73 20 74 68 65 20  at reflects the 
5f20: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 6f 66 20  previous row of 
5f30: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 2e 20 54 68  the.** index. Th
5f40: 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 45 71 5b  e value of anEq[
5f50: 69 43 68 6e 67 5d 20 61 6e 64 20 73 75 62 73 65  iChng] and subse
5f60: 71 75 65 6e 74 20 61 6e 45 71 5b 5d 20 65 6c 65  quent anEq[] ele
5f70: 6d 65 6e 74 73 20 61 72 65 0a 2a 2a 20 63 6f 72  ments are.** cor
5f80: 72 65 63 74 20 61 74 20 74 68 69 73 20 70 6f 69  rect at this poi
5f90: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
5fa0: 69 64 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65  id samplePushPre
5fb0: 76 69 6f 75 73 28 53 74 61 74 34 41 63 63 75 6d  vious(Stat4Accum
5fc0: 20 2a 70 2c 20 69 6e 74 20 69 43 68 6e 67 29 7b   *p, int iChng){
5fd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5fe0: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 69 6e  NABLE_STAT4.  in
5ff0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  t i;..  /* Check
6000: 20 69 66 20 61 6e 79 20 73 61 6d 70 6c 65 73 20   if any samples 
6010: 66 72 6f 6d 20 74 68 65 20 61 42 65 73 74 5b 5d  from the aBest[]
6020: 20 61 72 72 61 79 20 73 68 6f 75 6c 64 20 62 65   array should be
6030: 20 70 75 73 68 65 64 0a 20 20 2a 2a 20 69 6e 74   pushed.  ** int
6040: 6f 20 49 6e 64 65 78 53 61 6d 70 6c 65 2e 61 5b  o IndexSample.a[
6050: 5d 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  ] at this point.
6060: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 28 70 2d    */.  for(i=(p-
6070: 3e 6e 43 6f 6c 2d 32 29 3b 20 69 3e 3d 69 43 68  >nCol-2); i>=iCh
6080: 6e 67 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 53 74  ng; i--){.    St
6090: 61 74 34 53 61 6d 70 6c 65 20 2a 70 42 65 73 74  at4Sample *pBest
60a0: 20 3d 20 26 70 2d 3e 61 42 65 73 74 5b 69 5d 3b   = &p->aBest[i];
60b0: 0a 20 20 20 20 70 42 65 73 74 2d 3e 61 6e 45 71  .    pBest->anEq
60c0: 5b 69 5d 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74  [i] = p->current
60d0: 2e 61 6e 45 71 5b 69 5d 3b 0a 20 20 20 20 69 66  .anEq[i];.    if
60e0: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e  ( p->nSample<p->
60f0: 6d 78 53 61 6d 70 6c 65 20 7c 7c 20 73 61 6d 70  mxSample || samp
6100: 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20 70 42  leIsBetter(p, pB
6110: 65 73 74 2c 20 26 70 2d 3e 61 5b 70 2d 3e 69 4d  est, &p->a[p->iM
6120: 69 6e 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 61  in]) ){.      sa
6130: 6d 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 70 42  mpleInsert(p, pB
6140: 65 73 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  est, i);.    }. 
6150: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
6160: 68 61 74 20 6e 6f 20 73 61 6d 70 6c 65 20 63 6f  hat no sample co
6170: 6e 74 61 69 6e 73 20 61 6e 20 61 6e 45 71 5b 5d  ntains an anEq[]
6180: 20 65 6e 74 72 79 20 77 69 74 68 20 61 6e 20 69   entry with an i
6190: 6e 64 65 78 20 6f 66 0a 20 20 2a 2a 20 70 2d 3e  ndex of.  ** p->
61a0: 6e 4d 61 78 45 71 5a 65 72 6f 20 6f 72 20 67 72  nMaxEqZero or gr
61b0: 65 61 74 65 72 20 73 65 74 20 74 6f 20 7a 65 72  eater set to zer
61c0: 6f 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d  o. */.  for(i=p-
61d0: 3e 6e 53 61 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30  >nSample-1; i>=0
61e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
61f0: 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 2d 3e  j;.    for(j=p->
6200: 6e 4d 61 78 45 71 5a 65 72 6f 3b 20 6a 3c 70 2d  nMaxEqZero; j<p-
6210: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 20 61 73 73 65  >nCol; j++) asse
6220: 72 74 28 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71  rt( p->a[i].anEq
6230: 5b 6a 5d 3e 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  [j]>0 );.  }..  
6240: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 6e  /* Update the an
6250: 45 71 5b 5d 20 66 69 65 6c 64 73 20 6f 66 20 61  Eq[] fields of a
6260: 6e 79 20 73 61 6d 70 6c 65 73 20 61 6c 72 65 61  ny samples alrea
6270: 64 79 20 63 6f 6c 6c 65 63 74 65 64 2e 20 2a 2f  dy collected. */
6280: 0a 20 20 69 66 28 20 69 43 68 6e 67 3c 70 2d 3e  .  if( iChng<p->
6290: 6e 4d 61 78 45 71 5a 65 72 6f 20 29 7b 0a 20 20  nMaxEqZero ){.  
62a0: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70    for(i=p->nSamp
62b0: 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  le-1; i>=0; i--)
62c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
62d0: 20 20 20 20 20 66 6f 72 28 6a 3d 69 43 68 6e 67       for(j=iChng
62e0: 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
62f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
6300: 2d 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 3d 3d  ->a[i].anEq[j]==
6310: 30 20 29 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45 71  0 ) p->a[i].anEq
6320: 5b 6a 5d 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74  [j] = p->current
6330: 2e 61 6e 45 71 5b 6a 5d 3b 0a 20 20 20 20 20 20  .anEq[j];.      
6340: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  }.    }.    p->n
6350: 4d 61 78 45 71 5a 65 72 6f 20 3d 20 69 43 68 6e  MaxEqZero = iChn
6360: 67 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  g;.  }.#endif..#
6370: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6380: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 29 20  E_ENABLE_STAT3) 
6390: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
63a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 29  TE_ENABLE_STAT4)
63b0: 0a 20 20 69 66 28 20 69 43 68 6e 67 3d 3d 30 20  .  if( iChng==0 
63c0: 29 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  ){.    tRowcnt n
63d0: 4c 74 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  Lt = p->current.
63e0: 61 6e 4c 74 5b 30 5d 3b 0a 20 20 20 20 74 52 6f  anLt[0];.    tRo
63f0: 77 63 6e 74 20 6e 45 71 20 3d 20 70 2d 3e 63 75  wcnt nEq = p->cu
6400: 72 72 65 6e 74 2e 61 6e 45 71 5b 30 5d 3b 0a 0a  rrent.anEq[0];..
6410: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
6420: 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 61 20  this is to be a 
6430: 70 65 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e  periodic sample.
6440: 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74 2e 20   If so, add it. 
6450: 2a 2f 0a 20 20 20 20 69 66 28 20 28 6e 4c 74 2f  */.    if( (nLt/
6460: 70 2d 3e 6e 50 53 61 6d 70 6c 65 29 21 3d 28 6e  p->nPSample)!=(n
6470: 4c 74 2b 6e 45 71 29 2f 70 2d 3e 6e 50 53 61 6d  Lt+nEq)/p->nPSam
6480: 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ple ){.      p->
6490: 63 75 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c  current.isPSampl
64a0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 61 6d  e = 1;.      sam
64b0: 70 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d  pleInsert(p, &p-
64c0: 3e 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20  >current, 0);.  
64d0: 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69      p->current.i
64e0: 73 50 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20  sPSample = 0;.  
64f0: 20 20 7d 65 6c 73 65 20 0a 0a 20 20 20 20 2f 2a    }else ..    /*
6500: 20 4f 72 20 69 66 20 69 74 20 69 73 20 61 20 6e   Or if it is a n
6510: 6f 6e 2d 70 65 72 69 6f 64 69 63 20 73 61 6d 70  on-periodic samp
6520: 6c 65 2e 20 41 64 64 20 69 74 20 69 6e 20 74 68  le. Add it in th
6530: 69 73 20 63 61 73 65 20 74 6f 6f 2e 20 2a 2f 0a  is case too. */.
6540: 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70      if( p->nSamp
6550: 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 0a  le<p->mxSample .
6560: 20 20 20 20 20 7c 7c 20 73 61 6d 70 6c 65 49 73       || sampleIs
6570: 42 65 74 74 65 72 28 70 2c 20 26 70 2d 3e 63 75  Better(p, &p->cu
6580: 72 72 65 6e 74 2c 20 26 70 2d 3e 61 5b 70 2d 3e  rrent, &p->a[p->
6590: 69 4d 69 6e 5d 29 20 0a 20 20 20 20 29 7b 0a 20  iMin]) .    ){. 
65a0: 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72       sampleInser
65b0: 74 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74  t(p, &p->current
65c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
65d0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
65e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
65f0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 55  AT3_OR_STAT4.  U
6600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6610: 20 70 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50   p );.  UNUSED_P
6620: 41 52 41 4d 45 54 45 52 28 20 69 43 68 6e 67 20  ARAMETER( iChng 
6630: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
6640: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
6650: 6e 20 6f 66 20 74 68 65 20 73 74 61 74 5f 70 75  n of the stat_pu
6660: 73 68 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  sh SQL function:
6670: 20 20 73 74 61 74 5f 70 75 73 68 28 50 2c 43 2c    stat_push(P,C,
6680: 52 29 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 3a  R).** Arguments:
6690: 0a 2a 2a 0a 2a 2a 20 20 20 20 50 20 20 20 20 20  .**.**    P     
66a0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53  Pointer to the S
66b0: 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74  tat4Accum object
66c0: 20 63 72 65 61 74 65 64 20 62 79 20 73 74 61 74   created by stat
66d0: 5f 69 6e 69 74 28 29 0a 2a 2a 20 20 20 20 43 20  _init().**    C 
66e0: 20 20 20 20 49 6e 64 65 78 20 6f 66 20 6c 65 66      Index of lef
66f0: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 74 6f  t-most column to
6700: 20 64 69 66 66 65 72 20 66 72 6f 6d 20 70 72 65   differ from pre
6710: 76 69 6f 75 73 20 72 6f 77 0a 2a 2a 20 20 20 20  vious row.**    
6720: 52 20 20 20 20 20 52 6f 77 69 64 20 66 6f 72 20  R     Rowid for 
6730: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
6740: 20 20 4d 69 67 68 74 20 62 65 20 61 20 6b 65 79    Might be a key
6750: 20 72 65 63 6f 72 64 20 66 6f 72 0a 2a 2a 20 20   record for.**  
6760: 20 20 20 20 20 20 20 20 57 49 54 48 4f 55 54 20          WITHOUT 
6770: 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a 2a  ROWID tables..**
6780: 0a 2a 2a 20 54 68 69 73 20 53 51 4c 20 66 75 6e  .** This SQL fun
6790: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
67a0: 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 74 27 73  urns NULL.  It's
67b0: 20 70 75 72 70 6f 73 65 20 69 74 20 74 6f 20 61   purpose it to a
67c0: 63 63 75 6d 75 6c 61 74 65 0a 2a 2a 20 73 74 61  ccumulate.** sta
67d0: 74 69 73 74 69 63 61 6c 20 64 61 74 61 20 61 6e  tistical data an
67e0: 64 2f 6f 72 20 73 61 6d 70 6c 65 73 20 69 6e 20  d/or samples in 
67f0: 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f  the Stat4Accum o
6800: 62 6a 65 63 74 20 61 62 6f 75 74 20 74 68 65 0a  bject about the.
6810: 2a 2a 20 69 6e 64 65 78 20 62 65 69 6e 67 20 61  ** index being a
6820: 6e 61 6c 79 7a 65 64 2e 20 20 54 68 65 20 73 74  nalyzed.  The st
6830: 61 74 5f 67 65 74 28 29 20 53 51 4c 20 66 75 6e  at_get() SQL fun
6840: 63 74 69 6f 6e 20 77 69 6c 6c 20 6c 61 74 65 72  ction will later
6850: 20 62 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 65   be used to.** e
6860: 78 74 72 61 63 74 20 72 65 6c 65 76 61 6e 74 20  xtract relevant 
6870: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
6880: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
6890: 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
68a0: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bles..**.** The 
68b0: 52 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  R parameter is o
68c0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 53 54 41  nly used for STA
68d0: 54 33 20 61 6e 64 20 53 54 41 54 34 0a 2a 2f 0a  T3 and STAT4.*/.
68e0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
68f0: 50 75 73 68 28 0a 20 20 73 71 6c 69 74 65 33 5f  Push(.  sqlite3_
6900: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6910: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
6920: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6930: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
6940: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 68 72 65 65  ..  /* The three
6950: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
6960: 6e 74 73 20 2a 2f 0a 20 20 53 74 61 74 34 41 63  nts */.  Stat4Ac
6970: 63 75 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41  cum *p = (Stat4A
6980: 63 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61  ccum*)sqlite3_va
6990: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
69a0: 29 3b 0a 20 20 69 6e 74 20 69 43 68 6e 67 20 3d  );.  int iChng =
69b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
69c0: 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  nt(argv[1]);..  
69d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
69e0: 28 20 61 72 67 63 20 29 3b 0a 20 20 55 4e 55 53  ( argc );.  UNUS
69f0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 63 6f  ED_PARAMETER( co
6a00: 6e 74 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72  ntext );.  asser
6a10: 74 28 20 70 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  t( p->nCol>0 );.
6a20: 20 20 61 73 73 65 72 74 28 20 69 43 68 6e 67 3c    assert( iChng<
6a30: 70 2d 3e 6e 43 6f 6c 20 29 3b 0a 0a 20 20 69 66  p->nCol );..  if
6a40: 28 20 70 2d 3e 6e 52 6f 77 3d 3d 30 20 29 7b 0a  ( p->nRow==0 ){.
6a50: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
6a60: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
6a70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
6a80: 44 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  Do initializatio
6a90: 6e 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  n. */.    for(i=
6aa0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
6ab0: 2b 29 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e  +) p->current.an
6ac0: 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 65 6c  Eq[i] = 1;.  }el
6ad0: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 63 6f 6e  se{.    /* Secon
6ae0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
6af0: 20 63 61 6c 6c 73 20 67 65 74 20 70 72 6f 63 65   calls get proce
6b00: 73 73 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 20  ssed here */.   
6b10: 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69   samplePushPrevi
6b20: 6f 75 73 28 70 2c 20 69 43 68 6e 67 29 3b 0a 0a  ous(p, iChng);..
6b30: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
6b40: 44 4c 74 5b 5d 2c 20 61 6e 4c 74 5b 5d 20 61 6e  DLt[], anLt[] an
6b50: 64 20 61 6e 45 71 5b 5d 20 74 6f 20 72 65 66 6c  d anEq[] to refl
6b60: 65 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  ect the values t
6b70: 68 61 74 20 61 70 70 6c 79 0a 20 20 20 20 2a 2a  hat apply.    **
6b80: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
6b90: 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 64 65 78  row of the index
6ba0: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  . */.    for(i=0
6bb0: 3b 20 69 3c 69 43 68 6e 67 3b 20 69 2b 2b 29 7b  ; i<iChng; i++){
6bc0: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
6bd0: 74 2e 61 6e 45 71 5b 69 5d 2b 2b 3b 0a 20 20 20  t.anEq[i]++;.   
6be0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 69 43 68   }.    for(i=iCh
6bf0: 6e 67 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  ng; i<p->nCol; i
6c00: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75  ++){.      p->cu
6c10: 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 69 5d 2b 2b  rrent.anDLt[i]++
6c20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6c30: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
6c40: 53 54 41 54 34 0a 20 20 20 20 20 20 70 2d 3e 63  STAT4.      p->c
6c50: 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 69 5d 20 2b  urrent.anLt[i] +
6c60: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45  = p->current.anE
6c70: 71 5b 69 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  q[i];.#endif.   
6c80: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e     p->current.an
6c90: 45 71 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  Eq[i] = 1;.    }
6ca0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 52 6f 77 2b 2b  .  }.  p->nRow++
6cb0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6cc0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
6cd0: 53 54 41 54 34 0a 20 20 69 66 28 20 73 71 6c 69  STAT4.  if( sqli
6ce0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
6cf0: 72 67 76 5b 32 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[2])==SQLITE_
6d00: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 73  INTEGER ){.    s
6d10: 61 6d 70 6c 65 53 65 74 52 6f 77 69 64 49 6e 74  ampleSetRowidInt
6d20: 36 34 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75  64(p->db, &p->cu
6d30: 72 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76  rrent, sqlite3_v
6d40: 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
6d50: 32 5d 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2]));.  }else{. 
6d60: 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69     sampleSetRowi
6d70: 64 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 63 75 72  d(p->db, &p->cur
6d80: 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  rent, sqlite3_va
6d90: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 32  lue_bytes(argv[2
6da0: 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]),.            
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6dd0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
6de0: 67 76 5b 32 5d 29 29 3b 0a 20 20 7d 0a 20 20 70  gv[2]));.  }.  p
6df0: 2d 3e 63 75 72 72 65 6e 74 2e 69 48 61 73 68 20  ->current.iHash 
6e00: 3d 20 70 2d 3e 69 50 72 6e 20 3d 20 70 2d 3e 69  = p->iPrn = p->i
6e10: 50 72 6e 2a 31 31 30 33 35 31 35 32 34 35 20 2b  Prn*1103515245 +
6e20: 20 31 32 33 34 35 3b 0a 23 65 6e 64 69 66 0a 0a   12345;.#endif..
6e30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6e40: 41 42 4c 45 5f 53 54 41 54 34 0a 20 20 7b 0a 20  ABLE_STAT4.  {. 
6e50: 20 20 20 74 52 6f 77 63 6e 74 20 6e 4c 74 20 3d     tRowcnt nLt =
6e60: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74   p->current.anLt
6e70: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 0a 20 20  [p->nCol-1];..  
6e80: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
6e90: 69 73 20 69 73 20 74 6f 20 62 65 20 61 20 70 65  is is to be a pe
6ea0: 72 69 6f 64 69 63 20 73 61 6d 70 6c 65 2e 20 49  riodic sample. I
6eb0: 66 20 73 6f 2c 20 61 64 64 20 69 74 2e 20 2a 2f  f so, add it. */
6ec0: 0a 20 20 20 20 69 66 28 20 28 6e 4c 74 2f 70 2d  .    if( (nLt/p-
6ed0: 3e 6e 50 53 61 6d 70 6c 65 29 21 3d 28 6e 4c 74  >nPSample)!=(nLt
6ee0: 2b 31 29 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65 20  +1)/p->nPSample 
6ef0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  ){.      p->curr
6f00: 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d 20  ent.isPSample = 
6f10: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72  1;.      p->curr
6f20: 65 6e 74 2e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  ent.iCol = 0;.  
6f30: 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74      sampleInsert
6f40: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
6f50: 20 70 2d 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 20   p->nCol-1);.   
6f60: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73     p->current.is
6f70: 50 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 20  PSample = 0;.   
6f80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
6f90: 65 20 74 68 65 20 61 42 65 73 74 5b 5d 20 61 72  e the aBest[] ar
6fa0: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ray. */.    for(
6fb0: 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 43 6f 6c 2d  i=0; i<(p->nCol-
6fc0: 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  1); i++){.      
6fd0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20  p->current.iCol 
6fe0: 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = i;.      if( i
6ff0: 3e 3d 69 43 68 6e 67 20 7c 7c 20 73 61 6d 70 6c  >=iChng || sampl
7000: 65 49 73 42 65 74 74 65 72 50 6f 73 74 28 70 2c  eIsBetterPost(p,
7010: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70   &p->current, &p
7020: 2d 3e 61 42 65 73 74 5b 69 5d 29 20 29 7b 0a 20  ->aBest[i]) ){. 
7030: 20 20 20 20 20 20 20 73 61 6d 70 6c 65 43 6f 70         sampleCop
7040: 79 28 70 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69  y(p, &p->aBest[i
7050: 5d 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b  ], &p->current);
7060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7070: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74   }.#endif.}.stat
7080: 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66  ic const FuncDef
7090: 20 73 74 61 74 50 75 73 68 46 75 6e 63 64 65 66   statPushFuncdef
70a0: 20 3d 20 7b 0a 20 20 32 2b 49 73 53 74 61 74 33   = {.  2+IsStat3
70b0: 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  4,      /* nArg 
70c0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
70d0: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61  ,     /* funcFla
70e0: 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  gs */.  0,      
70f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
7100: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
7110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
7120: 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 50 75  Next */.  statPu
7130: 73 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 53  sh,        /* xS
7140: 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Func */.  0,    
7150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
7160: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74  inalize */.  "st
7170: 61 74 5f 70 75 73 68 22 2c 20 20 20 20 20 2f 2a  at_push",     /*
7180: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
7190: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53 54 41 54  };..#define STAT
71a0: 5f 47 45 54 5f 53 54 41 54 31 20 30 20 20 20 20  _GET_STAT1 0    
71b0: 20 20 20 20 20 20 2f 2a 20 22 73 74 61 74 22 20        /* "stat" 
71c0: 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61 74 31 20  column of stat1 
71d0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
71e0: 20 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20   STAT_GET_ROWID 
71f0: 31 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 72  1          /* "r
7200: 6f 77 69 64 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  owid" column of 
7210: 73 74 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a  stat[34] entry *
7220: 2f 0a 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47  /.#define STAT_G
7230: 45 54 5f 4e 45 51 20 20 20 32 20 20 20 20 20 20  ET_NEQ   2      
7240: 20 20 20 20 2f 2a 20 22 6e 65 71 22 20 63 6f 6c      /* "neq" col
7250: 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20  umn of stat[34] 
7260: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
7270: 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 20 20 20   STAT_GET_NLT   
7280: 33 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 6e  3          /* "n
7290: 6c 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74  lt" column of st
72a0: 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a  at[34] entry */.
72b0: 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54  #define STAT_GET
72c0: 5f 4e 44 4c 54 20 20 34 20 20 20 20 20 20 20 20  _NDLT  4        
72d0: 20 20 2f 2a 20 22 6e 64 6c 74 22 20 63 6f 6c 75    /* "ndlt" colu
72e0: 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65  mn of stat[34] e
72f0: 6e 74 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ntry */../*.** I
7300: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
7310: 20 74 68 65 20 73 74 61 74 5f 67 65 74 28 50 2c   the stat_get(P,
7320: 4a 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  J) SQL function.
7330: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
7340: 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 71 75 65  s.** used to que
7350: 72 79 20 73 74 61 74 69 73 74 69 63 61 6c 20 69  ry statistical i
7360: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
7370: 68 61 73 20 62 65 65 6e 20 67 61 74 68 65 72 65  has been gathere
7380: 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 53 74  d into.** the St
7390: 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20  at4Accum object 
73a0: 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  by prior calls t
73b0: 6f 20 73 74 61 74 5f 70 75 73 68 28 29 2e 20 20  o stat_push().  
73c0: 54 68 65 20 50 20 70 61 72 61 6d 65 74 65 72 0a  The P parameter.
73d0: 2a 2a 20 68 61 73 20 74 79 70 65 20 42 4c 4f 42  ** has type BLOB
73e0: 20 62 75 74 20 69 74 20 69 73 20 72 65 61 6c 6c   but it is reall
73f0: 79 20 6a 75 73 74 20 61 20 70 6f 69 6e 74 65 72  y just a pointer
7400: 20 74 6f 20 74 68 65 20 53 74 61 74 34 41 63 63   to the Stat4Acc
7410: 75 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68  um object..** Th
7420: 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 72 65 74  e content to ret
7430: 75 72 6e 65 64 20 69 73 20 64 65 74 65 72 6d 69  urned is determi
7440: 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 61 6d  ned by the param
7450: 65 74 65 72 20 4a 0a 2a 2a 20 77 68 69 63 68 20  eter J.** which 
7460: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 54  is one of the ST
7470: 41 54 5f 47 45 54 5f 78 78 78 78 20 76 61 6c 75  AT_GET_xxxx valu
7480: 65 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  es defined above
7490: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74  ..**.** The stat
74a0: 5f 67 65 74 28 50 2c 4a 29 20 66 75 6e 63 74 69  _get(P,J) functi
74b0: 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  on is not availa
74c0: 62 6c 65 20 74 6f 20 67 65 6e 65 72 69 63 20 53  ble to generic S
74d0: 51 4c 2e 20 20 49 74 20 69 73 0a 2a 2a 20 69 6e  QL.  It is.** in
74e0: 73 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f  serted as part o
74f0: 66 20 61 20 6d 61 6e 75 61 6c 6c 79 20 63 6f 6e  f a manually con
7500: 73 74 72 75 63 74 65 64 20 62 79 74 65 63 6f 64  structed bytecod
7510: 65 20 70 72 6f 67 72 61 6d 2e 20 20 28 53 65 65  e program.  (See
7520: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 53 74 61 74  .** the callStat
7530: 47 65 74 28 29 20 72 6f 75 74 69 6e 65 20 62 65  Get() routine be
7540: 6c 6f 77 2e 29 20 20 49 74 20 69 73 20 67 75 61  low.)  It is gua
7550: 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
7560: 20 50 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20   P.** parameter 
7570: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61  will always be a
7580: 20 70 6f 69 6e 65 72 20 74 6f 20 61 20 53 74 61   poiner to a Sta
7590: 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 2c 20  t4Accum object, 
75a0: 6e 65 76 65 72 20 61 0a 2a 2a 20 4e 55 4c 4c 2e  never a.** NULL.
75b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  .**.** If neithe
75c0: 72 20 53 54 41 54 33 20 6e 6f 72 20 53 54 41 54  r STAT3 nor STAT
75d0: 34 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 74  4 are enabled, t
75e0: 68 65 6e 20 4a 20 69 73 20 61 6c 77 61 79 73 0a  hen J is always.
75f0: 2a 2a 20 53 54 41 54 5f 47 45 54 5f 53 54 41 54  ** STAT_GET_STAT
7600: 31 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 6f  1 and is hence o
7610: 6d 69 74 74 65 64 20 61 6e 64 20 74 68 69 73 20  mitted and this 
7620: 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 0a  routine becomes.
7630: 2a 2a 20 61 20 6f 6e 65 2d 70 61 72 61 6d 65 74  ** a one-paramet
7640: 65 72 20 66 75 6e 63 74 69 6f 6e 2c 20 73 74 61  er function, sta
7650: 74 5f 67 65 74 28 50 29 2c 20 74 68 61 74 20 61  t_get(P), that a
7660: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 74 68  lways returns th
7670: 65 0a 2a 2a 20 73 74 61 74 31 20 74 61 62 6c 65  e.** stat1 table
7680: 20 65 6e 74 72 79 20 69 6e 66 6f 72 6d 61 74 69   entry informati
7690: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
76a0: 69 64 20 73 74 61 74 47 65 74 28 0a 20 20 73 71  id statGet(.  sq
76b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
76c0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
76d0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
76e0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
76f0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20  Stat4Accum *p = 
7700: 28 53 74 61 74 34 41 63 63 75 6d 2a 29 73 71 6c  (Stat4Accum*)sql
7710: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
7720: 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 64 65 66  argv[0]);.#ifdef
7730: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
7740: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
7750: 2f 2a 20 53 54 41 54 33 20 61 6e 64 20 53 54 41  /* STAT3 and STA
7760: 54 34 20 68 61 76 65 20 61 20 70 61 72 61 6d 65  T4 have a parame
7770: 74 65 72 20 6f 6e 20 74 68 69 73 20 72 6f 75 74  ter on this rout
7780: 69 6e 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 43  ine. */.  int eC
7790: 61 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  all = sqlite3_va
77a0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
77b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
77c0: 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
77d0: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
77e0: 5f 53 54 41 54 31 20 7c 7c 20 65 43 61 6c 6c 3d  _STAT1 || eCall=
77f0: 3d 53 54 41 54 5f 47 45 54 5f 4e 45 51 20 0a 20  =STAT_GET_NEQ . 
7800: 20 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d        || eCall==
7810: 53 54 41 54 5f 47 45 54 5f 52 4f 57 49 44 20 7c  STAT_GET_ROWID |
7820: 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  | eCall==STAT_GE
7830: 54 5f 4e 4c 54 0a 20 20 20 20 20 20 20 7c 7c 20  T_NLT.       || 
7840: 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f  eCall==STAT_GET_
7850: 4e 44 4c 54 20 0a 20 20 29 3b 0a 20 20 69 66 28  NDLT .  );.  if(
7860: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
7870: 5f 53 54 41 54 31 20 29 0a 23 65 6c 73 65 0a 20  _STAT1 ).#else. 
7880: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31   assert( argc==1
7890: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20   );.#endif.  {. 
78a0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
78b0: 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20   value to store 
78c0: 69 6e 20 74 68 65 20 22 73 74 61 74 22 20 63 6f  in the "stat" co
78d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  lumn of the sqli
78e0: 74 65 5f 73 74 61 74 31 0a 20 20 20 20 2a 2a 20  te_stat1.    ** 
78f0: 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20 69  table for this i
7900: 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
7910: 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73   ** The value is
7920: 20 61 20 73 74 72 69 6e 67 20 63 6f 6d 70 6f 73   a string compos
7930: 65 64 20 6f 66 20 61 20 6c 69 73 74 20 6f 66 20  ed of a list of 
7940: 69 6e 74 65 67 65 72 73 20 64 65 73 63 72 69 62  integers describ
7950: 69 6e 67 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ing .    ** the 
7960: 69 6e 64 65 78 2e 20 54 68 65 20 66 69 72 73 74  index. The first
7970: 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
7980: 6c 69 73 74 20 69 73 20 74 68 65 20 74 6f 74 61  list is the tota
7990: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  l number of .   
79a0: 20 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74   ** entries in t
79b0: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 72 65 20  he index. There 
79c0: 69 73 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61  is one additiona
79d0: 6c 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65  l integer in the
79e0: 20 6c 69 73 74 20 0a 20 20 20 20 2a 2a 20 66 6f   list .    ** fo
79f0: 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 63  r each indexed c
7a00: 6f 6c 75 6d 6e 2e 20 54 68 69 73 20 61 64 64 69  olumn. This addi
7a10: 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65 72 20 69  tional integer i
7a20: 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
7a30: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
7a40: 65 72 20 6f 66 20 72 6f 77 73 20 6d 61 74 63 68  er of rows match
7a50: 65 64 20 62 79 20 61 20 73 74 61 62 62 69 6e 67  ed by a stabbing
7a60: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 20 69 6e   query on the in
7a70: 64 65 78 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  dex using.    **
7a80: 20 61 20 6b 65 79 20 77 69 74 68 20 74 68 65 20   a key with the 
7a90: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6e 75  corresponding nu
7aa0: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
7ab0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
7ac0: 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 69 6e      ** if the in
7ad0: 64 65 78 20 69 73 20 6f 6e 20 63 6f 6c 75 6d 6e  dex is on column
7ae0: 73 20 28 61 2c 62 29 20 61 6e 64 20 74 68 65 20  s (a,b) and the 
7af0: 73 71 6c 69 74 65 5f 73 74 61 74 31 20 76 61 6c  sqlite_stat1 val
7b00: 75 65 20 69 73 20 0a 20 20 20 20 2a 2a 20 22 31  ue is .    ** "1
7b10: 30 30 20 31 30 20 32 22 2c 20 74 68 65 6e 20 53  00 10 2", then S
7b20: 51 4c 69 74 65 20 65 73 74 69 6d 61 74 65 73 20  QLite estimates 
7b30: 74 68 61 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  that:.    **.   
7b40: 20 2a 2a 20 20 20 2a 20 74 68 65 20 69 6e 64 65   **   * the inde
7b50: 78 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20 72  x contains 100 r
7b60: 6f 77 73 2c 0a 20 20 20 20 2a 2a 20 20 20 2a 20  ows,.    **   * 
7b70: 22 57 48 45 52 45 20 61 3d 3f 22 20 6d 61 74 63  "WHERE a=?" matc
7b80: 68 65 73 20 31 30 20 72 6f 77 73 2c 20 61 6e 64  hes 10 rows, and
7b90: 0a 20 20 20 20 2a 2a 20 20 20 2a 20 22 57 48 45  .    **   * "WHE
7ba0: 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 22 20  RE a=? AND b=?" 
7bb0: 6d 61 74 63 68 65 73 20 32 20 72 6f 77 73 2e 0a  matches 2 rows..
7bc0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
7bd0: 20 44 20 69 73 20 74 68 65 20 63 6f 75 6e 74 20   D is the count 
7be0: 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75  of distinct valu
7bf0: 65 73 20 61 6e 64 20 4b 20 69 73 20 74 68 65 20  es and K is the 
7c00: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7c10: 0a 20 20 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68  .    ** rows, th
7c20: 65 6e 20 65 61 63 68 20 65 73 74 69 6d 61 74 65  en each estimate
7c30: 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 73 3a   is computed as:
7c40: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
7c50: 20 20 20 20 20 20 49 20 3d 20 28 4b 2b 44 2d 31        I = (K+D-1
7c60: 29 2f 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  )/D.    */.    c
7c70: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
7c80: 69 3b 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 52  i;..    char *zR
7c90: 65 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  et = sqlite3Mall
7ca0: 6f 63 5a 65 72 6f 28 20 28 70 2d 3e 6e 4b 65 79  ocZero( (p->nKey
7cb0: 43 6f 6c 2b 31 29 2a 32 35 20 29 3b 0a 20 20 20  Col+1)*25 );.   
7cc0: 20 69 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b 0a   if( zRet==0 ){.
7cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ce0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
7cf0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
7d00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a   return;.    }..
7d10: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d20: 69 6e 74 66 28 32 34 2c 20 7a 52 65 74 2c 20 22  intf(24, zRet, "
7d30: 25 6c 6c 75 22 2c 20 28 75 36 34 29 70 2d 3e 6e  %llu", (u64)p->n
7d40: 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 52  Row);.    z = zR
7d50: 65 74 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  et + sqlite3Strl
7d60: 65 6e 33 30 28 7a 52 65 74 29 3b 0a 20 20 20 20  en30(zRet);.    
7d70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4b  for(i=0; i<p->nK
7d80: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
7d90: 20 20 20 75 36 34 20 6e 44 69 73 74 69 6e 63 74     u64 nDistinct
7da0: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e   = p->current.an
7db0: 44 4c 74 5b 69 5d 20 2b 20 31 3b 0a 20 20 20 20  DLt[i] + 1;.    
7dc0: 20 20 75 36 34 20 69 56 61 6c 20 3d 20 28 70 2d    u64 iVal = (p-
7dd0: 3e 6e 52 6f 77 20 2b 20 6e 44 69 73 74 69 6e 63  >nRow + nDistinc
7de0: 74 20 2d 20 31 29 20 2f 20 6e 44 69 73 74 69 6e  t - 1) / nDistin
7df0: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
7e00: 33 5f 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a  3_snprintf(24, z
7e10: 2c 20 22 20 25 6c 6c 75 22 2c 20 69 56 61 6c 29  , " %llu", iVal)
7e20: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
7e30: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
7e40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7e50: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
7e60: 5d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ] );.    }.    a
7e70: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30  ssert( z[0]=='\0
7e80: 27 20 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 0a  ' && z>zRet );..
7e90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7ea0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
7eb0: 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74   zRet, -1, sqlit
7ec0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 23 69  e3_free);.  }.#i
7ed0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7ee0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
7ef0: 34 0a 20 20 65 6c 73 65 20 69 66 28 20 65 43 61  4.  else if( eCa
7f00: 6c 6c 3d 3d 53 54 41 54 5f 47 45 54 5f 52 4f 57  ll==STAT_GET_ROW
7f10: 49 44 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ID ){.    if( p-
7f20: 3e 69 47 65 74 3c 30 20 29 7b 0a 20 20 20 20 20  >iGet<0 ){.     
7f30: 20 73 61 6d 70 6c 65 50 75 73 68 50 72 65 76 69   samplePushPrevi
7f40: 6f 75 73 28 70 2c 20 30 29 3b 0a 20 20 20 20 20  ous(p, 0);.     
7f50: 20 70 2d 3e 69 47 65 74 20 3d 20 30 3b 0a 20 20   p->iGet = 0;.  
7f60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69    }.    if( p->i
7f70: 47 65 74 3c 70 2d 3e 6e 53 61 6d 70 6c 65 20 29  Get<p->nSample )
7f80: 7b 0a 20 20 20 20 20 20 53 74 61 74 34 53 61 6d  {.      Stat4Sam
7f90: 70 6c 65 20 2a 70 53 20 3d 20 70 2d 3e 61 20 2b  ple *pS = p->a +
7fa0: 20 70 2d 3e 69 47 65 74 3b 0a 20 20 20 20 20 20   p->iGet;.      
7fb0: 69 66 28 20 70 53 2d 3e 6e 52 6f 77 69 64 3d 3d  if( pS->nRowid==
7fc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
7fd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
7fe0: 34 28 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e 75  4(context, pS->u
7ff0: 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
8000: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8010: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
8020: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 53 2d 3e  ob(context, pS->
8030: 75 2e 61 52 6f 77 69 64 2c 20 70 53 2d 3e 6e 52  u.aRowid, pS->nR
8040: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
8070: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
8080: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8090: 74 52 6f 77 63 6e 74 20 2a 61 43 6e 74 20 3d 20  tRowcnt *aCnt = 
80a0: 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  0;..    assert( 
80b0: 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e 53 61 6d 70  p->iGet<p->nSamp
80c0: 6c 65 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68  le );.    switch
80d0: 28 20 65 43 61 6c 6c 20 29 7b 0a 20 20 20 20 20  ( eCall ){.     
80e0: 20 63 61 73 65 20 53 54 41 54 5f 47 45 54 5f 4e   case STAT_GET_N
80f0: 45 51 3a 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61  EQ:  aCnt = p->a
8100: 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e 45 71 3b 20  [p->iGet].anEq; 
8110: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8120: 65 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54 3a 20  e STAT_GET_NLT: 
8130: 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e   aCnt = p->a[p->
8140: 69 47 65 74 5d 2e 61 6e 4c 74 3b 20 62 72 65 61  iGet].anLt; brea
8150: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
8160: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 43 6e 74  : {.        aCnt
8170: 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d   = p->a[p->iGet]
8180: 2e 61 6e 44 4c 74 3b 20 0a 20 20 20 20 20 20 20  .anDLt; .       
8190: 20 70 2d 3e 69 47 65 74 2b 2b 3b 0a 20 20 20 20   p->iGet++;.    
81a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
81b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
81c0: 28 20 49 73 53 74 61 74 33 20 29 7b 0a 20 20 20  ( IsStat3 ){.   
81d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
81e0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
81f0: 20 28 69 36 34 29 61 43 6e 74 5b 30 5d 29 3b 0a   (i64)aCnt[0]);.
8200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8210: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71   char *zRet = sq
8220: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
8230: 70 2d 3e 6e 43 6f 6c 20 2a 20 32 35 29 3b 0a 20  p->nCol * 25);. 
8240: 20 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d 30       if( zRet==0
8250: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8260: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8270: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
8280: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8290: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
82a0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a       char *z = z
82b0: 52 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Ret;.        for
82c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
82d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
82e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
82f0: 66 28 32 34 2c 20 7a 2c 20 22 25 6c 6c 75 20 22  f(24, z, "%llu "
8300: 2c 20 28 75 36 34 29 61 43 6e 74 5b 69 5d 29 3b  , (u64)aCnt[i]);
8310: 0a 20 20 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  .          z += 
8320: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8330: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z);.        }.  
8340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
8350: 30 5d 3d 3d 27 5c 30 27 20 26 26 20 7a 3e 7a 52  0]=='\0' && z>zR
8360: 65 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 5b  et );.        z[
8370: 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  -1] = '\0';.    
8380: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8390: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
83a0: 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74   zRet, -1, sqlit
83b0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
83c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
83d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
83e0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
83f0: 54 34 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  T4 */.#ifndef SQ
8400: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
8410: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 61  SED_PARAMETER( a
8420: 72 67 63 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rgc );.#endif.}.
8430: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e  static const Fun
8440: 63 44 65 66 20 73 74 61 74 47 65 74 46 75 6e 63  cDef statGetFunc
8450: 64 65 66 20 3d 20 7b 0a 20 20 31 2b 49 73 53 74  def = {.  1+IsSt
8460: 61 74 33 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41  at34,      /* nA
8470: 72 67 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55  rg */.  SQLITE_U
8480: 54 46 38 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63  TF8,     /* func
8490: 46 6c 61 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20  Flags */.  0,   
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
84b0: 55 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c  UserData */.  0,
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
84d0: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61  * pNext */.  sta
84e0: 74 47 65 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  tGet,         /*
84f0: 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20   xSFunc */.  0, 
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8510: 20 78 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20   xFinalize */.  
8520: 22 73 74 61 74 5f 67 65 74 22 2c 20 20 20 20 20  "stat_get",     
8530: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b   /* zName */.  {
8540: 30 7d 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f  0}.};..static vo
8550: 69 64 20 63 61 6c 6c 53 74 61 74 47 65 74 28 56  id callStatGet(V
8560: 64 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 53  dbe *v, int regS
8570: 74 61 74 34 2c 20 69 6e 74 20 69 50 61 72 61 6d  tat4, int iParam
8580: 2c 20 69 6e 74 20 72 65 67 4f 75 74 29 7b 0a 20  , int regOut){. 
8590: 20 61 73 73 65 72 74 28 20 72 65 67 4f 75 74 21   assert( regOut!
85a0: 3d 72 65 67 53 74 61 74 34 20 26 26 20 72 65 67  =regStat4 && reg
85b0: 4f 75 74 21 3d 72 65 67 53 74 61 74 34 2b 31 20  Out!=regStat4+1 
85c0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
85d0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
85e0: 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33  _STAT4.  sqlite3
85f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8600: 5f 49 6e 74 65 67 65 72 2c 20 69 50 61 72 61 6d  _Integer, iParam
8610: 2c 20 72 65 67 53 74 61 74 34 2b 31 29 3b 0a 23  , regStat4+1);.#
8620: 65 6c 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  elif SQLITE_DEBU
8630: 47 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 72  G.  assert( iPar
8640: 61 6d 3d 3d 53 54 41 54 5f 47 45 54 5f 53 54 41  am==STAT_GET_STA
8650: 54 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  T1 );.#else.  UN
8660: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
8670: 69 50 61 72 61 6d 20 29 3b 0a 23 65 6e 64 69 66  iParam );.#endif
8680: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8690: 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
86a0: 69 6f 6e 30 2c 20 30 2c 20 72 65 67 53 74 61 74  ion0, 0, regStat
86b0: 34 2c 20 72 65 67 4f 75 74 2c 0a 20 20 20 20 20  4, regOut,.     
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
86d0: 63 68 61 72 2a 29 26 73 74 61 74 47 65 74 46 75  char*)&statGetFu
86e0: 6e 63 64 65 66 2c 20 50 34 5f 46 55 4e 43 44 45  ncdef, P4_FUNCDE
86f0: 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
8700: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 20 2b  eChangeP5(v, 1 +
8710: 20 49 73 53 74 61 74 33 34 29 3b 0a 7d 0a 0a 2f   IsStat34);.}../
8720: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
8730: 64 65 20 74 6f 20 64 6f 20 61 6e 20 61 6e 61 6c  de to do an anal
8740: 79 73 69 73 20 6f 66 20 61 6c 6c 20 69 6e 64 69  ysis of all indi
8750: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
8760: 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  ith.** a single 
8770: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
8780: 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65 4f 6e 65   void analyzeOne
8790: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
87a0: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
87b0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
87c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
87d0: 20 20 2f 2a 20 54 61 62 6c 65 20 77 68 6f 73 65    /* Table whose
87e0: 20 69 6e 64 69 63 65 73 20 61 72 65 20 74 6f 20   indices are to 
87f0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
8800: 20 49 6e 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78   Index *pOnlyIdx
8810: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
8820: 2c 20 6f 6e 6c 79 20 61 6e 61 6c 79 7a 65 20 74  , only analyze t
8830: 68 69 73 20 6f 6e 65 20 69 6e 64 65 78 20 2a 2f  his one index */
8840: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 2c  .  int iStatCur,
8850: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
8860: 56 64 62 65 43 75 72 73 6f 72 20 74 68 61 74 20  VdbeCursor that 
8870: 77 72 69 74 65 73 20 74 68 65 20 73 71 6c 69 74  writes the sqlit
8880: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f  e_stat1 table */
8890: 0a 20 20 69 6e 74 20 69 4d 65 6d 2c 20 20 20 20  .  int iMem,    
88a0: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65      /* Available
88b0: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
88c0: 73 20 62 65 67 69 6e 20 68 65 72 65 20 2a 2f 0a  s begin here */.
88d0: 20 20 69 6e 74 20 69 54 61 62 20 20 20 20 20 20    int iTab      
88e0: 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
88f0: 61 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 29  able cursor */.)
8900: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
8910: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
8920: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
8930: 64 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  dle */.  Index *
8940: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
8950: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
8960: 78 20 74 6f 20 62 65 69 6e 67 20 61 6e 61 6c 79  x to being analy
8970: 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  zed */.  int iId
8980: 78 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  xCur;           
8990: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
89a0: 6f 70 65 6e 20 6f 6e 20 69 6e 64 65 78 20 62 65  open on index be
89b0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
89c0: 20 20 69 6e 74 20 69 54 61 62 43 75 72 3b 20 20    int iTabCur;  
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
89e0: 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 2a  * Table cursor *
89f0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
8a20: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 62 75  machine being bu
8a30: 69 6c 74 20 75 70 20 2a 2f 0a 20 20 69 6e 74 20  ilt up */.  int 
8a40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8a60: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
8a70: 74 20 6a 5a 65 72 6f 52 6f 77 73 20 3d 20 2d 31  t jZeroRows = -1
8a80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ;          /* Ju
8a90: 6d 70 20 66 72 6f 6d 20 68 65 72 65 20 69 66 20  mp from here if 
8aa0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
8ab0: 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  s zero */.  int 
8ac0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
8ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
8ae0: 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
8af0: 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f  ntaining pTab */
8b00: 0a 20 20 75 38 20 6e 65 65 64 54 61 62 6c 65 43  .  u8 needTableC
8b10: 6e 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  nt = 1;         
8b20: 2f 2a 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74  /* True to count
8b30: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
8b40: 69 6e 74 20 72 65 67 4e 65 77 52 6f 77 69 64 20  int regNewRowid 
8b50: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 2f 2a 20  = iMem++;    /* 
8b60: 52 6f 77 69 64 20 66 6f 72 20 74 68 65 20 69 6e  Rowid for the in
8b70: 73 65 72 74 65 64 20 72 65 63 6f 72 64 20 2a 2f  serted record */
8b80: 0a 20 20 69 6e 74 20 72 65 67 53 74 61 74 34 20  .  int regStat4 
8b90: 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  = iMem++;       
8ba0: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68  /* Register to h
8bb0: 6f 6c 64 20 53 74 61 74 34 41 63 63 75 6d 20 6f  old Stat4Accum o
8bc0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
8bd0: 65 67 43 68 6e 67 20 3d 20 69 4d 65 6d 2b 2b 3b  egChng = iMem++;
8be0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8bf0: 20 6f 66 20 63 68 61 6e 67 65 64 20 69 6e 64 65   of changed inde
8c00: 78 20 66 69 65 6c 64 20 2a 2f 0a 23 69 66 64 65  x field */.#ifde
8c10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8c20: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
8c30: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
8c40: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a  iMem++;       /*
8c50: 20 52 6f 77 69 64 20 61 72 67 75 6d 65 6e 74 20   Rowid argument 
8c60: 70 61 73 73 65 64 20 74 6f 20 73 74 61 74 5f 70  passed to stat_p
8c70: 75 73 68 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  ush() */.#endif.
8c80: 20 20 69 6e 74 20 72 65 67 54 65 6d 70 20 3d 20    int regTemp = 
8c90: 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 2f  iMem++;        /
8ca0: 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
8cb0: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
8cc0: 74 20 72 65 67 54 61 62 6e 61 6d 65 20 3d 20 69  t regTabname = i
8cd0: 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f 2a 20 52 65  Mem++;     /* Re
8ce0: 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e  gister containin
8cf0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  g table name */.
8d00: 20 20 69 6e 74 20 72 65 67 49 64 78 6e 61 6d 65    int regIdxname
8d10: 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 2f   = iMem++;     /
8d20: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
8d30: 69 6e 69 6e 67 20 69 6e 64 65 78 20 6e 61 6d 65  ining index name
8d40: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74 61   */.  int regSta
8d50: 74 31 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20 20 20  t1 = iMem++;    
8d60: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
8d70: 74 68 65 20 73 74 61 74 20 63 6f 6c 75 6d 6e 20  the stat column 
8d80: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  of sqlite_stat1 
8d90: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
8da0: 20 3d 20 69 4d 65 6d 3b 20 20 20 20 20 20 20 20   = iMem;        
8db0: 20 20 2f 2a 20 4d 55 53 54 20 42 45 20 4c 41 53    /* MUST BE LAS
8dc0: 54 20 28 73 65 65 20 62 65 6c 6f 77 29 20 2a 2f  T (see below) */
8dd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8de0: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
8df0: 48 4f 4f 4b 0a 20 20 54 61 62 6c 65 20 2a 70 53  HOOK.  Table *pS
8e00: 74 61 74 31 20 3d 20 30 3b 20 0a 23 65 6e 64 69  tat1 = 0; .#endi
8e10: 66 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  f..  pParse->nMe
8e20: 6d 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e  m = MAX(pParse->
8e30: 6e 4d 65 6d 2c 20 69 4d 65 6d 29 3b 0a 20 20 76  nMem, iMem);.  v
8e40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
8e50: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
8e60: 20 76 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   v==0 || NEVER(p
8e70: 54 61 62 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  Tab==0) ){.    r
8e80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
8e90: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 30 20 29   pTab->tnum==0 )
8ea0: 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
8eb0: 67 61 74 68 65 72 20 73 74 61 74 69 73 74 69 63  gather statistic
8ec0: 73 20 6f 6e 20 76 69 65 77 73 20 6f 72 20 76 69  s on views or vi
8ed0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a  rtual tables */.
8ee0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8ef0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8f00: 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5f 25 22  rlike("sqlite_%"
8f10: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
8f20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44  )==0 ){.    /* D
8f30: 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73 74 61  o not gather sta
8f40: 74 69 73 74 69 63 73 20 6f 6e 20 73 79 73 74 65  tistics on syste
8f50: 6d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  m tables */.    
8f60: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
8f70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
8f80: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
8f90: 73 28 64 62 29 20 29 3b 0a 20 20 69 44 62 20 3d  s(db) );.  iDb =
8fa0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
8fb0: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
8fc0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
8fd0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 20 20  rt( iDb>=0 );.  
8fe0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
8ff0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
9000: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 23 69  b, iDb, 0) );.#i
9010: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9020: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
9030: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
9040: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
9050: 51 4c 49 54 45 5f 41 4e 41 4c 59 5a 45 2c 20 70  QLITE_ANALYZE, p
9060: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  Tab->zName, 0,. 
9070: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
9080: 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a  ].zDbSName ) ){.
9090: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
90a0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
90b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
90c0: 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 69 66  UPDATE_HOOK.  if
90d0: 28 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65  ( db->xPreUpdate
90e0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
90f0: 70 53 74 61 74 31 20 3d 20 28 54 61 62 6c 65 2a  pStat1 = (Table*
9100: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
9110: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
9120: 54 61 62 6c 65 29 20 2b 20 31 33 29 3b 0a 20 20  Table) + 13);.  
9130: 20 20 69 66 28 20 70 53 74 61 74 31 3d 3d 30 20    if( pStat1==0 
9140: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53  ) return;.    pS
9150: 74 61 74 31 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  tat1->zName = (c
9160: 68 61 72 2a 29 26 70 53 74 61 74 31 5b 31 5d 3b  har*)&pStat1[1];
9170: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53 74 61  .    memcpy(pSta
9180: 74 31 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  t1->zName, "sqli
9190: 74 65 5f 73 74 61 74 31 22 2c 20 31 33 29 3b 0a  te_stat1", 13);.
91a0: 20 20 20 20 70 53 74 61 74 31 2d 3e 6e 43 6f 6c      pStat1->nCol
91b0: 20 3d 20 33 3b 0a 20 20 20 20 70 53 74 61 74 31   = 3;.    pStat1
91c0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
91d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
91e0: 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op4(pParse->pVdb
91f0: 65 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  e, OP_Noop, 0, 0
9200: 2c 20 30 2c 28 63 68 61 72 2a 29 70 53 74 61 74  , 0,(char*)pStat
9210: 31 2c 50 34 5f 44 59 4e 42 4c 4f 42 29 3b 0a 20  1,P4_DYNBLOB);. 
9220: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
9230: 45 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64  Establish a read
9240: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
9250: 6c 65 20 61 74 20 74 68 65 20 73 68 61 72 65 64  le at the shared
9260: 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e 20 0a 20  -cache level. . 
9270: 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d   ** Open a read-
9280: 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20 74  only cursor on t
9290: 68 65 20 74 61 62 6c 65 2e 20 41 6c 73 6f 20 61  he table. Also a
92a0: 6c 6c 6f 63 61 74 65 20 61 20 63 75 72 73 6f 72  llocate a cursor
92b0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 74 6f 20   number.  ** to 
92c0: 75 73 65 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  use for scanning
92d0: 20 69 6e 64 65 78 65 73 20 28 69 49 64 78 43 75   indexes (iIdxCu
92e0: 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20 63 75 72  r). No index cur
92f0: 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 61 74  sor is opened at
9300: 0a 20 20 2a 2a 20 74 68 69 73 20 74 69 6d 65 20  .  ** this time 
9310: 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20 20 73 71  though.  */.  sq
9320: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
9330: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
9340: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
9350: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54 61 62 43  >zName);.  iTabC
9360: 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a 20 20 69  ur = iTab++;.  i
9370: 49 64 78 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b  IdxCur = iTab++;
9380: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
9390: 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e 54  = MAX(pParse->nT
93a0: 61 62 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  ab, iTab);.  sql
93b0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
93c0: 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20 69  arse, iTabCur, i
93d0: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
93e0: 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c 69 74 65  nRead);.  sqlite
93f0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
9400: 76 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 70  v, regTabname, p
9410: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
9420: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
9430: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
9440: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
9450: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9480: 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 64 78 2e 20  olumns in pIdx. 
9490: 22 4e 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  "N" */.    int a
94a0: 64 64 72 52 65 77 69 6e 64 3b 20 20 20 20 20 20  ddrRewind;      
94b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
94c0: 65 73 73 20 6f 66 20 22 4f 50 5f 52 65 77 69 6e  ess of "OP_Rewin
94d0: 64 20 69 49 64 78 43 75 72 22 20 2a 2f 0a 20 20  d iIdxCur" */.  
94e0: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 52 6f    int addrNextRo
94f0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
9500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 22 6e  /* Address of "n
9510: 65 78 74 5f 72 6f 77 3a 22 20 2a 2f 0a 20 20 20  ext_row:" */.   
9520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
9530: 78 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  xName;         /
9540: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
9550: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
9560: 43 6f 6c 54 65 73 74 3b 20 20 20 20 20 20 20 20  ColTest;        
9570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9580: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  er of columns to
9590: 20 74 65 73 74 20 66 6f 72 20 63 68 61 6e 67 65   test for change
95a0: 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4f  s */..    if( pO
95b0: 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e 6c 79 49  nlyIdx && pOnlyI
95c0: 64 78 21 3d 70 49 64 78 20 29 20 63 6f 6e 74 69  dx!=pIdx ) conti
95d0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nue;.    if( pId
95e0: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
95f0: 3d 3d 30 20 29 20 6e 65 65 64 54 61 62 6c 65 43  ==0 ) needTableC
9600: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  nt = 0;.    if( 
9610: 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
9620: 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  && IsPrimaryKeyI
9630: 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20 20  ndex(pIdx) ){.  
9640: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d      nCol = pIdx-
9650: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
9660: 7a 49 64 78 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zIdxName = pTab-
9670: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43  >zName;.      nC
9680: 6f 6c 54 65 73 74 20 3d 20 6e 43 6f 6c 20 2d 20  olTest = nCol - 
9690: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
96a0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d      nCol = pIdx-
96b0: 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >nColumn;.      
96c0: 7a 49 64 78 4e 61 6d 65 20 3d 20 70 49 64 78 2d  zIdxName = pIdx-
96d0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43  >zName;.      nC
96e0: 6f 6c 54 65 73 74 20 3d 20 70 49 64 78 2d 3e 75  olTest = pIdx->u
96f0: 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49 64  niqNotNull ? pId
9700: 78 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 3a 20 6e  x->nKeyCol-1 : n
9710: 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  Col-1;.    }..  
9720: 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
9730: 65 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  e register conta
9740: 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
9750: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  name. */.    sql
9760: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
9770: 6e 67 28 76 2c 20 72 65 67 49 64 78 6e 61 6d 65  ng(v, regIdxname
9780: 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 20  , zIdxName);.   
9790: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
97a0: 20 22 41 6e 61 6c 79 73 69 73 20 66 6f 72 20 25   "Analysis for %
97b0: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
97c0: 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29 29 3b 0a  me, zIdxName));.
97d0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
97e0: 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 6c  seudo-code for l
97f0: 6f 6f 70 20 74 68 61 74 20 63 61 6c 6c 73 20 73  oop that calls s
9800: 74 61 74 5f 70 75 73 68 28 29 3a 0a 20 20 20 20  tat_push():.    
9810: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77 69  **.    **   Rewi
9820: 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20 20  nd csr.    **   
9830: 69 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74 6f  if eof(csr) goto
9840: 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20 20   end_of_scan;.  
9850: 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d    **   regChng =
9860: 20 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f   0.    **   goto
9870: 20 63 68 6e 67 5f 61 64 64 72 5f 30 3b 0a 20 20   chng_addr_0;.  
9880: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 65 78    **.    **  nex
9890: 74 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20 20 20  t_row:.    **   
98a0: 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20 20  regChng = 0.    
98b0: 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30 29 20  **   if( idx(0) 
98c0: 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29 20  != regPrev(0) ) 
98d0: 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30  goto chng_addr_0
98e0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e  .    **   regChn
98f0: 67 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20 69  g = 1.    **   i
9900: 66 28 20 69 64 78 28 31 29 20 21 3d 20 72 65 67  f( idx(1) != reg
9910: 50 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20 63  Prev(1) ) goto c
9920: 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20 2a  hng_addr_1.    *
9930: 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20  *   ....    **  
9940: 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20 20   regChng = N.   
9950: 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67 5f   **   goto chng_
9960: 61 64 64 72 5f 4e 0a 20 20 20 20 2a 2a 0a 20 20  addr_N.    **.  
9970: 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f    **  chng_addr_
9980: 30 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 50  0:.    **   regP
9990: 72 65 76 28 30 29 20 3d 20 69 64 78 28 30 29 0a  rev(0) = idx(0).
99a0: 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64      **  chng_add
99b0: 72 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65  r_1:.    **   re
99c0: 67 50 72 65 76 28 31 29 20 3d 20 69 64 78 28 31  gPrev(1) = idx(1
99d0: 29 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20 20  ).    **  ....  
99e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 6e 64    **.    **  end
99f0: 44 69 73 74 69 6e 63 74 54 65 73 74 3a 0a 20 20  DistinctTest:.  
9a00: 20 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64 20    **   regRowid 
9a10: 3d 20 69 64 78 28 72 6f 77 69 64 29 0a 20 20 20  = idx(rowid).   
9a20: 20 2a 2a 20 20 20 73 74 61 74 5f 70 75 73 68 28   **   stat_push(
9a30: 50 2c 20 72 65 67 43 68 6e 67 2c 20 72 65 67 52  P, regChng, regR
9a40: 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20 20 20 4e  owid).    **   N
9a50: 65 78 74 20 63 73 72 0a 20 20 20 20 2a 2a 20 20  ext csr.    **  
9a60: 20 69 66 20 21 65 6f 66 28 63 73 72 29 20 67 6f   if !eof(csr) go
9a70: 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a 20 20 20  to next_row;.   
9a80: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 6e 64 5f   **.    **  end_
9a90: 6f 66 5f 73 63 61 6e 3a 0a 20 20 20 20 2a 2f 0a  of_scan:.    */.
9aa0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
9ab0: 65 20 74 68 65 72 65 20 61 72 65 20 65 6e 6f 75  e there are enou
9ac0: 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  gh memory cells 
9ad0: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61 63 63  allocated to acc
9ae0: 6f 6d 6d 6f 64 61 74 65 20 0a 20 20 20 20 2a 2a  ommodate .    **
9af0: 20 74 68 65 20 72 65 67 50 72 65 76 20 61 72 72   the regPrev arr
9b00: 61 79 20 61 6e 64 20 61 20 74 72 61 69 6c 69 6e  ay and a trailin
9b10: 67 20 72 6f 77 69 64 20 28 74 68 65 20 72 6f 77  g rowid (the row
9b20: 69 64 20 73 6c 6f 74 20 69 73 20 72 65 71 75 69  id slot is requi
9b30: 72 65 64 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  red.    ** when 
9b40: 62 75 69 6c 64 69 6e 67 20 61 20 72 65 63 6f 72  building a recor
9b50: 64 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  d to insert into
9b60: 20 74 68 65 20 73 61 6d 70 6c 65 20 63 6f 6c 75   the sample colu
9b70: 6d 6e 20 6f 66 20 0a 20 20 20 20 2a 2a 20 74 68  mn of .    ** th
9b80: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74  e sqlite_stat4 t
9b90: 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 70 50  able.  */.    pP
9ba0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58  arse->nMem = MAX
9bb0: 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 72  (pParse->nMem, r
9bc0: 65 67 50 72 65 76 2b 6e 43 6f 6c 54 65 73 74 29  egPrev+nColTest)
9bd0: 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  ;..    /* Open a
9be0: 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
9bf0: 72 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 62  r on the index b
9c00: 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  eing analyzed. *
9c10: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  /.    assert( iD
9c20: 62 3d 3d 73 71 6c 69 74 65 33 53 63 68 65 6d 61  b==sqlite3Schema
9c30: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
9c40: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
9c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9c60: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
9c70: 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 64  ad, iIdxCur, pId
9c80: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
9c90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9ca0: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
9cb0: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 56 64  e, pIdx);.    Vd
9cc0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
9cd0: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
9ce0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  );..    /* Invok
9cf0: 65 20 74 68 65 20 73 74 61 74 5f 69 6e 69 74 28  e the stat_init(
9d00: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  ) function. The 
9d10: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 3a 0a 20  arguments are:. 
9d20: 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20     ** .    **   
9d30: 20 28 31 29 20 74 68 65 20 6e 75 6d 62 65 72 20   (1) the number 
9d40: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9d50: 65 20 69 6e 64 65 78 20 69 6e 63 6c 75 64 69 6e  e index includin
9d60: 67 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20 20  g the rowid.    
9d70: 2a 2a 20 20 20 20 20 20 20 20 28 6f 72 20 66 6f  **        (or fo
9d80: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
9d90: 44 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 75 6d  D table, the num
9da0: 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75 6d 6e  ber of PK column
9db0: 73 29 2c 0a 20 20 20 20 2a 2a 20 20 20 20 28 32  s),.    **    (2
9dc0: 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  ) the number of 
9dd0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6b  columns in the k
9de0: 65 79 20 77 69 74 68 6f 75 74 20 74 68 65 20 72  ey without the r
9df0: 6f 77 69 64 2f 70 6b 0a 20 20 20 20 2a 2a 20 20  owid/pk.    **  
9e00: 20 20 28 33 29 20 74 68 65 20 6e 75 6d 62 65 72    (3) the number
9e10: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
9e20: 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 0a 20 20  index,.    **.  
9e30: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
9e40: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
9e50: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
9e60: 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34 0a  STAT3 and STAT4.
9e70: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
9e80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
9e90: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
9ea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9eb0: 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 49  (v, OP_Count, iI
9ec0: 64 78 43 75 72 2c 20 72 65 67 53 74 61 74 34 2b  dxCur, regStat4+
9ed0: 33 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  3);.#endif.    s
9ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9ef0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9f00: 6e 43 6f 6c 2c 20 72 65 67 53 74 61 74 34 2b 31  nCol, regStat4+1
9f10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9f20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
9f30: 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6e 4b  nteger, pIdx->nK
9f40: 65 79 43 6f 6c 2c 20 72 65 67 53 74 61 74 34 2b  eyCol, regStat4+
9f50: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
9f60: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9f70: 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c 20 72 65  Function0, 0, re
9f80: 67 53 74 61 74 34 2b 31 2c 20 72 65 67 53 74 61  gStat4+1, regSta
9f90: 74 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t4,.            
9fa0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
9fb0: 26 73 74 61 74 49 6e 69 74 46 75 6e 63 64 65 66  &statInitFuncdef
9fc0: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
9fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9fe0: 61 6e 67 65 50 35 28 76 2c 20 32 2b 49 73 53 74  angeP5(v, 2+IsSt
9ff0: 61 74 33 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  at34);..    /* I
a000: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
a010: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
a020: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
a030: 52 65 77 69 6e 64 20 63 73 72 0a 20 20 20 20 2a  Rewind csr.    *
a040: 2a 20 20 20 69 66 20 65 6f 66 28 63 73 72 29 20  *   if eof(csr) 
a050: 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e  goto end_of_scan
a060: 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68  ;.    **   regCh
a070: 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20  ng = 0.    **   
a080: 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73 68 5f 30  goto next_push_0
a090: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  ;.    **.    */.
a0a0: 20 20 20 20 61 64 64 72 52 65 77 69 6e 64 20 3d      addrRewind =
a0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0c0: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
a0d0: 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56   iIdxCur);.    V
a0e0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a0f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a100: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
a110: 67 65 72 2c 20 30 2c 20 72 65 67 43 68 6e 67 29  ger, 0, regChng)
a120: 3b 0a 20 20 20 20 61 64 64 72 4e 65 78 74 52 6f  ;.    addrNextRo
a130: 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
a140: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
a150: 20 20 20 20 69 66 28 20 6e 43 6f 6c 54 65 73 74      if( nColTest
a160: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
a170: 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 20  endDistinctTest 
a180: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
a190: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
a1a0: 20 69 6e 74 20 2a 61 47 6f 74 6f 43 68 6e 67 3b   int *aGotoChng;
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a1c0: 2a 20 41 72 72 61 79 20 6f 66 20 6a 75 6d 70 20  * Array of jump 
a1d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
a1e0: 65 73 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 61  esses */.      a
a1f0: 47 6f 74 6f 43 68 6e 67 20 3d 20 73 71 6c 69 74  GotoChng = sqlit
a200: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
a210: 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
a220: 6e 43 6f 6c 54 65 73 74 29 3b 0a 20 20 20 20 20  nColTest);.     
a230: 20 69 66 28 20 61 47 6f 74 6f 43 68 6e 67 3d 3d   if( aGotoChng==
a240: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
a250: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
a260: 20 20 6e 65 78 74 5f 72 6f 77 3a 0a 20 20 20 20    next_row:.    
a270: 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d    **   regChng =
a280: 20 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 69 66   0.      **   if
a290: 28 20 69 64 78 28 30 29 20 21 3d 20 72 65 67 50  ( idx(0) != regP
a2a0: 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20 63 68  rev(0) ) goto ch
a2b0: 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20 20 20 20  ng_addr_0.      
a2c0: 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20 31  **   regChng = 1
a2d0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 69 66 28 20  .      **   if( 
a2e0: 69 64 78 28 31 29 20 21 3d 20 72 65 67 50 72 65  idx(1) != regPre
a2f0: 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68 6e 67  v(1) ) goto chng
a300: 5f 61 64 64 72 5f 31 0a 20 20 20 20 20 20 2a 2a  _addr_1.      **
a310: 20 20 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20     ....      ** 
a320: 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20    regChng = N.  
a330: 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 65 6e      **   goto en
a340: 64 44 69 73 74 69 6e 63 74 54 65 73 74 0a 20 20  dDistinctTest.  
a350: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
a360: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
a370: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
a380: 20 20 61 64 64 72 4e 65 78 74 52 6f 77 20 3d 20    addrNextRow = 
a390: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a3a0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
a3b0: 20 69 66 28 20 6e 43 6f 6c 54 65 73 74 3d 3d 31   if( nColTest==1
a3c0: 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   && pIdx->nKeyCo
a3d0: 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69 71 75 65  l==1 && IsUnique
a3e0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20  Index(pIdx) ){. 
a3f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20         /* For a 
a400: 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 55 4e  single-column UN
a410: 49 51 55 45 20 69 6e 64 65 78 2c 20 6f 6e 63 65  IQUE index, once
a420: 20 77 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61   we have found a
a430: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 20 20 20 20 20 20   non-NULL.      
a440: 20 20 2a 2a 20 72 6f 77 2c 20 77 65 20 6b 6e 6f    ** row, we kno
a450: 77 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 72  w that all the r
a460: 65 73 74 20 77 69 6c 6c 20 62 65 20 64 69 73 74  est will be dist
a470: 69 6e 63 74 2c 20 73 6f 20 73 6b 69 70 20 0a 20  inct, so skip . 
a480: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 71         ** subseq
a490: 75 65 6e 74 20 64 69 73 74 69 6e 63 74 6e 65 73  uent distinctnes
a4a0: 73 20 74 65 73 74 73 2e 20 2a 2f 0a 20 20 20 20  s tests. */.    
a4b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a4c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp2(v, OP_NotN
a4d0: 75 6c 6c 2c 20 72 65 67 50 72 65 76 2c 20 65 6e  ull, regPrev, en
a4e0: 64 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b 0a  dDistinctTest);.
a4f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a500: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
a510: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a520: 69 3c 6e 43 6f 6c 54 65 73 74 3b 20 69 2b 2b 29  i<nColTest; i++)
a530: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
a540: 70 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29 73  pColl = (char*)s
a550: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
a560: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78  Seq(pParse, pIdx
a570: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  ->azColl[i]);.  
a580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a590: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
a5a0: 74 65 67 65 72 2c 20 69 2c 20 72 65 67 43 68 6e  teger, i, regChn
a5b0: 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
a5c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a5d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
a5e0: 43 75 72 2c 20 69 2c 20 72 65 67 54 65 6d 70 29  Cur, i, regTemp)
a5f0: 3b 0a 20 20 20 20 20 20 20 20 61 47 6f 74 6f 43  ;.        aGotoC
a600: 68 6e 67 5b 69 5d 20 3d 20 0a 20 20 20 20 20 20  hng[i] = .      
a610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a620: 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op4(v, OP_Ne, re
a630: 67 54 65 6d 70 2c 20 30 2c 20 72 65 67 50 72 65  gTemp, 0, regPre
a640: 76 2b 69 2c 20 70 43 6f 6c 6c 2c 20 50 34 5f 43  v+i, pColl, P4_C
a650: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
a660: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a670: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
a680: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
a690: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a6b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a6c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a6d0: 6e 43 6f 6c 54 65 73 74 2c 20 72 65 67 43 68 6e  nColTest, regChn
a6e0: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
a6f0: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64  3VdbeGoto(v, end
a700: 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b 0a 20  DistinctTest);. 
a710: 20 0a 20 20 0a 20 20 20 20 20 20 2f 2a 0a 20 20   .  .      /*.  
a720: 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64      **  chng_add
a730: 72 5f 30 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20  r_0:.      **   
a740: 72 65 67 50 72 65 76 28 30 29 20 3d 20 69 64 78  regPrev(0) = idx
a750: 28 30 29 0a 20 20 20 20 20 20 2a 2a 20 20 63 68  (0).      **  ch
a760: 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20 20 20 20  ng_addr_1:.     
a770: 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 31 29   **   regPrev(1)
a780: 20 3d 20 69 64 78 28 31 29 0a 20 20 20 20 20 20   = idx(1).      
a790: 2a 2a 20 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  **  ....      */
a7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a7b0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
a7c0: 64 72 4e 65 78 74 52 6f 77 2d 31 29 3b 0a 20 20  drNextRow-1);.  
a7d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a7e0: 43 6f 6c 54 65 73 74 3b 20 69 2b 2b 29 7b 0a 20  ColTest; i++){. 
a7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a800: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 47  beJumpHere(v, aG
a810: 6f 74 6f 43 68 6e 67 5b 69 5d 29 3b 0a 20 20 20  otoChng[i]);.   
a820: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a830: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a840: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69 2c  umn, iIdxCur, i,
a850: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
a860: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a870: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a880: 65 6c 28 76 2c 20 65 6e 64 44 69 73 74 69 6e 63  el(v, endDistinc
a890: 74 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  tTest);.      sq
a8a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a8b0: 61 47 6f 74 6f 43 68 6e 67 29 3b 0a 20 20 20 20  aGotoChng);.    
a8c0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  }.  .    /*.    
a8d0: 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 4e 3a  **  chng_addr_N:
a8e0: 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77  .    **   regRow
a8f0: 69 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29 20  id = idx(rowid) 
a900: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 53 54             // ST
a910: 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  AT34 only.    **
a920: 20 20 20 73 74 61 74 5f 70 75 73 68 28 50 2c 20     stat_push(P, 
a930: 72 65 67 43 68 6e 67 2c 20 72 65 67 52 6f 77 69  regChng, regRowi
a940: 64 29 20 20 2f 2f 20 33 72 64 20 70 61 72 61 6d  d)  // 3rd param
a950: 65 74 65 72 20 53 54 41 54 33 34 20 6f 6e 6c 79  eter STAT34 only
a960: 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74 20 63  .    **   Next c
a970: 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20 21  sr.    **   if !
a980: 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 6e 65  eof(csr) goto ne
a990: 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2f 0a 23  xt_row;.    */.#
a9a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
a9b0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
a9c0: 54 34 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  T4.    assert( r
a9d0: 65 67 52 6f 77 69 64 3d 3d 28 72 65 67 53 74 61  egRowid==(regSta
a9e0: 74 34 2b 32 29 20 29 3b 0a 20 20 20 20 69 66 28  t4+2) );.    if(
a9f0: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
aa00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aa10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
aa20: 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
aa30: 75 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ur, regRowid);. 
aa40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa50: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c  Index *pPk = sql
aa60: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
aa70: 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  dex(pIdx->pTable
aa80: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 2c 20  );.      int j, 
aa90: 6b 2c 20 72 65 67 4b 65 79 3b 0a 20 20 20 20 20  k, regKey;.     
aaa0: 20 72 65 67 4b 65 79 20 3d 20 73 71 6c 69 74 65   regKey = sqlite
aab0: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
aac0: 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  arse, pPk->nKeyC
aad0: 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ol);.      for(j
aae0: 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; j<pPk->nKeyC
aaf0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
ab00: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    k = sqlite3Col
ab10: 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c  umnOfIndex(pIdx,
ab20: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
ab30: 5d 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ]);.        asse
ab40: 72 74 28 20 6b 3e 3d 30 20 26 26 20 6b 3c 70 49  rt( k>=0 && k<pI
ab50: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
ab60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ab70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ab80: 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
ab90: 6b 2c 20 72 65 67 4b 65 79 2b 6a 29 3b 0a 20 20  k, regKey+j);.  
aba0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
abb0: 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62  t((v, "%s", pTab
abc0: 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f  ->aCol[pPk->aiCo
abd0: 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29  lumn[j]].zName))
abe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
abf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ac00: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
ac10: 72 64 2c 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d  rd, regKey, pPk-
ac20: 3e 6e 4b 65 79 43 6f 6c 2c 20 72 65 67 52 6f 77  >nKeyCol, regRow
ac30: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
ac40: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
ac50: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65  ge(pParse, regKe
ac60: 79 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29  y, pPk->nKeyCol)
ac70: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ac80: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 43 68     assert( regCh
ac90: 6e 67 3d 3d 28 72 65 67 53 74 61 74 34 2b 31 29  ng==(regStat4+1)
aca0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
acb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
acc0: 46 75 6e 63 74 69 6f 6e 30 2c 20 31 2c 20 72 65  Function0, 1, re
acd0: 67 53 74 61 74 34 2c 20 72 65 67 54 65 6d 70 2c  gStat4, regTemp,
ace0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
acf0: 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 74        (char*)&st
ad00: 61 74 50 75 73 68 46 75 6e 63 64 65 66 2c 20 50  atPushFuncdef, P
ad10: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
ad20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ad30: 65 50 35 28 76 2c 20 32 2b 49 73 53 74 61 74 33  eP5(v, 2+IsStat3
ad40: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
ad50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ad60: 4e 65 78 74 2c 20 69 49 64 78 43 75 72 2c 20 61  Next, iIdxCur, a
ad70: 64 64 72 4e 65 78 74 52 6f 77 29 3b 20 56 64 62  ddrNextRow); Vdb
ad80: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
ad90: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e     /* Add the en
ada0: 74 72 79 20 74 6f 20 74 68 65 20 73 74 61 74 31  try to the stat1
adb0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 63   table. */.    c
adc0: 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65  allStatGet(v, re
add0: 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54  gStat4, STAT_GET
ade0: 5f 53 54 41 54 31 2c 20 72 65 67 53 74 61 74 31  _STAT1, regStat1
adf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 22  );.    assert( "
ae00: 42 42 42 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  BBB"[0]==SQLITE_
ae10: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
ae20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae30: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
ae40: 72 64 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20  rd, regTabname, 
ae50: 33 2c 20 72 65 67 54 65 6d 70 2c 20 22 42 42 42  3, regTemp, "BBB
ae60: 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
ae70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ae80: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74  OP_NewRowid, iSt
ae90: 61 74 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77  atCur, regNewRow
aea0: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
aeb0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aec0: 5f 49 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75  _Insert, iStatCu
aed0: 72 2c 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e  r, regTemp, regN
aee0: 65 77 52 6f 77 69 64 29 3b 0a 23 69 66 64 65 66  ewRowid);.#ifdef
aef0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
af00: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
af10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
af20: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
af30: 61 72 2a 29 70 53 74 61 74 31 2c 20 50 34 5f 54  ar*)pStat1, P4_T
af40: 41 42 4c 45 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ABLE);.#endif.  
af50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
af60: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
af70: 41 50 50 45 4e 44 29 3b 0a 0a 20 20 20 20 2f 2a  APPEND);..    /*
af80: 20 41 64 64 20 74 68 65 20 65 6e 74 72 69 65 73   Add the entries
af90: 20 74 6f 20 74 68 65 20 73 74 61 74 33 20 6f 72   to the stat3 or
afa0: 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20 2a 2f   stat4 table. */
afb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
afc0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
afd0: 54 41 54 34 0a 20 20 20 20 7b 0a 20 20 20 20 20  TAT4.    {.     
afe0: 20 69 6e 74 20 72 65 67 45 71 20 3d 20 72 65 67   int regEq = reg
aff0: 53 74 61 74 31 3b 0a 20 20 20 20 20 20 69 6e 74  Stat1;.      int
b000: 20 72 65 67 4c 74 20 3d 20 72 65 67 53 74 61 74   regLt = regStat
b010: 31 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  1+1;.      int r
b020: 65 67 44 4c 74 20 3d 20 72 65 67 53 74 61 74 31  egDLt = regStat1
b030: 2b 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  +2;.      int re
b040: 67 53 61 6d 70 6c 65 20 3d 20 72 65 67 53 74 61  gSample = regSta
b050: 74 31 2b 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  t1+3;.      int 
b060: 72 65 67 43 6f 6c 20 3d 20 72 65 67 53 74 61 74  regCol = regStat
b070: 31 2b 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  1+4;.      int r
b080: 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 20 3d 20  egSampleRowid = 
b090: 72 65 67 43 6f 6c 20 2b 20 6e 43 6f 6c 3b 0a 20  regCol + nCol;. 
b0a0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78       int addrNex
b0b0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
b0c0: 72 49 73 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 75  rIsNull;.      u
b0d0: 38 20 73 65 65 6b 4f 70 20 3d 20 48 61 73 52 6f  8 seekOp = HasRo
b0e0: 77 69 64 28 70 54 61 62 29 20 3f 20 4f 50 5f 4e  wid(pTab) ? OP_N
b0f0: 6f 74 45 78 69 73 74 73 20 3a 20 4f 50 5f 4e 6f  otExists : OP_No
b100: 74 46 6f 75 6e 64 3b 0a 0a 20 20 20 20 20 20 70  tFound;..      p
b110: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
b120: 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20  X(pParse->nMem, 
b130: 72 65 67 43 6f 6c 2b 6e 43 6f 6c 29 3b 0a 0a 20  regCol+nCol);.. 
b140: 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
b150: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
b160: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
b170: 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20   callStatGet(v, 
b180: 72 65 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47  regStat4, STAT_G
b190: 45 54 5f 52 4f 57 49 44 2c 20 72 65 67 53 61 6d  ET_ROWID, regSam
b1a0: 70 6c 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  pleRowid);.     
b1b0: 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71   addrIsNull = sq
b1c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b1d0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
b1e0: 67 53 61 6d 70 6c 65 52 6f 77 69 64 29 3b 0a 20  gSampleRowid);. 
b1f0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b200: 65 28 76 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c  e(v);.      call
b210: 53 74 61 74 47 65 74 28 76 2c 20 72 65 67 53 74  StatGet(v, regSt
b220: 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e 45  at4, STAT_GET_NE
b230: 51 2c 20 72 65 67 45 71 29 3b 0a 20 20 20 20 20  Q, regEq);.     
b240: 20 63 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20   callStatGet(v, 
b250: 72 65 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47  regStat4, STAT_G
b260: 45 54 5f 4e 4c 54 2c 20 72 65 67 4c 74 29 3b 0a  ET_NLT, regLt);.
b270: 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65        callStatGe
b280: 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53  t(v, regStat4, S
b290: 54 41 54 5f 47 45 54 5f 4e 44 4c 54 2c 20 72 65  TAT_GET_NDLT, re
b2a0: 67 44 4c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  gDLt);.      sql
b2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b2c0: 74 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 54 61  t(v, seekOp, iTa
b2d0: 62 43 75 72 2c 20 61 64 64 72 4e 65 78 74 2c 20  bCur, addrNext, 
b2e0: 72 65 67 53 61 6d 70 6c 65 52 6f 77 69 64 2c 20  regSampleRowid, 
b2f0: 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  0);.      /* We 
b300: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 72 65  know that the re
b310: 67 53 61 6d 70 6c 65 52 6f 77 69 64 20 72 6f 77  gSampleRowid row
b320: 20 65 78 69 73 74 73 20 62 65 63 61 75 73 65 20   exists because 
b330: 69 74 20 77 61 73 20 72 65 61 64 20 62 79 0a 20  it was read by. 
b340: 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76       ** the prev
b350: 69 6f 75 73 20 6c 6f 6f 70 2e 20 20 54 68 75 73  ious loop.  Thus
b360: 20 74 68 65 20 6e 6f 74 2d 66 6f 75 6e 64 20 6a   the not-found j
b370: 75 6d 70 20 6f 66 20 73 65 65 6b 4f 70 20 77 69  ump of seekOp wi
b380: 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 20 20 2a  ll never.      *
b390: 2a 20 62 65 20 74 61 6b 65 6e 20 2a 2f 0a 20 20  * be taken */.  
b3a0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b3b0: 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 23  NeverTaken(v);.#
b3c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b3d0: 42 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 20 20  BLE_STAT3.      
b3e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
b3f0: 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70  oadIndexColumn(p
b400: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 54 61  Parse, pIdx, iTa
b410: 62 43 75 72 2c 20 30 2c 20 72 65 67 53 61 6d 70  bCur, 0, regSamp
b420: 6c 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  le);.#else.     
b430: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
b440: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b450: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4c  sqlite3ExprCodeL
b460: 6f 61 64 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 70  oadIndexColumn(p
b470: 50 61 72 73 65 2c 20 70 49 64 78 2c 20 69 54 61  Parse, pIdx, iTa
b480: 62 43 75 72 2c 20 69 2c 20 72 65 67 43 6f 6c 2b  bCur, i, regCol+
b490: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
b4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b4b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
b4c0: 63 6f 72 64 2c 20 72 65 67 43 6f 6c 2c 20 6e 43  cord, regCol, nC
b4d0: 6f 6c 2c 20 72 65 67 53 61 6d 70 6c 65 29 3b 0a  ol, regSample);.
b4e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c  #endif.      sql
b4f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b500: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b510: 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 36 2c 20   regTabname, 6, 
b520: 72 65 67 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  regTemp);.      
b530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b540: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
b550: 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20 72 65  , iStatCur+1, re
b560: 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20  gNewRowid);.    
b570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b580: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
b590: 2c 20 69 53 74 61 74 43 75 72 2b 31 2c 20 72 65  , iStatCur+1, re
b5a0: 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77  gTemp, regNewRow
b5b0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
b5c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b5d0: 4f 50 5f 47 6f 74 6f 2c 20 31 2c 20 61 64 64 72  OP_Goto, 1, addr
b5e0: 4e 65 78 74 29 3b 20 2f 2a 20 50 31 3d 3d 31 20  Next); /* P1==1 
b5f0: 66 6f 72 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20  for end-of-loop 
b600: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
b610: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b620: 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20  addrIsNull);.   
b630: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b640: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
b650: 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20  _OR_STAT4 */..  
b660: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6e 61 6c    /* End of anal
b670: 79 73 69 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ysis */.    sqli
b680: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
b690: 76 2c 20 61 64 64 72 52 65 77 69 6e 64 29 3b 0a  v, addrRewind);.
b6a0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 43 72 65 61 74    }...  /* Creat
b6b0: 65 20 61 20 73 69 6e 67 6c 65 20 73 71 6c 69 74  e a single sqlit
b6c0: 65 5f 73 74 61 74 31 20 65 6e 74 72 79 20 63 6f  e_stat1 entry co
b6d0: 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 61 73  ntaining NULL as
b6e0: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
b6f0: 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 72 6f 77  name and the row
b700: 20 63 6f 75 6e 74 20 61 73 20 74 68 65 20 63 6f   count as the co
b710: 6e 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntent..  */.  if
b720: 28 20 70 4f 6e 6c 79 49 64 78 3d 3d 30 20 26 26  ( pOnlyIdx==0 &&
b730: 20 6e 65 65 64 54 61 62 6c 65 43 6e 74 20 29 7b   needTableCnt ){
b740: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
b750: 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d  ((v, "%s", pTab-
b760: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
b770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b780: 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 54 61  v, OP_Count, iTa
b790: 62 43 75 72 2c 20 72 65 67 53 74 61 74 31 29 3b  bCur, regStat1);
b7a0: 0a 20 20 20 20 6a 5a 65 72 6f 52 6f 77 73 20 3d  .    jZeroRows =
b7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b7c0: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
b7d0: 72 65 67 53 74 61 74 31 29 3b 20 56 64 62 65 43  regStat1); VdbeC
b7e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b800: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
b810: 20 72 65 67 49 64 78 6e 61 6d 65 29 3b 0a 20 20   regIdxname);.  
b820: 20 20 61 73 73 65 72 74 28 20 22 42 42 42 22 5b    assert( "BBB"[
b830: 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  0]==SQLITE_AFF_T
b840: 45 58 54 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  EXT );.    sqlit
b850: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
b860: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
b870: 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c 20 72 65  egTabname, 3, re
b880: 67 54 65 6d 70 2c 20 22 42 42 42 22 2c 20 30 29  gTemp, "BBB", 0)
b890: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b8a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
b8b0: 77 52 6f 77 69 64 2c 20 69 53 74 61 74 43 75 72  wRowid, iStatCur
b8c0: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a  , regNewRowid);.
b8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b8e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b8f0: 72 74 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65  rt, iStatCur, re
b900: 67 54 65 6d 70 2c 20 72 65 67 4e 65 77 52 6f 77  gTemp, regNewRow
b910: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
b920: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b930: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b940: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b950: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
b960: 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OOK.    sqlite3V
b970: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
b980: 31 2c 20 28 63 68 61 72 2a 29 70 53 74 61 74 31  1, (char*)pStat1
b990: 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 23 65 6e  , P4_TABLE);.#en
b9a0: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
b9b0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
b9c0: 5a 65 72 6f 52 6f 77 73 29 3b 0a 20 20 7d 0a 7d  ZeroRows);.  }.}
b9d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
b9e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
b9f0: 20 63 61 75 73 65 20 74 68 65 20 6d 6f 73 74 20   cause the most 
ba00: 72 65 63 65 6e 74 20 69 6e 64 65 78 20 61 6e 61  recent index ana
ba10: 6c 79 73 69 73 20 74 6f 0a 2a 2a 20 62 65 20 6c  lysis to.** be l
ba20: 6f 61 64 65 64 20 69 6e 74 6f 20 69 6e 74 65 72  oaded into inter
ba30: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
ba40: 77 68 65 72 65 20 69 73 20 63 61 6e 20 62 65 20  where is can be 
ba50: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
ba60: 76 6f 69 64 20 6c 6f 61 64 41 6e 61 6c 79 73 69  void loadAnalysi
ba70: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
ba80: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
ba90: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
baa0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bab0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
bac0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bad0: 76 2c 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73  v, OP_LoadAnalys
bae0: 69 73 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a  is, iDb);.  }.}.
baf0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bb00: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 64  code that will d
bb10: 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66  o an analysis of
bb20: 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62   an entire datab
bb30: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ase.*/.static vo
bb40: 69 64 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61  id analyzeDataba
bb50: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
bb60: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
bb70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bb80: 73 65 2d 3e 64 62 3b 0a 20 20 53 63 68 65 6d 61  se->db;.  Schema
bb90: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
bba0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
bbb0: 3b 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ;    /* Schema o
bbc0: 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 2a  f database iDb *
bbd0: 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
bbe0: 0a 20 20 69 6e 74 20 69 53 74 61 74 43 75 72 3b  .  int iStatCur;
bbf0: 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
bc00: 6e 74 20 69 54 61 62 3b 0a 0a 20 20 73 71 6c 69  nt iTab;..  sqli
bc10: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
bc20: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
bc30: 2c 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43  , iDb);.  iStatC
bc40: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
bc50: 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  b;.  pParse->nTa
bc60: 62 20 2b 3d 20 33 3b 0a 20 20 6f 70 65 6e 53 74  b += 3;.  openSt
bc70: 61 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  atTable(pParse, 
bc80: 69 44 62 2c 20 69 53 74 61 74 43 75 72 2c 20 30  iDb, iStatCur, 0
bc90: 2c 20 30 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 70  , 0);.  iMem = p
bca0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
bcb0: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
bcc0: 6e 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20  nTab;.  assert( 
bcd0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
bce0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
bcf0: 30 29 20 29 3b 0a 20 20 66 6f 72 28 6b 3d 73 71  0) );.  for(k=sq
bd00: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
bd10: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
bd20: 3b 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73  ; k; k=sqliteHas
bd30: 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 54  hNext(k)){.    T
bd40: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61  able *pTab = (Ta
bd50: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
bd60: 61 74 61 28 6b 29 3b 0a 20 20 20 20 61 6e 61 6c  ata(k);.    anal
bd70: 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50 61 72  yzeOneTable(pPar
bd80: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 69 53 74  se, pTab, 0, iSt
bd90: 61 74 43 75 72 2c 20 69 4d 65 6d 2c 20 69 54 61  atCur, iMem, iTa
bda0: 62 29 3b 0a 20 20 7d 0a 20 20 6c 6f 61 64 41 6e  b);.  }.  loadAn
bdb0: 61 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69  alysis(pParse, i
bdc0: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Db);.}../*.** Ge
bdd0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
bde0: 20 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c   will do an anal
bdf0: 79 73 69 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ysis of a single
be00: 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 61 20 64   table in.** a d
be10: 61 74 61 62 61 73 65 2e 20 20 49 66 20 70 4f 6e  atabase.  If pOn
be20: 6c 79 49 64 78 20 69 73 20 6e 6f 74 20 4e 55 4c  lyIdx is not NUL
be30: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 73  L then it is a s
be40: 69 6e 67 6c 65 20 69 6e 64 65 78 0a 2a 2a 20 69  ingle index.** i
be50: 6e 20 70 54 61 62 20 74 68 61 74 20 73 68 6f 75  n pTab that shou
be60: 6c 64 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a  ld be analyzed..
be70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
be80: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 50 61 72 73  nalyzeTable(Pars
be90: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
bea0: 20 2a 70 54 61 62 2c 20 49 6e 64 65 78 20 2a 70   *pTab, Index *p
beb0: 4f 6e 6c 79 49 64 78 29 7b 0a 20 20 69 6e 74 20  OnlyIdx){.  int 
bec0: 69 44 62 3b 0a 20 20 69 6e 74 20 69 53 74 61 74  iDb;.  int iStat
bed0: 43 75 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Cur;..  assert( 
bee0: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
bef0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
bf00: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
bf10: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
bf20: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
bf30: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
bf40: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
bf50: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
bf60: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
bf70: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
bf80: 20 69 44 62 29 3b 0a 20 20 69 53 74 61 74 43 75   iDb);.  iStatCu
bf90: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
bfa0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
bfb0: 20 2b 3d 20 33 3b 0a 20 20 69 66 28 20 70 4f 6e   += 3;.  if( pOn
bfc0: 6c 79 49 64 78 20 29 7b 0a 20 20 20 20 6f 70 65  lyIdx ){.    ope
bfd0: 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72 73  nStatTable(pPars
bfe0: 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75 72  e, iDb, iStatCur
bff0: 2c 20 70 4f 6e 6c 79 49 64 78 2d 3e 7a 4e 61 6d  , pOnlyIdx->zNam
c000: 65 2c 20 22 69 64 78 22 29 3b 0a 20 20 7d 65 6c  e, "idx");.  }el
c010: 73 65 7b 0a 20 20 20 20 6f 70 65 6e 53 74 61 74  se{.    openStat
c020: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
c030: 62 2c 20 69 53 74 61 74 43 75 72 2c 20 70 54 61  b, iStatCur, pTa
c040: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 74 62 6c 22 29  b->zName, "tbl")
c050: 3b 0a 20 20 7d 0a 20 20 61 6e 61 6c 79 7a 65 4f  ;.  }.  analyzeO
c060: 6e 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  neTable(pParse, 
c070: 70 54 61 62 2c 20 70 4f 6e 6c 79 49 64 78 2c 20  pTab, pOnlyIdx, 
c080: 69 53 74 61 74 43 75 72 2c 70 50 61 72 73 65 2d  iStatCur,pParse-
c090: 3e 6e 4d 65 6d 2b 31 2c 70 50 61 72 73 65 2d 3e  >nMem+1,pParse->
c0a0: 6e 54 61 62 29 3b 0a 20 20 6c 6f 61 64 41 6e 61  nTab);.  loadAna
c0b0: 6c 79 73 69 73 28 70 50 61 72 73 65 2c 20 69 44  lysis(pParse, iD
c0c0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
c0d0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
c0e0: 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
c0f0: 6e 64 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  nd.  The parser 
c100: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
c110: 6e 65 0a 2a 2a 20 77 68 65 6e 20 69 74 20 72 65  ne.** when it re
c120: 63 6f 67 6e 69 7a 65 73 20 61 6e 20 41 4e 41 4c  cognizes an ANAL
c130: 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
c140: 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c 59 5a  **        ANALYZ
c150: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
c170: 31 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e 41 4c  1.**        ANAL
c180: 59 5a 45 20 20 3c 64 61 74 61 62 61 73 65 3e 20  YZE  <database> 
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
c1a0: 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 41 4e  - 2.**        AN
c1b0: 41 4c 59 5a 45 20 20 3f 3c 64 61 74 61 62 61 73  ALYZE  ?<databas
c1c0: 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
c1d0: 20 2d 2d 20 33 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 3.**.** Form
c1e0: 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
c1f0: 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
c200: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
c210: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 0a  to be analyzed..
c220: 2a 2a 20 46 6f 72 6d 20 32 20 61 6e 61 6c 79 7a  ** Form 2 analyz
c230: 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 74  es all indices t
c240: 68 65 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  he single databa
c250: 73 65 20 6e 61 6d 65 64 2e 0a 2a 2a 20 46 6f 72  se named..** For
c260: 6d 20 33 20 61 6e 61 6c 79 7a 65 73 20 61 6c 6c  m 3 analyzes all
c270: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
c280: 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
c290: 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  ed table..*/.voi
c2a0: 64 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65  d sqlite3Analyze
c2b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c2c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
c2d0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
c2e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c2f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
c300: 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   iDb;.  int i;. 
c310: 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 44 62 3b 0a   char *z, *zDb;.
c320: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
c330: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
c340: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
c350: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  e;.  Vdbe *v;.. 
c360: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
c370: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
c380: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c390: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
c3a0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
c3b0: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
c3c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
c3d0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
c3e0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
c3f0: 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73  AllMutexes(pPars
c400: 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 66 28 20  e->db) );.  if( 
c410: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
c420: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
c430: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
c440: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rn;.  }..  asser
c450: 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 7c 7c 20  t( pName2!=0 || 
c460: 70 4e 61 6d 65 31 3d 3d 30 20 29 3b 0a 20 20 69  pName1==0 );.  i
c470: 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
c480: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 31 3a 20 20      /* Form 1:  
c490: 41 6e 61 6c 79 7a 65 20 65 76 65 72 79 74 68 69  Analyze everythi
c4a0: 6e 67 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ng */.    for(i=
c4b0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
c4c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  +){.      if( i=
c4d0: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
c4e0: 2f 2a 20 44 6f 20 6e 6f 74 20 61 6e 61 6c 79 7a  /* Do not analyz
c4f0: 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
c500: 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 6e 61  ase */.      ana
c510: 6c 79 7a 65 44 61 74 61 62 61 73 65 28 70 50 61  lyzeDatabase(pPa
c520: 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
c530: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
c540: 32 2d 3e 6e 3d 3d 30 20 26 26 20 28 69 44 62 20  2->n==0 && (iDb 
c550: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
c560: 64 62 2c 20 70 4e 61 6d 65 31 29 29 3e 3d 30 20  db, pName1))>=0 
c570: 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 61 6c 79 7a  ){.    /* Analyz
c580: 65 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  e the schema nam
c590: 65 64 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  ed as the argume
c5a0: 6e 74 20 2a 2f 0a 20 20 20 20 61 6e 61 6c 79 7a  nt */.    analyz
c5b0: 65 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  eDatabase(pParse
c5c0: 2c 20 69 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iDb);.  }else{
c5d0: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20  .    /* Form 3: 
c5e0: 41 6e 61 6c 79 7a 65 20 74 68 65 20 74 61 62 6c  Analyze the tabl
c5f0: 65 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65 64  e or index named
c600: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
c610: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
c620: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
c630: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c640: 70 4e 61 6d 65 32 2c 20 26 70 54 61 62 6c 65 4e  pName2, &pTableN
c650: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
c660: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44  b>=0 ){.      zD
c670: 62 20 3d 20 70 4e 61 6d 65 32 2d 3e 6e 20 3f 20  b = pName2->n ? 
c680: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
c690: 53 4e 61 6d 65 20 3a 20 30 3b 0a 20 20 20 20 20  SName : 0;.     
c6a0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
c6b0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
c6c0: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ableName);.     
c6d0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
c6e0: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
c6f0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
c700: 62 2c 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29  b, z, zDb))!=0 )
c710: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c  {.          anal
c720: 79 7a 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  yzeTable(pParse,
c730: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70   pIdx->pTable, p
c740: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Idx);.        }e
c750: 6c 73 65 20 69 66 28 20 28 70 54 61 62 20 3d 20  lse if( (pTab = 
c760: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
c770: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c  le(pParse, 0, z,
c780: 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a 20 20 20   zDb))!=0 ){.   
c790: 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65 54 61         analyzeTa
c7a0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
c7b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
c7c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
c7d0: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
c7e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c7f0: 20 20 69 66 28 20 64 62 2d 3e 6e 53 71 6c 45 78    if( db->nSqlEx
c800: 65 63 3d 3d 30 20 26 26 20 28 76 20 3d 20 73 71  ec==0 && (v = sq
c810: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c820: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
c830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c840: 30 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b  0(v, OP_Expire);
c850: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
c860: 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ed to pass infor
c870: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
c880: 61 6e 61 6c 79 7a 65 72 20 72 65 61 64 65 72 20  analyzer reader 
c890: 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 0a 2a  through to the.*
c8a0: 2a 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  * callback routi
c8b0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
c8c0: 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73 49 6e  truct analysisIn
c8d0: 66 6f 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 3b  fo analysisInfo;
c8e0: 0a 73 74 72 75 63 74 20 61 6e 61 6c 79 73 69 73  .struct analysis
c8f0: 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33  Info {.  sqlite3
c900: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
c910: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 3b 0a 7d  ar *zDatabase;.}
c920: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  ;../*.** The fir
c930: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e  st argument poin
c940: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
c950: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
c960: 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 6c 69  ntaining a.** li
c970: 73 74 20 6f 66 20 73 70 61 63 65 20 73 65 70 61  st of space sepa
c980: 72 61 74 65 64 20 69 6e 74 65 67 65 72 73 2e 20  rated integers. 
c990: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 6e  Read the first n
c9a0: 4f 75 74 20 6f 66 20 74 68 65 73 65 20 69 6e 74  Out of these int
c9b0: 6f 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61  o.** the array a
c9c0: 4f 75 74 5b 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63  Out[]..*/.static
c9d0: 20 76 6f 69 64 20 64 65 63 6f 64 65 49 6e 74 41   void decodeIntA
c9e0: 72 72 61 79 28 0a 20 20 63 68 61 72 20 2a 7a 49  rray(.  char *zI
c9f0: 6e 74 41 72 72 61 79 2c 20 20 20 20 20 20 20 2f  ntArray,       /
ca00: 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * String contain
ca10: 69 6e 67 20 69 6e 74 20 61 72 72 61 79 20 74 6f  ing int array to
ca20: 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   decode */.  int
ca30: 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
ca40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ca50: 20 73 6c 6f 74 73 20 69 6e 20 61 4f 75 74 5b 5d   slots in aOut[]
ca60: 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61   */.  tRowcnt *a
ca70: 4f 75 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Out,         /* 
ca80: 53 74 6f 72 65 20 69 6e 74 65 67 65 72 73 20 68  Store integers h
ca90: 65 72 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ere */.  LogEst 
caa0: 2a 61 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20  *aLog,          
cab0: 2f 2a 20 4f 72 2c 20 69 66 20 61 4f 75 74 3d 3d  /* Or, if aOut==
cac0: 30 2c 20 68 65 72 65 20 2a 2f 0a 20 20 49 6e 64  0, here */.  Ind
cad0: 65 78 20 2a 70 49 6e 64 65 78 20 20 20 20 20 20  ex *pIndex      
cae0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 65 78      /* Handle ex
caf0: 74 72 61 20 66 6c 61 67 73 20 66 6f 72 20 74 68  tra flags for th
cb00: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
cb10: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 68   NULL */.){.  ch
cb20: 61 72 20 2a 7a 20 3d 20 7a 49 6e 74 41 72 72 61  ar *z = zIntArra
cb30: 79 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  y;.  int c;.  in
cb40: 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 76  t i;.  tRowcnt v
cb50: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
cb60: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
cb70: 5f 53 54 41 54 34 0a 20 20 69 66 28 20 7a 3d 3d  _STAT4.  if( z==
cb80: 30 20 29 20 7a 20 3d 20 22 22 3b 0a 23 65 6c 73  0 ) z = "";.#els
cb90: 65 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  e.  assert( z!=0
cba0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72   );.#endif.  for
cbb0: 28 69 3d 30 3b 20 2a 7a 20 26 26 20 69 3c 6e 4f  (i=0; *z && i<nO
cbc0: 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 76 20  ut; i++){.    v 
cbd0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
cbe0: 28 63 3d 7a 5b 30 5d 29 3e 3d 27 30 27 20 26 26  (c=z[0])>='0' &&
cbf0: 20 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20   c<='9' ){.     
cc00: 20 76 20 3d 20 76 2a 31 30 20 2b 20 63 20 2d 20   v = v*10 + c - 
cc10: 27 30 27 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  '0';.      z++;.
cc20: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
cc30: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
cc40: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 66  _OR_STAT4.    if
cc50: 28 20 61 4f 75 74 20 29 20 61 4f 75 74 5b 69 5d  ( aOut ) aOut[i]
cc60: 20 3d 20 76 3b 0a 20 20 20 20 69 66 28 20 61 4c   = v;.    if( aL
cc70: 6f 67 20 29 20 61 4c 6f 67 5b 69 5d 20 3d 20 73  og ) aLog[i] = s
cc80: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 76 29 3b  qlite3LogEst(v);
cc90: 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 65 72  .#else.    asser
cca0: 74 28 20 61 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  t( aOut==0 );.  
ccb0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
ccc0: 45 52 28 61 4f 75 74 29 3b 0a 20 20 20 20 61 73  ER(aOut);.    as
ccd0: 73 65 72 74 28 20 61 4c 6f 67 21 3d 30 20 29 3b  sert( aLog!=0 );
cce0: 0a 20 20 20 20 61 4c 6f 67 5b 69 5d 20 3d 20 73  .    aLog[i] = s
ccf0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 76 29 3b  qlite3LogEst(v);
cd00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
cd10: 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20  *z==' ' ) z++;. 
cd20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
cd30: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
cd40: 52 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72 74  R_STAT4.  assert
cd50: 28 20 70 49 6e 64 65 78 21 3d 30 20 29 3b 20 7b  ( pIndex!=0 ); {
cd60: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70 49 6e  .#else.  if( pIn
cd70: 64 65 78 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  dex ){.#endif.  
cd80: 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64    pIndex->bUnord
cd90: 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 49  ered = 0;.    pI
cda0: 6e 64 65 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e  ndex->noSkipScan
cdb0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
cdc0: 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69   z[0] ){.      i
cdd0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
cde0: 6f 62 28 22 75 6e 6f 72 64 65 72 65 64 2a 22 2c  ob("unordered*",
cdf0: 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   z)==0 ){.      
ce00: 20 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64    pIndex->bUnord
ce10: 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ered = 1;.      
ce20: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
ce30: 33 5f 73 74 72 67 6c 6f 62 28 22 73 7a 3d 5b 30  3_strglob("sz=[0
ce40: 2d 39 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a  -9]*", z)==0 ){.
ce50: 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
ce60: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
ce70: 65 33 4c 6f 67 45 73 74 28 73 71 6c 69 74 65 33  e3LogEst(sqlite3
ce80: 41 74 6f 69 28 7a 2b 33 29 29 3b 0a 20 20 20 20  Atoi(z+3));.    
ce90: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
cea0: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 73  te3_strglob("nos
ceb0: 6b 69 70 73 63 61 6e 2a 22 2c 20 7a 29 3d 3d 30  kipscan*", z)==0
cec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
ced0: 65 78 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 20 3d  ex->noSkipScan =
cee0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   1;.      }.#ifd
cef0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cf00: 5f 43 4f 53 54 4d 55 4c 54 0a 20 20 20 20 20 20  _COSTMULT.      
cf10: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
cf20: 5f 73 74 72 67 6c 6f 62 28 22 63 6f 73 74 6d 75  _strglob("costmu
cf30: 6c 74 3d 5b 30 2d 39 5d 2a 22 2c 7a 29 3d 3d 30  lt=[0-9]*",z)==0
cf40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
cf50: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74  ex->pTable->cost
cf60: 4d 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Mult = sqlite3Lo
cf70: 67 45 73 74 28 73 71 6c 69 74 65 33 41 74 6f 69  gEst(sqlite3Atoi
cf80: 28 7a 2b 39 29 29 3b 0a 20 20 20 20 20 20 7d 0a  (z+9));.      }.
cf90: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 69  #endif.      whi
cfa0: 6c 65 28 20 7a 5b 30 5d 21 3d 30 20 26 26 20 7a  le( z[0]!=0 && z
cfb0: 5b 30 5d 21 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a  [0]!=' ' ) z++;.
cfc0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30        while( z[0
cfd0: 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]==' ' ) z++;.  
cfe0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
cff0: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
d000: 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
d010: 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 77 68  or each index wh
d020: 65 6e 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a  en reading the.*
d030: 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  * sqlite_stat1 t
d040: 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 20  able.  .**.**   
d050: 20 20 61 72 67 76 5b 30 5d 20 3d 20 6e 61 6d 65    argv[0] = name
d060: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
d070: 20 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 6e       argv[1] = n
d080: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
d090: 20 28 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 29   (might be NULL)
d0a0: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32 5d 20  .**     argv[2] 
d0b0: 3d 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6e 61  = results of ana
d0c0: 6c 79 73 69 73 20 2d 20 6f 6e 20 69 6e 74 65 67  lysis - on integ
d0d0: 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  er for each colu
d0e0: 6d 6e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 69 65 73  mn.**.** Entries
d0f0: 20 66 6f 72 20 77 68 69 63 68 20 61 72 67 76 5b   for which argv[
d100: 31 5d 3d 3d 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  1]==NULL simply 
d110: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
d120: 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 2a 2a 20  r of rows in.** 
d130: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
d140: 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 73 69  atic int analysi
d150: 73 4c 6f 61 64 65 72 28 76 6f 69 64 20 2a 70 44  sLoader(void *pD
d160: 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20 63  ata, int argc, c
d170: 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72  har **argv, char
d180: 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 61   **NotUsed){.  a
d190: 6e 61 6c 79 73 69 73 49 6e 66 6f 20 2a 70 49 6e  nalysisInfo *pIn
d1a0: 66 6f 20 3d 20 28 61 6e 61 6c 79 73 69 73 49 6e  fo = (analysisIn
d1b0: 66 6f 2a 29 70 44 61 74 61 3b 0a 20 20 49 6e 64  fo*)pData;.  Ind
d1c0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 54 61  ex *pIndex;.  Ta
d1d0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63  ble *pTable;.  c
d1e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  onst char *z;.. 
d1f0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
d200: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
d210: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
d220: 20 61 72 67 63 29 3b 0a 0a 20 20 69 66 28 20 61   argc);..  if( a
d230: 72 67 76 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 30  rgv==0 || argv[0
d240: 5d 3d 3d 30 20 7c 7c 20 61 72 67 76 5b 32 5d 3d  ]==0 || argv[2]=
d250: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d260: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65   0;.  }.  pTable
d270: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
d280: 62 6c 65 28 70 49 6e 66 6f 2d 3e 64 62 2c 20 61  ble(pInfo->db, a
d290: 72 67 76 5b 30 5d 2c 20 70 49 6e 66 6f 2d 3e 7a  rgv[0], pInfo->z
d2a0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
d2b0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
d2c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d2d0: 20 20 69 66 28 20 61 72 67 76 5b 31 5d 3d 3d 30    if( argv[1]==0
d2e0: 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d   ){.    pIndex =
d2f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
d300: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
d310: 61 72 67 76 5b 30 5d 2c 61 72 67 76 5b 31 5d 29  argv[0],argv[1])
d320: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  ==0 ){.    pInde
d330: 78 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  x = sqlite3Prima
d340: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 6c  ryKeyIndex(pTabl
d350: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
d360: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
d370: 33 46 69 6e 64 49 6e 64 65 78 28 70 49 6e 66 6f  3FindIndex(pInfo
d380: 2d 3e 64 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70  ->db, argv[1], p
d390: 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61 73 65 29  Info->zDatabase)
d3a0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 61 72 67 76  ;.  }.  z = argv
d3b0: 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64  [2];..  if( pInd
d3c0: 65 78 20 29 7b 0a 20 20 20 20 74 52 6f 77 63 6e  ex ){.    tRowcn
d3d0: 74 20 2a 61 69 52 6f 77 45 73 74 20 3d 20 30 3b  t *aiRowEst = 0;
d3e0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  .    int nCol = 
d3f0: 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  pIndex->nKeyCol+
d400: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
d410: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
d420: 5f 53 54 41 54 34 0a 20 20 20 20 2f 2a 20 49 6e  _STAT4.    /* In
d430: 64 65 78 2e 61 69 52 6f 77 45 73 74 20 6d 61 79  dex.aiRowEst may
d440: 20 61 6c 72 65 61 64 79 20 62 65 20 73 65 74 20   already be set 
d450: 68 65 72 65 20 69 66 20 74 68 65 72 65 20 61 72  here if there ar
d460: 65 20 64 75 70 6c 69 63 61 74 65 20 0a 20 20 20  e duplicate .   
d470: 20 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 31   ** sqlite_stat1
d480: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 69   entries for thi
d490: 73 20 69 6e 64 65 78 2e 20 49 6e 20 74 68 61 74  s index. In that
d4a0: 20 63 61 73 65 20 6a 75 73 74 20 63 6c 6f 62 62   case just clobb
d4b0: 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c  er.    ** the ol
d4c0: 64 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  d data with the 
d4d0: 6e 65 77 20 69 6e 73 74 65 61 64 20 6f 66 20 61  new instead of a
d4e0: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
d4f0: 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 69  array.  */.    i
d500: 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  f( pIndex->aiRow
d510: 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Est==0 ){.      
d520: 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
d530: 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 73 71 6c   = (tRowcnt*)sql
d540: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
d550: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a  izeof(tRowcnt) *
d560: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66   nCol);.      if
d570: 28 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  ( pIndex->aiRowE
d580: 73 74 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4f  st==0 ) sqlite3O
d590: 6f 6d 46 61 75 6c 74 28 70 49 6e 66 6f 2d 3e 64  omFault(pInfo->d
d5a0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 69  b);.    }.    ai
d5b0: 52 6f 77 45 73 74 20 3d 20 70 49 6e 64 65 78 2d  RowEst = pIndex-
d5c0: 3e 61 69 52 6f 77 45 73 74 3b 0a 23 65 6e 64 69  >aiRowEst;.#endi
d5d0: 66 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 62 55  f.    pIndex->bU
d5e0: 6e 6f 72 64 65 72 65 64 20 3d 20 30 3b 0a 20 20  nordered = 0;.  
d5f0: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
d600: 28 28 63 68 61 72 2a 29 7a 2c 20 6e 43 6f 6c 2c  ((char*)z, nCol,
d610: 20 61 69 52 6f 77 45 73 74 2c 20 70 49 6e 64 65   aiRowEst, pInde
d620: 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 2c 20  x->aiRowLogEst, 
d630: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 49 6e  pIndex);.    pIn
d640: 64 65 78 2d 3e 68 61 73 53 74 61 74 31 20 3d 20  dex->hasStat1 = 
d650: 31 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  1;.    if( pInde
d660: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
d670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 61  ==0 ){.      pTa
d680: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  ble->nRowLogEst 
d690: 3d 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  = pIndex->aiRowL
d6a0: 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20  ogEst[0];.      
d6b0: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
d6c0: 20 7c 3d 20 54 46 5f 48 61 73 53 74 61 74 31 3b   |= TF_HasStat1;
d6d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
d6e0: 20 20 20 20 49 6e 64 65 78 20 66 61 6b 65 49 64      Index fakeId
d6f0: 78 3b 0a 20 20 20 20 66 61 6b 65 49 64 78 2e 73  x;.    fakeIdx.s
d700: 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 6c 65  zIdxRow = pTable
d710: 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 23 69 66 64  ->szTabRow;.#ifd
d720: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d730: 5f 43 4f 53 54 4d 55 4c 54 0a 20 20 20 20 66 61  _COSTMULT.    fa
d740: 6b 65 49 64 78 2e 70 54 61 62 6c 65 20 3d 20 70  keIdx.pTable = p
d750: 54 61 62 6c 65 3b 0a 23 65 6e 64 69 66 0a 20 20  Table;.#endif.  
d760: 20 20 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79    decodeIntArray
d770: 28 28 63 68 61 72 2a 29 7a 2c 20 31 2c 20 30 2c  ((char*)z, 1, 0,
d780: 20 26 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f   &pTable->nRowLo
d790: 67 45 73 74 2c 20 26 66 61 6b 65 49 64 78 29 3b  gEst, &fakeIdx);
d7a0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 73 7a 54  .    pTable->szT
d7b0: 61 62 52 6f 77 20 3d 20 66 61 6b 65 49 64 78 2e  abRow = fakeIdx.
d7c0: 73 7a 49 64 78 52 6f 77 3b 0a 20 20 20 20 70 54  szIdxRow;.    pT
d7d0: 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 7c  able->tabFlags |
d7e0: 3d 20 54 46 5f 48 61 73 53 74 61 74 31 3b 0a 20  = TF_HasStat1;. 
d7f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
d800: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
d810: 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 20 76 61  Index.aSample va
d820: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 4e 55  riable is not NU
d830: 4c 4c 2c 20 64 65 6c 65 74 65 20 74 68 65 20 61  LL, delete the a
d840: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 0a 2a  Sample[] array.*
d850: 2a 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  * and its conten
d860: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
d870: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
d880: 6d 70 6c 65 73 28 73 71 6c 69 74 65 33 20 2a 64  mples(sqlite3 *d
d890: 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  b, Index *pIdx){
d8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d8b0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
d8c0: 54 41 54 34 0a 20 20 69 66 28 20 70 49 64 78 2d  TAT4.  if( pIdx-
d8d0: 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >aSample ){.    
d8e0: 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a  int j;.    for(j
d8f0: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; j<pIdx->nSam
d900: 70 6c 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ple; j++){.     
d910: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70 20   IndexSample *p 
d920: 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65  = &pIdx->aSample
d930: 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [j];.      sqlit
d940: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d950: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
d960: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d970: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 29 3b 0a  pIdx->aSample);.
d980: 20 20 7d 0a 20 20 69 66 28 20 64 62 20 26 26 20    }.  if( db && 
d990: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
d9a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 2d  ==0 ){.    pIdx-
d9b0: 3e 6e 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20  >nSample = 0;.  
d9c0: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20    pIdx->aSample 
d9d0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  = 0;.  }.#else. 
d9e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d9f0: 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
da00: 50 41 52 41 4d 45 54 45 52 28 70 49 64 78 29 3b  PARAMETER(pIdx);
da10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
da20: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
da30: 52 5f 53 54 41 54 34 20 2a 2f 0a 7d 0a 0a 23 69  R_STAT4 */.}..#i
da40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
da50: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
da60: 34 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  4./*.** Populate
da70: 20 74 68 65 20 70 49 64 78 2d 3e 61 41 76 67 45   the pIdx->aAvgE
da80: 71 5b 5d 20 61 72 72 61 79 20 62 61 73 65 64 20  q[] array based 
da90: 6f 6e 20 74 68 65 20 73 61 6d 70 6c 65 73 20 63  on the samples c
daa0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f 72  urrently.** stor
dab0: 65 64 20 69 6e 20 70 49 64 78 2d 3e 61 53 61 6d  ed in pIdx->aSam
dac0: 70 6c 65 5b 5d 2e 20 0a 2a 2f 0a 73 74 61 74 69  ple[]. .*/.stati
dad0: 63 20 76 6f 69 64 20 69 6e 69 74 41 76 67 45 71  c void initAvgEq
dae0: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
daf0: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
db00: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
db10: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
db20: 61 6d 70 6c 65 3b 0a 20 20 20 20 49 6e 64 65 78  ample;.    Index
db30: 53 61 6d 70 6c 65 20 2a 70 46 69 6e 61 6c 20 3d  Sample *pFinal =
db40: 20 26 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d 3e   &aSample[pIdx->
db50: 6e 53 61 6d 70 6c 65 2d 31 5d 3b 0a 20 20 20 20  nSample-1];.    
db60: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 6e  int iCol;.    in
db70: 74 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  t nCol = 1;.    
db80: 69 66 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  if( pIdx->nSampl
db90: 65 43 6f 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  eCol>1 ){.      
dba0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 73 74  /* If this is st
dbb0: 61 74 34 20 64 61 74 61 2c 20 74 68 65 6e 20 63  at4 data, then c
dbc0: 61 6c 63 75 6c 61 74 65 20 61 41 76 67 45 71 5b  alculate aAvgEq[
dbd0: 5d 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  ] values for all
dbe0: 0a 20 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65  .      ** sample
dbf0: 20 63 6f 6c 75 6d 6e 73 20 65 78 63 65 70 74 20   columns except 
dc00: 74 68 65 20 6c 61 73 74 2e 20 54 68 65 20 6c 61  the last. The la
dc10: 73 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  st is always set
dc20: 20 74 6f 20 31 2c 20 61 73 0a 20 20 20 20 20 20   to 1, as.      
dc30: 2a 2a 20 6f 6e 63 65 20 74 68 65 20 74 72 61 69  ** once the trai
dc40: 6c 69 6e 67 20 50 4b 20 66 69 65 6c 64 73 20 61  ling PK fields a
dc50: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6c  re considered al
dc60: 6c 20 69 6e 64 65 78 20 6b 65 79 73 20 61 72 65  l index keys are
dc70: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65  .      ** unique
dc80: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6c  .  */.      nCol
dc90: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
dca0: 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 70 49 64  Col-1;.      pId
dcb0: 78 2d 3e 61 41 76 67 45 71 5b 6e 43 6f 6c 5d 20  x->aAvgEq[nCol] 
dcc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 1;.    }.    f
dcd0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
dce0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
dcf0: 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65       int nSample
dd00: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
dd10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  ;.      int i;  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
dd40: 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 61 6d  rate through sam
dd50: 70 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 74 52  ples */.      tR
dd60: 6f 77 63 6e 74 20 73 75 6d 45 71 20 3d 20 30 3b  owcnt sumEq = 0;
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 6d 20 6f          /* Sum o
dd80: 66 20 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73  f the nEq values
dd90: 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   */.      tRowcn
dda0: 74 20 61 76 67 45 71 20 3d 20 30 3b 0a 20 20 20  t avgEq = 0;.   
ddb0: 20 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 3b     tRowcnt nRow;
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddd0: 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
dde0: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  n index */.     
ddf0: 20 69 36 34 20 6e 53 75 6d 31 30 30 20 3d 20 30   i64 nSum100 = 0
de00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
de10: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 63 6f  mber of terms co
de20: 6e 74 72 69 62 75 74 69 6e 67 20 74 6f 20 73 75  ntributing to su
de30: 6d 45 71 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  mEq */.      i64
de40: 20 6e 44 69 73 74 31 30 30 3b 20 20 20 20 20 20   nDist100;      
de50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
de60: 20 6f 66 20 64 69 73 74 69 6e 63 74 20 76 61 6c   of distinct val
de70: 75 65 73 20 69 6e 20 69 6e 64 65 78 20 2a 2f 0a  ues in index */.
de80: 0a 20 20 20 20 20 20 69 66 28 20 21 70 49 64 78  .      if( !pIdx
de90: 2d 3e 61 69 52 6f 77 45 73 74 20 7c 7c 20 69 43  ->aiRowEst || iC
dea0: 6f 6c 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ol>=pIdx->nKeyCo
deb0: 6c 20 7c 7c 20 70 49 64 78 2d 3e 61 69 52 6f 77  l || pIdx->aiRow
dec0: 45 73 74 5b 69 43 6f 6c 2b 31 5d 3d 3d 30 20 29  Est[iCol+1]==0 )
ded0: 7b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 3d  {.        nRow =
dee0: 20 70 46 69 6e 61 6c 2d 3e 61 6e 4c 74 5b 69 43   pFinal->anLt[iC
def0: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 6e 44 69  ol];.        nDi
df00: 73 74 31 30 30 20 3d 20 28 69 36 34 29 31 30 30  st100 = (i64)100
df10: 20 2a 20 70 46 69 6e 61 6c 2d 3e 61 6e 44 4c 74   * pFinal->anDLt
df20: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
df30: 6e 53 61 6d 70 6c 65 2d 2d 3b 0a 20 20 20 20 20  nSample--;.     
df40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
df50: 6e 52 6f 77 20 3d 20 70 49 64 78 2d 3e 61 69 52  nRow = pIdx->aiR
df60: 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 20 20  owEst[0];.      
df70: 20 20 6e 44 69 73 74 31 30 30 20 3d 20 28 28 69    nDist100 = ((i
df80: 36 34 29 31 30 30 20 2a 20 70 49 64 78 2d 3e 61  64)100 * pIdx->a
df90: 69 52 6f 77 45 73 74 5b 30 5d 29 20 2f 20 70 49  iRowEst[0]) / pI
dfa0: 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 69 43 6f  dx->aiRowEst[iCo
dfb0: 6c 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l+1];.      }.  
dfc0: 20 20 20 20 70 49 64 78 2d 3e 6e 52 6f 77 45 73      pIdx->nRowEs
dfd0: 74 30 20 3d 20 6e 52 6f 77 3b 0a 0a 20 20 20 20  t0 = nRow;..    
dfe0: 20 20 2f 2a 20 53 65 74 20 6e 53 75 6d 20 74 6f    /* Set nSum to
dff0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
e000: 69 73 74 69 6e 63 74 20 28 69 43 6f 6c 2b 31 29  istinct (iCol+1)
e010: 20 66 69 65 6c 64 20 70 72 65 66 69 78 65 73 20   field prefixes 
e020: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6f 63  that.      ** oc
e030: 63 75 72 20 69 6e 20 74 68 65 20 73 74 61 74 34  cur in the stat4
e040: 20 74 61 62 6c 65 20 66 6f 72 20 74 68 69 73 20   table for this 
e050: 69 6e 64 65 78 2e 20 53 65 74 20 73 75 6d 45 71  index. Set sumEq
e060: 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 0a   to the sum of .
e070: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 45 71        ** the nEq
e080: 20 76 61 6c 75 65 73 20 66 6f 72 20 63 6f 6c 75   values for colu
e090: 6d 6e 20 69 43 6f 6c 20 66 6f 72 20 74 68 65 20  mn iCol for the 
e0a0: 73 61 6d 65 20 73 65 74 20 28 61 64 64 69 6e 67  same set (adding
e0b0: 20 74 68 65 20 76 61 6c 75 65 20 0a 20 20 20 20   the value .    
e0c0: 20 20 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 77    ** only once w
e0d0: 68 65 72 65 20 74 68 65 72 65 20 65 78 69 73 74  here there exist
e0e0: 20 64 75 70 6c 69 63 61 74 65 20 70 72 65 66 69   duplicate prefi
e0f0: 78 65 73 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  xes).  */.      
e100: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61 6d 70  for(i=0; i<nSamp
e110: 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
e120: 20 20 69 66 28 20 69 3d 3d 28 70 49 64 78 2d 3e    if( i==(pIdx->
e130: 6e 53 61 6d 70 6c 65 2d 31 29 0a 20 20 20 20 20  nSample-1).     
e140: 20 20 20 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69      || aSample[i
e150: 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 21 3d 61  ].anDLt[iCol]!=a
e160: 53 61 6d 70 6c 65 5b 69 2b 31 5d 2e 61 6e 44 4c  Sample[i+1].anDL
e170: 74 5b 69 43 6f 6c 5d 20 0a 20 20 20 20 20 20 20  t[iCol] .       
e180: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 75   ){.          su
e190: 6d 45 71 20 2b 3d 20 61 53 61 6d 70 6c 65 5b 69  mEq += aSample[i
e1a0: 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anEq[iCol];.  
e1b0: 20 20 20 20 20 20 20 20 6e 53 75 6d 31 30 30 20          nSum100 
e1c0: 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20  += 100;.        
e1d0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e1e0: 20 69 66 28 20 6e 44 69 73 74 31 30 30 3e 6e 53   if( nDist100>nS
e1f0: 75 6d 31 30 30 20 26 26 20 73 75 6d 45 71 3c 6e  um100 && sumEq<n
e200: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Row ){.        a
e210: 76 67 45 71 20 3d 20 28 28 69 36 34 29 31 30 30  vgEq = ((i64)100
e220: 20 2a 20 28 6e 52 6f 77 20 2d 20 73 75 6d 45 71   * (nRow - sumEq
e230: 29 29 2f 28 6e 44 69 73 74 31 30 30 20 2d 20 6e  ))/(nDist100 - n
e240: 53 75 6d 31 30 30 29 3b 0a 20 20 20 20 20 20 7d  Sum100);.      }
e250: 0a 20 20 20 20 20 20 69 66 28 20 61 76 67 45 71  .      if( avgEq
e260: 3d 3d 30 20 29 20 61 76 67 45 71 20 3d 20 31 3b  ==0 ) avgEq = 1;
e270: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 41 76  .      pIdx->aAv
e280: 67 45 71 5b 69 43 6f 6c 5d 20 3d 20 61 76 67 45  gEq[iCol] = avgE
e290: 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  q;.    }.  }.}..
e2a0: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20 61 6e  /*.** Look up an
e2b0: 20 69 6e 64 65 78 20 62 79 20 6e 61 6d 65 2e 20   index by name. 
e2c0: 20 4f 72 2c 20 69 66 20 74 68 65 20 6e 61 6d 65   Or, if the name
e2d0: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
e2e0: 57 49 44 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  WID table.** is 
e2f0: 73 75 70 70 6c 69 65 64 20 69 6e 73 74 65 61 64  supplied instead
e300: 2c 20 66 69 6e 64 20 74 68 65 20 50 52 49 4d 41  , find the PRIMA
e310: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
e320: 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a   that table..*/.
e330: 73 74 61 74 69 63 20 49 6e 64 65 78 20 2a 66 69  static Index *fi
e340: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
e350: 4b 65 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  Key(.  sqlite3 *
e360: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e370: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 63 6f 6e 73 74   *zName,.  const
e380: 20 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20   char *zDb.){.  
e390: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
e3a0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
e3b0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
e3c0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
e3d0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e3e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
e3f0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  ble(db, zName, z
e400: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
e410: 62 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70  b && !HasRowid(p
e420: 54 61 62 29 20 29 20 70 49 64 78 20 3d 20 73 71  Tab) ) pIdx = sq
e430: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e440: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a  ndex(pTab);.  }.
e450: 20 20 72 65 74 75 72 6e 20 70 49 64 78 3b 0a 7d    return pIdx;.}
e460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
e470: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 65 69   content from ei
e480: 74 68 65 72 20 74 68 65 20 73 71 6c 69 74 65 5f  ther the sqlite_
e490: 73 74 61 74 34 20 6f 72 20 73 71 6c 69 74 65 5f  stat4 or sqlite_
e4a0: 73 74 61 74 33 20 74 61 62 6c 65 20 0a 2a 2a 20  stat3 table .** 
e4b0: 69 6e 74 6f 20 74 68 65 20 72 65 6c 65 76 61 6e  into the relevan
e4c0: 74 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b  t Index.aSample[
e4d0: 5d 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20  ] arrays..**.** 
e4e0: 41 72 67 75 6d 65 6e 74 73 20 7a 53 71 6c 31 20  Arguments zSql1 
e4f0: 61 6e 64 20 7a 53 71 6c 32 20 6d 75 73 74 20 70  and zSql2 must p
e500: 6f 69 6e 74 20 74 6f 20 53 51 4c 20 73 74 61 74  oint to SQL stat
e510: 65 6d 65 6e 74 73 20 74 68 61 74 20 72 65 74 75  ements that retu
e520: 72 6e 0a 2a 2a 20 64 61 74 61 20 65 71 75 69 76  rn.** data equiv
e530: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c  alent to the fol
e540: 6c 6f 77 69 6e 67 20 28 73 74 61 74 65 6d 65 6e  lowing (statemen
e550: 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
e560: 20 66 6f 72 20 73 74 61 74 33 2c 0a 2a 2a 20 73   for stat3,.** s
e570: 65 65 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  ee the caller of
e580: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
e590: 6f 72 20 64 65 74 61 69 6c 73 29 3a 0a 2a 2a 0a  or details):.**.
e5a0: 2a 2a 20 20 20 20 7a 53 71 6c 31 3a 20 53 45 4c  **    zSql1: SEL
e5b0: 45 43 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29  ECT idx,count(*)
e5c0: 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
e5d0: 73 74 61 74 34 20 47 52 4f 55 50 20 42 59 20 69  stat4 GROUP BY i
e5e0: 64 78 0a 2a 2a 20 20 20 20 7a 53 71 6c 32 3a 20  dx.**    zSql2: 
e5f0: 53 45 4c 45 43 54 20 69 64 78 2c 6e 65 71 2c 6e  SELECT idx,neq,n
e600: 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c 65 20 46  lt,ndlt,sample F
e610: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
e620: 61 74 34 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  at4.**.** where 
e630: 25 51 20 69 73 20 72 65 70 6c 61 63 65 64 20 77  %Q is replaced w
e640: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
e650: 20 6e 61 6d 65 20 62 65 66 6f 72 65 20 74 68 65   name before the
e660: 20 53 51 4c 20 69 73 20 65 78 65 63 75 74 65 64   SQL is executed
e670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e680: 6c 6f 61 64 53 74 61 74 54 62 6c 28 0a 20 20 73  loadStatTbl(.  s
e690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6b0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
e6c0: 2a 2f 0a 20 20 69 6e 74 20 62 53 74 61 74 33 2c  */.  int bStat3,
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 73 69 6e     /* Assume sin
e6f0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 63 6f 72  gle column recor
e700: 64 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 63 6f 6e  ds only */.  con
e710: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 2c 20  st char *zSql1, 
e720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
e730: 4c 20 73 74 61 74 65 6d 65 6e 74 20 31 20 28 73  L statement 1 (s
e740: 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20 63  ee above) */.  c
e750: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32  onst char *zSql2
e760: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e770: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 32 20  SQL statement 2 
e780: 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20  (see above) */. 
e790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e7b0: 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
e7c0: 28 65 2e 67 2e 20 22 6d 61 69 6e 22 29 20 2a 2f  (e.g. "main") */
e7d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
e800: 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  des from subrout
e810: 69 6e 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ines */.  sqlite
e820: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
e830: 30 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 53 51  0;      /* An SQ
e840: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  L statement bein
e850: 67 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20  g run */.  char 
e860: 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
e870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
e880: 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
e890: 65 6d 65 6e 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ement */.  Index
e8a0: 20 2a 70 50 72 65 76 49 64 78 20 3d 20 30 3b 20   *pPrevIdx = 0; 
e8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
e8c0: 69 6f 75 73 20 69 6e 64 65 78 20 69 6e 20 74 68  ious index in th
e8d0: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 49 6e 64 65  e loop */.  Inde
e8e0: 78 53 61 6d 70 6c 65 20 2a 70 53 61 6d 70 6c 65  xSample *pSample
e8f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  ;         /* A s
e900: 6c 6f 74 20 69 6e 20 70 49 64 78 2d 3e 61 53 61  lot in pIdx->aSa
e910: 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  mple[] */..  ass
e920: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
e930: 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
e940: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d   zSql = sqlite3M
e950: 50 72 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 31  Printf(db, zSql1
e960: 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 21 7a  , zDb);.  if( !z
e970: 53 71 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Sql ){.    retur
e980: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
e990: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
e9a0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
e9b0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
e9c0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
e9d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
e9e0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
e9f0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
ea00: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
ea10: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
ea20: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
ea30: 6e 49 64 78 43 6f 6c 20 3d 20 31 3b 20 20 20 20  nIdxCol = 1;    
ea40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ea50: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
ea60: 6e 20 73 74 61 74 34 20 72 65 63 6f 72 64 73 20  n stat4 records 
ea70: 2a 2f 0a 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  */..    char *zI
ea80: 6e 64 65 78 3b 20 20 20 2f 2a 20 49 6e 64 65 78  ndex;   /* Index
ea90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 49 6e 64   name */.    Ind
eaa0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 2f 2a 20  ex *pIdx;    /* 
eab0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69  Pointer to the i
eac0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
ead0: 20 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 20     int nSample; 
eae0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
eaf0: 73 61 6d 70 6c 65 73 20 2a 2f 0a 20 20 20 20 69  samples */.    i
eb00: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 2f  nt nByte;      /
eb10: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
eb20: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
eb30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
eb40: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
eb50: 63 65 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  ce required */. 
eb60: 20 20 20 74 52 6f 77 63 6e 74 20 2a 70 53 70 61     tRowcnt *pSpa
eb70: 63 65 3b 0a 0a 20 20 20 20 7a 49 6e 64 65 78 20  ce;..    zIndex 
eb80: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
eb90: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
eba0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
ebb0: 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f 6e   zIndex==0 ) con
ebc0: 74 69 6e 75 65 3b 0a 20 20 20 20 6e 53 61 6d 70  tinue;.    nSamp
ebd0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  le = sqlite3_col
ebe0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  umn_int(pStmt, 1
ebf0: 29 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 66 69  );.    pIdx = fi
ec00: 6e 64 49 6e 64 65 78 4f 72 50 72 69 6d 61 72 79  ndIndexOrPrimary
ec10: 4b 65 79 28 64 62 2c 20 7a 49 6e 64 65 78 2c 20  Key(db, zIndex, 
ec20: 7a 44 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74  zDb);.    assert
ec30: 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 62 53 74  ( pIdx==0 || bSt
ec40: 61 74 33 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61  at3 || pIdx->nSa
ec50: 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  mple==0 );.    /
ec60: 2a 20 49 6e 64 65 78 2e 6e 53 61 6d 70 6c 65 20  * Index.nSample 
ec70: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 74 20 74  is non-zero at t
ec80: 68 69 73 20 70 6f 69 6e 74 20 69 66 20 64 61 74  his point if dat
ec90: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
eca0: 65 6e 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 65 64  en.    ** loaded
ecb0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 34 20   from the stat4 
ecc0: 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63  table. In this c
ecd0: 61 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33  ase ignore stat3
ece0: 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 69   data.  */.    i
ecf0: 66 28 20 70 49 64 78 3d 3d 30 20 7c 7c 20 70 49  f( pIdx==0 || pI
ed00: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 20 63 6f  dx->nSample ) co
ed10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
ed20: 62 53 74 61 74 33 3d 3d 30 20 29 7b 0a 20 20 20  bStat3==0 ){.   
ed30: 20 20 20 61 73 73 65 72 74 28 20 21 48 61 73 52     assert( !HasR
ed40: 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
ed50: 65 29 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c  e) || pIdx->nCol
ed60: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn==pIdx->nKeyC
ed70: 6f 6c 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ol+1 );.      if
ed80: 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 64 78  ( !HasRowid(pIdx
ed90: 2d 3e 70 54 61 62 6c 65 29 20 26 26 20 49 73 50  ->pTable) && IsP
eda0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
edb0: 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
edc0: 6e 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nIdxCol = pIdx->
edd0: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 7d  nKeyCol;.      }
ede0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 49  else{.        nI
edf0: 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43  dxCol = pIdx->nC
ee00: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  olumn;.      }. 
ee10: 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e 6e     }.    pIdx->n
ee20: 53 61 6d 70 6c 65 43 6f 6c 20 3d 20 6e 49 64 78  SampleCol = nIdx
ee30: 43 6f 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  Col;.    nByte =
ee40: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 53 61 6d   sizeof(IndexSam
ee50: 70 6c 65 29 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a  ple) * nSample;.
ee60: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a      nByte += siz
ee70: 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a 20 6e  eof(tRowcnt) * n
ee80: 49 64 78 43 6f 6c 20 2a 20 33 20 2a 20 6e 53 61  IdxCol * 3 * nSa
ee90: 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79 74 65 20  mple;.    nByte 
eea0: 2b 3d 20 6e 49 64 78 43 6f 6c 20 2a 20 73 69 7a  += nIdxCol * siz
eeb0: 65 6f 66 28 74 52 6f 77 63 6e 74 29 3b 20 20 20  eof(tRowcnt);   
eec0: 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 49    /* Space for I
eed0: 6e 64 65 78 2e 61 41 76 67 45 71 5b 5d 20 2a 2f  ndex.aAvgEq[] */
eee0: 0a 0a 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d  ..    pIdx->aSam
eef0: 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ple = sqlite3DbM
ef00: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
ef10: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49  yte);.    if( pI
ef20: 64 78 2d 3e 61 53 61 6d 70 6c 65 3d 3d 30 20 29  dx->aSample==0 )
ef30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ef40: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
ef50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ef60: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
ef70: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 70 61 63  .    }.    pSpac
ef80: 65 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 70  e = (tRowcnt*)&p
ef90: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 6e 53 61  Idx->aSample[nSa
efa0: 6d 70 6c 65 5d 3b 0a 20 20 20 20 70 49 64 78 2d  mple];.    pIdx-
efb0: 3e 61 41 76 67 45 71 20 3d 20 70 53 70 61 63 65  >aAvgEq = pSpace
efc0: 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78  ; pSpace += nIdx
efd0: 43 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Col;.    for(i=0
efe0: 3b 20 69 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b  ; i<nSample; i++
eff0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  ){.      pIdx->a
f000: 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 20 3d  Sample[i].anEq =
f010: 20 70 53 70 61 63 65 3b 20 70 53 70 61 63 65 20   pSpace; pSpace 
f020: 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20 20 20  += nIdxCol;.    
f030: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b    pIdx->aSample[
f040: 69 5d 2e 61 6e 4c 74 20 3d 20 70 53 70 61 63 65  i].anLt = pSpace
f050: 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78  ; pSpace += nIdx
f060: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  Col;.      pIdx-
f070: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c  >aSample[i].anDL
f080: 74 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61  t = pSpace; pSpa
f090: 63 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20  ce += nIdxCol;. 
f0a0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
f0b0: 20 28 28 75 38 2a 29 70 53 70 61 63 65 29 2d 6e   ((u8*)pSpace)-n
f0c0: 42 79 74 65 3d 3d 28 75 38 2a 29 28 70 49 64 78  Byte==(u8*)(pIdx
f0d0: 2d 3e 61 53 61 6d 70 6c 65 29 20 29 3b 0a 20 20  ->aSample) );.  
f0e0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f0f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
f100: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
f110: 75 72 6e 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  urn rc;..  zSql 
f120: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f130: 28 64 62 2c 20 7a 53 71 6c 32 2c 20 7a 44 62 29  (db, zSql2, zDb)
f140: 3b 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b  ;.  if( !zSql ){
f150: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f160: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f170: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f180: 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
f190: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
f1a0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  0);.  sqlite3DbF
f1b0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
f1c0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
f1d0: 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73   rc;..  while( s
f1e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
f1f0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
f200: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  {.    char *zInd
f210: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
f220: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d      /* Index nam
f230: 65 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  e */.    Index *
f240: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
f250: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
f260: 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  r to the index o
f270: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74  bject */.    int
f280: 20 6e 43 6f 6c 20 3d 20 31 3b 20 20 20 20 20 20   nCol = 1;      
f290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f2a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f2b0: 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20  in index */..   
f2c0: 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72 20   zIndex = (char 
f2d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
f2e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
f2f0: 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78 3d  .    if( zIndex=
f300: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
f310: 20 20 20 70 49 64 78 20 3d 20 66 69 6e 64 49 6e     pIdx = findIn
f320: 64 65 78 4f 72 50 72 69 6d 61 72 79 4b 65 79 28  dexOrPrimaryKey(
f330: 64 62 2c 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29  db, zIndex, zDb)
f340: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d  ;.    if( pIdx==
f350: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
f360: 20 20 2f 2a 20 54 68 69 73 20 6e 65 78 74 20 63    /* This next c
f370: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
f380: 20 69 66 20 64 61 74 61 20 68 61 73 20 61 6c 72   if data has alr
f390: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
f3a0: 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68   from .    ** th
f3b0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 74  e sqlite_stat4 t
f3c0: 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  able. In this ca
f3d0: 73 65 20 69 67 6e 6f 72 65 20 73 74 61 74 33 20  se ignore stat3 
f3e0: 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 6e 43  data.  */.    nC
f3f0: 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ol = pIdx->nSamp
f400: 6c 65 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 62  leCol;.    if( b
f410: 53 74 61 74 33 20 26 26 20 6e 43 6f 6c 3e 31 20  Stat3 && nCol>1 
f420: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f430: 69 66 28 20 70 49 64 78 21 3d 70 50 72 65 76 49  if( pIdx!=pPrevI
f440: 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 69 74  dx ){.      init
f450: 41 76 67 45 71 28 70 50 72 65 76 49 64 78 29 3b  AvgEq(pPrevIdx);
f460: 0a 20 20 20 20 20 20 70 50 72 65 76 49 64 78 20  .      pPrevIdx 
f470: 3d 20 70 49 64 78 3b 0a 20 20 20 20 7d 0a 20 20  = pIdx;.    }.  
f480: 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 49 64    pSample = &pId
f490: 78 2d 3e 61 53 61 6d 70 6c 65 5b 70 49 64 78 2d  x->aSample[pIdx-
f4a0: 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 64  >nSample];.    d
f4b0: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
f4c0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
f4d0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 31  umn_text(pStmt,1
f4e0: 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e  ),nCol,pSample->
f4f0: 61 6e 45 71 2c 30 2c 30 29 3b 0a 20 20 20 20 64  anEq,0,0);.    d
f500: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
f510: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
f520: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
f530: 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e  ),nCol,pSample->
f540: 61 6e 4c 74 2c 30 2c 30 29 3b 0a 20 20 20 20 64  anLt,0,0);.    d
f550: 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63  ecodeIntArray((c
f560: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
f570: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 33  umn_text(pStmt,3
f580: 29 2c 6e 43 6f 6c 2c 70 53 61 6d 70 6c 65 2d 3e  ),nCol,pSample->
f590: 61 6e 44 4c 74 2c 30 2c 30 29 3b 0a 0a 20 20 20  anDLt,0,0);..   
f5a0: 20 2f 2a 20 54 61 6b 65 20 61 20 63 6f 70 79 20   /* Take a copy 
f5b0: 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 2e 20 41  of the sample. A
f5c0: 64 64 20 74 77 6f 20 30 78 30 30 20 62 79 74 65  dd two 0x00 byte
f5d0: 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  s the end of the
f5e0: 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2a 20   buffer..    ** 
f5f0: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
f600: 74 68 65 20 73 61 6d 70 6c 65 20 72 65 63 6f 72  the sample recor
f610: 64 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  d is corrupted. 
f620: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
f630: 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
f640: 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
f650: 65 28 29 20 6d 61 79 20 72 65 61 64 20 75 70 20  e() may read up 
f660: 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
f670: 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  ast the.    ** e
f680: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
f690: 74 65 64 20 62 75 66 66 65 72 20 62 65 66 6f 72  ted buffer befor
f6a0: 65 20 69 74 20 72 65 61 6c 69 7a 65 73 20 69 74  e it realizes it
f6b0: 20 69 73 20 64 65 61 6c 69 6e 67 20 77 69 74 68   is dealing with
f6c0: 0a 20 20 20 20 2a 2a 20 61 20 63 6f 72 72 75 70  .    ** a corrup
f6d0: 74 20 72 65 63 6f 72 64 2e 20 41 64 64 69 6e 67  t record. Adding
f6e0: 20 74 68 65 20 74 77 6f 20 30 78 30 30 20 62 79   the two 0x00 by
f6f0: 74 65 73 20 70 72 65 76 65 6e 74 73 20 74 68 69  tes prevents thi
f700: 73 20 66 72 6f 6d 20 63 61 75 73 69 6e 67 0a 20  s from causing. 
f710: 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
f720: 76 65 72 72 65 61 64 2e 20 20 2a 2f 0a 20 20 20  verread.  */.   
f730: 20 70 53 61 6d 70 6c 65 2d 3e 6e 20 3d 20 73 71   pSample->n = sq
f740: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
f750: 65 73 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20  es(pStmt, 4);.  
f760: 20 20 70 53 61 6d 70 6c 65 2d 3e 70 20 3d 20 73    pSample->p = s
f770: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f780: 72 6f 28 64 62 2c 20 70 53 61 6d 70 6c 65 2d 3e  ro(db, pSample->
f790: 6e 20 2b 20 32 29 3b 0a 20 20 20 20 69 66 28 20  n + 2);.    if( 
f7a0: 70 53 61 6d 70 6c 65 2d 3e 70 3d 3d 30 20 29 7b  pSample->p==0 ){
f7b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
f7c0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
f7d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f7e0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
f7f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
f800: 61 6d 70 6c 65 2d 3e 6e 20 29 7b 0a 20 20 20 20  ample->n ){.    
f810: 20 20 6d 65 6d 63 70 79 28 70 53 61 6d 70 6c 65    memcpy(pSample
f820: 2d 3e 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ->p, sqlite3_col
f830: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
f840: 34 29 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 29 3b  4), pSample->n);
f850: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d  .    }.    pIdx-
f860: 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 20 20 7d 0a  >nSample++;.  }.
f870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
f880: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
f890: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f8a0: 5f 4f 4b 20 29 20 69 6e 69 74 41 76 67 45 71 28  _OK ) initAvgEq(
f8b0: 70 50 72 65 76 49 64 78 29 3b 0a 20 20 72 65 74  pPrevIdx);.  ret
f8c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f8d0: 20 4c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72   Load content fr
f8e0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
f8f0: 61 74 34 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  at4 and sqlite_s
f900: 74 61 74 33 20 74 61 62 6c 65 73 20 69 6e 74 6f  tat3 tables into
f910: 20 0a 2a 2a 20 74 68 65 20 49 6e 64 65 78 2e 61   .** the Index.a
f920: 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 73 20  Sample[] arrays 
f930: 6f 66 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a  of all indices..
f940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
f950: 61 64 53 74 61 74 34 28 73 71 6c 69 74 65 33 20  adStat4(sqlite3 
f960: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
f970: 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20  *zDb){.  int rc 
f980: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
f990: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
f9a0: 6c 74 20 63 6f 64 65 73 20 66 72 6f 6d 20 73 75  lt codes from su
f9b0: 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 0a 20 20  broutines */..  
f9c0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
f9d0: 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29  aside.bDisable )
f9e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
f9f0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
fa00: 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 7a 44 62  lite_stat4", zDb
fa10: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  ) ){.    rc = lo
fa20: 61 64 53 74 61 74 54 62 6c 28 64 62 2c 20 30 2c  adStatTbl(db, 0,
fa30: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
fa40: 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  dx,count(*) FROM
fa50: 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34   %Q.sqlite_stat4
fa60: 20 47 52 4f 55 50 20 42 59 20 69 64 78 22 2c 20   GROUP BY idx", 
fa70: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  .      "SELECT i
fa80: 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c  dx,neq,nlt,ndlt,
fa90: 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e 73  sample FROM %Q.s
faa0: 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a 20 20  qlite_stat4",.  
fab0: 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20      zDb.    );. 
fac0: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
fad0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
fae0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
faf0: 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20  "sqlite_stat3", 
fb00: 7a 44 62 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  zDb) ){.    rc =
fb10: 20 6c 6f 61 64 53 74 61 74 54 62 6c 28 64 62 2c   loadStatTbl(db,
fb20: 20 31 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43   1,.      "SELEC
fb30: 54 20 69 64 78 2c 63 6f 75 6e 74 28 2a 29 20 46  T idx,count(*) F
fb40: 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
fb50: 61 74 33 20 47 52 4f 55 50 20 42 59 20 69 64 78  at3 GROUP BY idx
fb60: 22 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  ", .      "SELEC
fb70: 54 20 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64  T idx,neq,nlt,nd
fb80: 6c 74 2c 73 71 6c 69 74 65 5f 72 65 63 6f 72 64  lt,sqlite_record
fb90: 28 73 61 6d 70 6c 65 29 20 46 52 4f 4d 20 25 51  (sample) FROM %Q
fba0: 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a  .sqlite_stat3",.
fbb0: 20 20 20 20 20 20 7a 44 62 0a 20 20 20 20 29 3b        zDb.    );
fbc0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
fbd0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
fbe0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
fbf0: 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
fc00: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 63  /*.** Load the c
fc10: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73 71  ontent of the sq
fc20: 6c 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73  lite_stat1 and s
fc30: 71 6c 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61  qlite_stat3/4 ta
fc40: 62 6c 65 73 2e 20 54 68 65 0a 2a 2a 20 63 6f 6e  bles. The.** con
fc50: 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74 65 5f  tents of sqlite_
fc60: 73 74 61 74 31 20 61 72 65 20 75 73 65 64 20 74  stat1 are used t
fc70: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 49  o populate the I
fc80: 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 0a  ndex.aiRowEst[].
fc90: 2a 2a 20 61 72 72 61 79 73 2e 20 54 68 65 20 63  ** arrays. The c
fca0: 6f 6e 74 65 6e 74 73 20 6f 66 20 73 71 6c 69 74  ontents of sqlit
fcb0: 65 5f 73 74 61 74 33 2f 34 20 61 72 65 20 75 73  e_stat3/4 are us
fcc0: 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ed to populate t
fcd0: 68 65 0a 2a 2a 20 49 6e 64 65 78 2e 61 53 61 6d  he.** Index.aSam
fce0: 70 6c 65 5b 5d 20 61 72 72 61 79 73 2e 0a 2a 2a  ple[] arrays..**
fcf0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74  .** If the sqlit
fd00: 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 69 73  e_stat1 table is
fd10: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
fd20: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51  the database, SQ
fd30: 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 73  LITE_ERROR.** is
fd40: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
fd50: 69 73 20 63 61 73 65 2c 20 65 76 65 6e 20 69 66  is case, even if
fd60: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
fd70: 54 41 54 33 2f 34 20 77 61 73 20 64 65 66 69 6e  TAT3/4 was defin
fd80: 65 64 20 0a 2a 2a 20 64 75 72 69 6e 67 20 63 6f  ed .** during co
fd90: 6d 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68  mpilation and th
fda0: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 33 2f 34  e sqlite_stat3/4
fdb0: 20 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e   table is presen
fdc0: 74 2c 20 6e 6f 20 64 61 74 61 20 69 73 20 0a 2a  t, no data is .*
fdd0: 2a 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2e 0a  * read from it..
fde0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
fdf0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 2f 34 20 77  ENABLE_STAT3/4 w
fe00: 61 73 20 64 65 66 69 6e 65 64 20 64 75 72 69 6e  as defined durin
fe10: 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6e  g compilation an
fe20: 64 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  d the .** sqlite
fe30: 5f 73 74 61 74 34 20 74 61 62 6c 65 20 69 73 20  _stat4 table is 
fe40: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 74  not present in t
fe50: 68 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c  he database, SQL
fe60: 49 54 45 5f 45 52 52 4f 52 20 69 73 0a 2a 2a 20  ITE_ERROR is.** 
fe70: 72 65 74 75 72 6e 65 64 2e 20 48 6f 77 65 76 65  returned. Howeve
fe80: 72 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2c  r, in this case,
fe90: 20 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72   data is read fr
fea0: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
feb0: 61 74 31 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66  at1.** table (if
fec0: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 29 20   it is present) 
fed0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
fee0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
fef0: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
ff00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  this function al
ff10: 77 61 79 73 20 73 65 74 73 20 64 62 2d 3e 6d 61  ways sets db->ma
ff20: 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2a 20 54  llocFailed..** T
ff30: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
ff40: 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
ff50: 20 63 61 72 65 20 61 62 6f 75 74 20 6f 74 68 65   care about othe
ff60: 72 20 65 72 72 6f 72 73 2c 20 74 68 65 20 72 65  r errors, the re
ff70: 74 75 72 6e 0a 2a 2a 20 63 6f 64 65 20 6d 61 79  turn.** code may
ff80: 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   be ignored..*/.
ff90: 69 6e 74 20 73 71 6c 69 74 65 33 41 6e 61 6c 79  int sqlite3Analy
ffa0: 73 69 73 4c 6f 61 64 28 73 71 6c 69 74 65 33 20  sisLoad(sqlite3 
ffb0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
ffc0: 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 73 49   analysisInfo sI
ffd0: 6e 66 6f 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  nfo;.  HashElem 
ffe0: 2a 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  *i;.  char *zSql
fff0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
10000 49 54 45 5f 4f 4b 3b 0a 20 20 53 63 68 65 6d 61  ITE_OK;.  Schema
10010 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
10020 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
10030 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
10040 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
10050 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
10060 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
10070 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  !=0 );..  /* Cle
10080 61 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74 61  ar any prior sta
10090 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 73 73  tistics */.  ass
100a0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
100b0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
100c0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72  iDb, 0) );.  for
100d0 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
100e0 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  st(&pSchema->tbl
100f0 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69  Hash); i; i=sqli
10100 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
10110 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
10120 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
10130 28 69 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  (i);.    pTab->t
10140 61 62 46 6c 61 67 73 20 26 3d 20 7e 54 46 5f 48  abFlags &= ~TF_H
10150 61 73 53 74 61 74 31 3b 0a 20 20 7d 0a 20 20 66  asStat1;.  }.  f
10160 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
10170 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69  irst(&pSchema->i
10180 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71  dxHash); i; i=sq
10190 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
101a0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
101b0 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
101c0 74 61 28 69 29 3b 0a 20 20 20 20 70 49 64 78 2d  ta(i);.    pIdx-
101d0 3e 68 61 73 53 74 61 74 31 20 3d 20 30 3b 0a 23  >hasStat1 = 0;.#
101e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
101f0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
10200 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  T4.    sqlite3De
10210 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73  leteIndexSamples
10220 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
10230 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20  pIdx->aSample = 
10240 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  0;.#endif.  }.. 
10250 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61   /* Load new sta
10260 74 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74  tistics out of t
10270 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
10280 74 61 62 6c 65 20 2a 2f 0a 20 20 73 49 6e 66 6f  table */.  sInfo
10290 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66  .db = db;.  sInf
102a0 6f 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62  o.zDatabase = db
102b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
102c0 61 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ame;.  if( sqlit
102d0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
102e0 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20  "sqlite_stat1", 
102f0 73 49 6e 66 6f 2e 7a 44 61 74 61 62 61 73 65 29  sInfo.zDatabase)
10300 21 3d 30 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20  !=0 ){.    zSql 
10310 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10320 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22 53  (db, .        "S
10330 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74  ELECT tbl,idx,st
10340 61 74 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  at FROM %Q.sqlit
10350 65 5f 73 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e  e_stat1", sInfo.
10360 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
10370 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
10380 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10390 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
103a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
103b0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
103c0 64 62 2c 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73  db, zSql, analys
103d0 69 73 4c 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f  isLoader, &sInfo
103e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
103f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
10400 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ql);.    }.  }..
10410 20 20 2f 2a 20 53 65 74 20 61 70 70 72 6f 70 72    /* Set appropr
10420 69 61 74 65 20 64 65 66 61 75 6c 74 73 20 6f 6e  iate defaults on
10430 20 61 6c 6c 20 69 6e 64 65 78 65 73 20 6e 6f 74   all indexes not
10440 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 73   in the sqlite_s
10450 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tat1 table */.  
10460 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
10470 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
10480 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
10490 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
104a0 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
104b0 69 64 78 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  idxHash); i; i=s
104c0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
104d0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
104e0 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
104f0 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
10500 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
10510 29 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  ) sqlite3Default
10520 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20 20  RowEst(pIdx);.  
10530 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  }..  /* Load the
10540 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d   statistics from
10550 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
10560 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64  4 table. */.#ifd
10570 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10580 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
10590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
105a0 5f 4f 4b 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  _OK && Optimizat
105b0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
105c0 51 4c 49 54 45 5f 53 74 61 74 33 34 29 20 29 7b  QLITE_Stat34) ){
105d0 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
105e0 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 20  de.bDisable++;. 
105f0 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74     rc = loadStat
10600 34 28 64 62 2c 20 73 49 6e 66 6f 2e 7a 44 61 74  4(db, sInfo.zDat
10610 61 62 61 73 65 29 3b 0a 20 20 20 20 64 62 2d 3e  abase);.    db->
10620 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
10630 6c 65 2d 2d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  le--;.  }.  for(
10640 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
10650 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
10660 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
10670 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
10680 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
10690 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
106a0 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  i);.    sqlite3_
106b0 66 72 65 65 28 70 49 64 78 2d 3e 61 69 52 6f 77  free(pIdx->aiRow
106c0 45 73 74 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  Est);.    pIdx->
106d0 61 69 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20  aiRowEst = 0;.  
106e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
106f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
10700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10710 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d  omFault(db);.  }
10720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10730 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
10740 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 20  TE_OMIT_ANALYZE 
10750 2a 2f 0a                                         */.