/ Hex Artifact Content
Login

Artifact 37fedc80ac966ce1745811746e68e4d8fa64c7fe:


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 4e 61 6d 65 29 29  ab, pDb->zName))
2570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2580: 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43 6f 6c 73   aTable[i].zCols
2590: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
25a0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
25b0: 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  table does not e
25c0: 78 69 73 74 2e 20 43 72 65 61 74 65 20 69 74 2e  xist. Create it.
25d0: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 0a 20 20   Note that a .  
25e0: 20 20 20 20 20 20 2a 2a 20 73 69 64 65 2d 65 66        ** side-ef
25f0: 66 65 63 74 20 6f 66 20 74 68 65 20 43 52 45 41  fect of the CREA
2600: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
2610: 6e 74 20 69 73 20 74 6f 20 6c 65 61 76 65 20 74  nt is to leave t
2620: 68 65 20 72 6f 6f 74 70 61 67 65 20 0a 20 20 20  he rootpage .   
2630: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e       ** of the n
2640: 65 77 20 74 61 62 6c 65 20 69 6e 20 72 65 67 69  ew table in regi
2650: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
2660: 52 6f 6f 74 2e 20 54 68 69 73 20 69 73 20 69 6d  Root. This is im
2670: 70 6f 72 74 61 6e 74 20 0a 20 20 20 20 20 20 20  portant .       
2680: 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20   ** because the 
2690: 4f 70 65 6e 57 72 69 74 65 20 6f 70 63 6f 64 65  OpenWrite opcode
26a0: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 20 6e   below will be n
26b0: 65 65 64 69 6e 67 20 69 74 2e 20 2a 2f 0a 20 20  eeding it. */.  
26c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
26d0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
26e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52  .            "CR
26f0: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 25 73  EATE TABLE %Q.%s
2700: 28 25 73 29 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d  (%s)", pDb->zNam
2710: 65 2c 20 7a 54 61 62 2c 20 61 54 61 62 6c 65 5b  e, zTab, aTable[
2720: 69 5d 2e 7a 43 6f 6c 73 0a 20 20 20 20 20 20 20  i].zCols.       
2730: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 52 6f 6f   );.        aRoo
2740: 74 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 72  t[i] = pParse->r
2750: 65 67 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20  egRoot;.        
2760: 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 20 3d 20  aCreateTbl[i] = 
2770: 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3b 0a  OPFLAG_P2ISREG;.
2780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2790: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
27a0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
27b0: 69 73 74 73 2e 20 49 66 20 7a 57 68 65 72 65 20  ists. If zWhere 
27c0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c  is not NULL, del
27d0: 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ete all entries 
27e0: 0a 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63 69  .      ** associ
27f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
2800: 62 6c 65 20 7a 57 68 65 72 65 2e 20 49 66 20 7a  ble zWhere. If z
2810: 57 68 65 72 65 20 69 73 20 4e 55 4c 4c 2c 20 64  Where is NULL, d
2820: 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
2830: 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
2840: 74 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ts of the table.
2850: 20 2a 2f 0a 20 20 20 20 20 20 61 52 6f 6f 74 5b   */.      aRoot[
2860: 69 5d 20 3d 20 70 53 74 61 74 2d 3e 74 6e 75 6d  i] = pStat->tnum
2870: 3b 0a 20 20 20 20 20 20 61 43 72 65 61 74 65 54  ;.      aCreateT
2880: 62 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  bl[i] = 0;.     
2890: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
28a0: 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 61  k(pParse, iDb, a
28b0: 52 6f 6f 74 5b 69 5d 2c 20 31 2c 20 7a 54 61 62  Root[i], 1, zTab
28c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 57 68  );.      if( zWh
28d0: 65 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ere ){.        s
28e0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
28f0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
2900: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
2910: 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73  M %Q.%s WHERE %s
2920: 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%Q",.          
2930: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 54 61   pDb->zName, zTa
2940: 62 2c 20 7a 57 68 65 72 65 54 79 70 65 2c 20 7a  b, zWhereType, z
2950: 57 68 65 72 65 0a 20 20 20 20 20 20 20 20 29 3b  Where.        );
2960: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 71 6c        /* The sql
2980: 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 20 74 61  ite_stat[134] ta
2990: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
29a0: 74 73 2e 20 20 44 65 6c 65 74 65 20 61 6c 6c 20  ts.  Delete all 
29b0: 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rows. */.       
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29d0: 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  p2(v, OP_Clear, 
29e0: 61 52 6f 6f 74 5b 69 5d 2c 20 69 44 62 29 3b 0a  aRoot[i], iDb);.
29f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a00: 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
2a10: 20 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34   sqlite_stat[134
2a20: 5d 20 74 61 62 6c 65 73 20 66 6f 72 20 77 72 69  ] tables for wri
2a30: 74 69 6e 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ting. */.  for(i
2a40: 3d 30 3b 20 61 54 61 62 6c 65 5b 69 5d 2e 7a 43  =0; aTable[i].zC
2a50: 6f 6c 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ols; i++){.    a
2a60: 73 73 65 72 74 28 20 69 3c 41 72 72 61 79 53 69  ssert( i<ArraySi
2a70: 7a 65 28 61 54 61 62 6c 65 29 20 29 3b 0a 20 20  ze(aTable) );.  
2a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a90: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
2aa0: 6e 57 72 69 74 65 2c 20 69 53 74 61 74 43 75 72  nWrite, iStatCur
2ab0: 2b 69 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 69 44  +i, aRoot[i], iD
2ac0: 62 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 3);.    sqlit
2ad0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2ae0: 2c 20 61 43 72 65 61 74 65 54 62 6c 5b 69 5d 29  , aCreateTbl[i])
2af0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
2b00: 74 28 28 76 2c 20 61 54 61 62 6c 65 5b 69 5d 2e  t((v, aTable[i].
2b10: 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  zName));.  }.}..
2b20: 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 6d 65 6e 64 65  /*.** Recommende
2b30: 64 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70  d number of samp
2b40: 6c 65 73 20 66 6f 72 20 73 71 6c 69 74 65 5f 73  les for sqlite_s
2b50: 74 61 74 34 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tat4.*/.#ifndef 
2b60: 53 51 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d  SQLITE_STAT4_SAM
2b70: 50 4c 45 53 0a 23 20 64 65 66 69 6e 65 20 53 51  PLES.# define SQ
2b80: 4c 49 54 45 5f 53 54 41 54 34 5f 53 41 4d 50 4c  LITE_STAT4_SAMPL
2b90: 45 53 20 32 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ES 24.#endif../*
2ba0: 0a 2a 2a 20 54 68 72 65 65 20 53 51 4c 20 66 75  .** Three SQL fu
2bb0: 6e 63 74 69 6f 6e 73 20 2d 20 73 74 61 74 5f 69  nctions - stat_i
2bc0: 6e 69 74 28 29 2c 20 73 74 61 74 5f 70 75 73 68  nit(), stat_push
2bd0: 28 29 2c 20 61 6e 64 20 73 74 61 74 5f 67 65 74  (), and stat_get
2be0: 28 29 20 2d 0a 2a 2a 20 73 68 61 72 65 20 61 6e  () -.** share an
2bf0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2c00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2c10: 74 75 72 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  ture to hold the
2c20: 69 72 20 73 74 61 74 65 0a 2a 2a 20 69 6e 66 6f  ir state.** info
2c30: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  rmation..*/.type
2c40: 64 65 66 20 73 74 72 75 63 74 20 53 74 61 74 34  def struct Stat4
2c50: 41 63 63 75 6d 20 53 74 61 74 34 41 63 63 75 6d  Accum Stat4Accum
2c60: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2c70: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 53 74 61   Stat4Sample Sta
2c80: 74 34 53 61 6d 70 6c 65 3b 0a 73 74 72 75 63 74  t4Sample;.struct
2c90: 20 53 74 61 74 34 53 61 6d 70 6c 65 20 7b 0a 20   Stat4Sample {. 
2ca0: 20 74 52 6f 77 63 6e 74 20 2a 61 6e 45 71 3b 20   tRowcnt *anEq; 
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 2f 2a 20 73 71 6c 69 74 65 5f 73 74 61 74 34   /* sqlite_stat4
2cd0: 2e 6e 45 71 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  .nEq */.  tRowcn
2ce0: 74 20 2a 61 6e 44 4c 74 3b 20 20 20 20 20 20 20  t *anDLt;       
2cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2d00: 69 74 65 5f 73 74 61 74 34 2e 6e 44 4c 74 20 2a  ite_stat4.nDLt *
2d10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2d20: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
2d30: 53 54 41 54 34 0a 20 20 74 52 6f 77 63 6e 74 20  STAT4.  tRowcnt 
2d40: 2a 61 6e 4c 74 3b 20 20 20 20 20 20 20 20 20 20  *anLt;          
2d50: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2d60: 65 5f 73 74 61 74 34 2e 6e 4c 74 20 2a 2f 0a 20  e_stat4.nLt */. 
2d70: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 36 34   union {.    i64
2d80: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2da0: 52 6f 77 69 64 20 69 6e 20 6d 61 69 6e 20 74 61  Rowid in main ta
2db0: 62 6c 65 20 6f 66 20 74 68 65 20 6b 65 79 20 2a  ble of the key *
2dc0: 2f 0a 20 20 20 20 75 38 20 2a 61 52 6f 77 69 64  /.    u8 *aRowid
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de0: 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 66 6f 72        /* Key for
2df0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
2e00: 61 62 6c 65 73 20 2a 2f 0a 20 20 7d 20 75 3b 0a  ables */.  } u;.
2e10: 20 20 75 33 32 20 6e 52 6f 77 69 64 3b 20 20 20    u32 nRowid;   
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 2f 2a 20 53 69 7a 65 6f 66 20 61 52 6f 77    /* Sizeof aRow
2e40: 69 64 5b 5d 20 2a 2f 0a 20 20 75 38 20 69 73 50  id[] */.  u8 isP
2e50: 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20 20  Sample;         
2e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e70: 65 20 69 66 20 61 20 70 65 72 69 6f 64 69 63 20  e if a periodic 
2e80: 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  sample */.  int 
2e90: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2eb0: 66 20 21 69 73 50 53 61 6d 70 6c 65 2c 20 74 68  f !isPSample, th
2ec0: 65 20 72 65 61 73 6f 6e 20 66 6f 72 20 69 6e 63  e reason for inc
2ed0: 6c 75 73 69 6f 6e 20 2a 2f 0a 20 20 75 33 32 20  lusion */.  u32 
2ee0: 69 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  iHash;          
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f00: 69 65 62 72 65 61 6b 65 72 20 68 61 73 68 20 2a  iebreaker hash *
2f10: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 20 20 20 20 20  /.#endif.};     
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
2f50: 73 74 72 75 63 74 20 53 74 61 74 34 41 63 63 75  struct Stat4Accu
2f60: 6d 20 7b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52  m {.  tRowcnt nR
2f70: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
2f80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
2f90: 73 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  s in the entire 
2fa0: 74 61 62 6c 65 20 2a 2f 0a 20 20 74 52 6f 77 63  table */.  tRowc
2fb0: 6e 74 20 6e 50 53 61 6d 70 6c 65 3b 20 20 20 20  nt nPSample;    
2fc0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6f 66 74 65       /* How ofte
2fd0: 6e 20 74 6f 20 64 6f 20 61 20 70 65 72 69 6f 64  n to do a period
2fe0: 69 63 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 69  ic sample */.  i
2ff0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
3000: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3010: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
3020: 20 69 6e 64 65 78 20 2b 20 70 6b 2f 72 6f 77 69   index + pk/rowi
3030: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 43  d */.  int nKeyC
3040: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
3050: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
3060: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 2f 6f 20  dex columns w/o 
3070: 74 68 65 20 70 6b 2f 72 6f 77 69 64 20 2a 2f 0a  the pk/rowid */.
3080: 20 20 69 6e 74 20 6d 78 53 61 6d 70 6c 65 3b 20    int mxSample; 
3090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
30a0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
30b0: 20 73 61 6d 70 6c 65 73 20 74 6f 20 61 63 63 75   samples to accu
30c0: 6d 75 6c 61 74 65 20 2a 2f 0a 20 20 53 74 61 74  mulate */.  Stat
30d0: 34 53 61 6d 70 6c 65 20 63 75 72 72 65 6e 74 3b  4Sample current;
30e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
30f0: 20 72 6f 77 20 61 73 20 61 20 53 74 61 74 34 53   row as a Stat4S
3100: 61 6d 70 6c 65 20 2a 2f 0a 20 20 75 33 32 20 69  ample */.  u32 i
3110: 50 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Prn;            
3120: 20 20 20 20 20 2f 2a 20 50 73 65 75 64 6f 2d 72       /* Pseudo-r
3130: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
3140: 64 20 66 6f 72 20 73 61 6d 70 6c 69 6e 67 20 2a  d for sampling *
3150: 2f 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20  /.  Stat4Sample 
3160: 2a 61 42 65 73 74 3b 20 20 20 20 20 20 20 2f 2a  *aBest;       /*
3170: 20 41 72 72 61 79 20 6f 66 20 6e 43 6f 6c 20 62   Array of nCol b
3180: 65 73 74 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20  est samples */. 
3190: 20 69 6e 74 20 69 4d 69 6e 3b 20 20 20 20 20 20   int iMin;      
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31b0: 64 65 78 20 69 6e 20 61 5b 5d 20 6f 66 20 65 6e  dex in a[] of en
31c0: 74 72 79 20 77 69 74 68 20 6d 69 6e 69 6d 75 6d  try with minimum
31d0: 20 73 63 6f 72 65 20 2a 2f 0a 20 20 69 6e 74 20   score */.  int 
31e0: 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 20 20  nSample;        
31f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
3200: 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c   number of sampl
3210: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 47 65 74  es */.  int iGet
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75    /* Index of cu
3240: 72 72 65 6e 74 20 73 61 6d 70 6c 65 20 61 63 63  rrent sample acc
3250: 65 73 73 65 64 20 62 79 20 73 74 61 74 5f 67 65  essed by stat_ge
3260: 74 28 29 20 2a 2f 0a 20 20 53 74 61 74 34 53 61  t() */.  Stat4Sa
3270: 6d 70 6c 65 20 2a 61 3b 20 20 20 20 20 20 20 20  mple *a;        
3280: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
3290: 78 53 61 6d 70 6c 65 20 53 74 61 74 34 53 61 6d  xSample Stat4Sam
32a0: 70 6c 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20  ple objects */. 
32b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
32c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
32d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
32e0: 6e 2c 20 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  n, for malloc() 
32f0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 63 6c 61 69  */.};../* Reclai
3300: 6d 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  m memory used by
3310: 20 61 20 53 74 61 74 34 53 61 6d 70 6c 65 0a 2a   a Stat4Sample.*
3320: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3330: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
3340: 53 54 41 54 34 0a 73 74 61 74 69 63 20 76 6f 69  STAT4.static voi
3350: 64 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 73 71  d sampleClear(sq
3360: 6c 69 74 65 33 20 2a 64 62 2c 20 53 74 61 74 34  lite3 *db, Stat4
3370: 53 61 6d 70 6c 65 20 2a 70 29 7b 0a 20 20 61 73  Sample *p){.  as
3380: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
3390: 20 69 66 28 20 70 2d 3e 6e 52 6f 77 69 64 20 29   if( p->nRowid )
33a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
33b0: 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 61 52 6f  ree(db, p->u.aRo
33c0: 77 69 64 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 6f  wid);.    p->nRo
33d0: 77 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  wid = 0;.  }.}.#
33e0: 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 69 74 69 61  endif../* Initia
33f0: 6c 69 7a 65 20 74 68 65 20 42 4c 4f 42 20 76 61  lize the BLOB va
3400: 6c 75 65 20 6f 66 20 61 20 52 4f 57 49 44 0a 2a  lue of a ROWID.*
3410: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3420: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
3430: 53 54 41 54 34 0a 73 74 61 74 69 63 20 76 6f 69  STAT4.static voi
3440: 64 20 73 61 6d 70 6c 65 53 65 74 52 6f 77 69 64  d sampleSetRowid
3450: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 74  (sqlite3 *db, St
3460: 61 74 34 53 61 6d 70 6c 65 20 2a 70 2c 20 69 6e  at4Sample *p, in
3470: 74 20 6e 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  t n, const u8 *p
3480: 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28  Data){.  assert(
3490: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
34a0: 70 2d 3e 6e 52 6f 77 69 64 20 29 20 73 71 6c 69  p->nRowid ) sqli
34b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
34c0: 3e 75 2e 61 52 6f 77 69 64 29 3b 0a 20 20 70 2d  >u.aRowid);.  p-
34d0: 3e 75 2e 61 52 6f 77 69 64 20 3d 20 73 71 6c 69  >u.aRowid = sqli
34e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
34f0: 28 64 62 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70  (db, n);.  if( p
3500: 2d 3e 75 2e 61 52 6f 77 69 64 20 29 7b 0a 20 20  ->u.aRowid ){.  
3510: 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 6e 3b    p->nRowid = n;
3520: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 75  .    memcpy(p->u
3530: 2e 61 52 6f 77 69 64 2c 20 70 44 61 74 61 2c 20  .aRowid, pData, 
3540: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
3550: 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b 0a   p->nRowid = 0;.
3560: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
3570: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3580: 49 4e 54 45 47 45 52 20 76 61 6c 75 65 20 6f 66  INTEGER value of
3590: 20 61 20 52 4f 57 49 44 2e 0a 2a 2f 0a 23 69 66   a ROWID..*/.#if
35a0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
35b0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
35c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d  .static void sam
35d0: 70 6c 65 53 65 74 52 6f 77 69 64 49 6e 74 36 34  pleSetRowidInt64
35e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 74  (sqlite3 *db, St
35f0: 61 74 34 53 61 6d 70 6c 65 20 2a 70 2c 20 69 36  at4Sample *p, i6
3600: 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73  4 iRowid){.  ass
3610: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
3620: 69 66 28 20 70 2d 3e 6e 52 6f 77 69 64 20 29 20  if( p->nRowid ) 
3630: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3640: 2c 20 70 2d 3e 75 2e 61 52 6f 77 69 64 29 3b 0a  , p->u.aRowid);.
3650: 20 20 70 2d 3e 6e 52 6f 77 69 64 20 3d 20 30 3b    p->nRowid = 0;
3660: 0a 20 20 70 2d 3e 75 2e 69 52 6f 77 69 64 20 3d  .  p->u.iRowid =
3670: 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69   iRowid;.}.#endi
3680: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  f.../*.** Copy t
3690: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f  he contents of o
36a0: 62 6a 65 63 74 20 28 2a 70 46 72 6f 6d 29 20 69  bject (*pFrom) i
36b0: 6e 74 6f 20 28 2a 70 54 6f 29 2e 0a 2a 2f 0a 23  nto (*pTo)..*/.#
36c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36d0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
36e0: 54 34 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  T4.static void s
36f0: 61 6d 70 6c 65 43 6f 70 79 28 53 74 61 74 34 41  ampleCopy(Stat4A
3700: 63 63 75 6d 20 2a 70 2c 20 53 74 61 74 34 53 61  ccum *p, Stat4Sa
3710: 6d 70 6c 65 20 2a 70 54 6f 2c 20 53 74 61 74 34  mple *pTo, Stat4
3720: 53 61 6d 70 6c 65 20 2a 70 46 72 6f 6d 29 7b 0a  Sample *pFrom){.
3730: 20 20 70 54 6f 2d 3e 69 73 50 53 61 6d 70 6c 65    pTo->isPSample
3740: 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 50 53 61 6d   = pFrom->isPSam
3750: 70 6c 65 3b 0a 20 20 70 54 6f 2d 3e 69 43 6f 6c  ple;.  pTo->iCol
3760: 20 3d 20 70 46 72 6f 6d 2d 3e 69 43 6f 6c 3b 0a   = pFrom->iCol;.
3770: 20 20 70 54 6f 2d 3e 69 48 61 73 68 20 3d 20 70    pTo->iHash = p
3780: 46 72 6f 6d 2d 3e 69 48 61 73 68 3b 0a 20 20 6d  From->iHash;.  m
3790: 65 6d 63 70 79 28 70 54 6f 2d 3e 61 6e 45 71 2c  emcpy(pTo->anEq,
37a0: 20 70 46 72 6f 6d 2d 3e 61 6e 45 71 2c 20 73 69   pFrom->anEq, si
37b0: 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 70 2d  zeof(tRowcnt)*p-
37c0: 3e 6e 43 6f 6c 29 3b 0a 20 20 6d 65 6d 63 70 79  >nCol);.  memcpy
37d0: 28 70 54 6f 2d 3e 61 6e 4c 74 2c 20 70 46 72 6f  (pTo->anLt, pFro
37e0: 6d 2d 3e 61 6e 4c 74 2c 20 73 69 7a 65 6f 66 28  m->anLt, sizeof(
37f0: 74 52 6f 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c  tRowcnt)*p->nCol
3800: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d  );.  memcpy(pTo-
3810: 3e 61 6e 44 4c 74 2c 20 70 46 72 6f 6d 2d 3e 61  >anDLt, pFrom->a
3820: 6e 44 4c 74 2c 20 73 69 7a 65 6f 66 28 74 52 6f  nDLt, sizeof(tRo
3830: 77 63 6e 74 29 2a 70 2d 3e 6e 43 6f 6c 29 3b 0a  wcnt)*p->nCol);.
3840: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 6e 52 6f    if( pFrom->nRo
3850: 77 69 64 20 29 7b 0a 20 20 20 20 73 61 6d 70 6c  wid ){.    sampl
3860: 65 53 65 74 52 6f 77 69 64 28 70 2d 3e 64 62 2c  eSetRowid(p->db,
3870: 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 52 6f   pTo, pFrom->nRo
3880: 77 69 64 2c 20 70 46 72 6f 6d 2d 3e 75 2e 61 52  wid, pFrom->u.aR
3890: 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
38a0: 20 20 20 20 73 61 6d 70 6c 65 53 65 74 52 6f 77      sampleSetRow
38b0: 69 64 49 6e 74 36 34 28 70 2d 3e 64 62 2c 20 70  idInt64(p->db, p
38c0: 54 6f 2c 20 70 46 72 6f 6d 2d 3e 75 2e 69 52 6f  To, pFrom->u.iRo
38d0: 77 69 64 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  wid);.  }.}.#end
38e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  if../*.** Reclai
38f0: 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 6f 66 20  m all memory of 
3900: 61 20 53 74 61 74 34 41 63 63 75 6d 20 73 74 72  a Stat4Accum str
3910: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
3920: 63 20 76 6f 69 64 20 73 74 61 74 34 44 65 73 74  c void stat4Dest
3930: 72 75 63 74 6f 72 28 76 6f 69 64 20 2a 70 4f 6c  ructor(void *pOl
3940: 64 29 7b 0a 20 20 53 74 61 74 34 41 63 63 75 6d  d){.  Stat4Accum
3950: 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63 63 75   *p = (Stat4Accu
3960: 6d 2a 29 70 4f 6c 64 3b 0a 23 69 66 64 65 66 20  m*)pOld;.#ifdef 
3970: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3980: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
3990: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
39a0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
39b0: 20 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e   sampleClear(p->
39c0: 64 62 2c 20 70 2d 3e 61 42 65 73 74 2b 69 29 3b  db, p->aBest+i);
39d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
39e0: 3e 6d 78 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 20  >mxSample; i++) 
39f0: 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e 64  sampleClear(p->d
3a00: 62 2c 20 70 2d 3e 61 2b 69 29 3b 0a 20 20 73 61  b, p->a+i);.  sa
3a10: 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e 64 62 2c  mpleClear(p->db,
3a20: 20 26 70 2d 3e 63 75 72 72 65 6e 74 29 3b 0a 23   &p->current);.#
3a30: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
3a40: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 29 3b  bFree(p->db, p);
3a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
3a60: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3a70: 73 74 61 74 5f 69 6e 69 74 28 4e 2c 4b 2c 43 29  stat_init(N,K,C)
3a80: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54   SQL function. T
3a90: 68 65 20 74 68 72 65 65 20 70 61 72 61 6d 65 74  he three paramet
3aa0: 65 72 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 20 20  ers.** are:.**  
3ab0: 20 20 20 4e 3a 20 20 20 20 54 68 65 20 6e 75 6d     N:    The num
3ac0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
3ad0: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 63 6c  n the index incl
3ae0: 75 64 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2f  uding the rowid/
3af0: 70 6b 20 28 6e 6f 74 65 20 31 29 0a 2a 2a 20 20  pk (note 1).**  
3b00: 20 20 20 4b 3a 20 20 20 20 54 68 65 20 6e 75 6d     K:    The num
3b10: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
3b20: 6e 20 74 68 65 20 69 6e 64 65 78 20 65 78 63 6c  n the index excl
3b30: 75 64 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2f  uding the rowid/
3b40: 70 6b 2e 0a 2a 2a 20 20 20 20 20 43 3a 20 20 20  pk..**     C:   
3b50: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   The number of r
3b60: 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
3b70: 20 28 6e 6f 74 65 20 32 29 0a 2a 2a 0a 2a 2a 20   (note 2).**.** 
3b80: 4e 6f 74 65 20 31 3a 20 20 49 6e 20 74 68 65 20  Note 1:  In the 
3b90: 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
3ba0: 74 68 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  the covering ind
3bb0: 65 78 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ex that implemen
3bc0: 74 73 20 61 0a 2a 2a 20 57 49 54 48 4f 55 54 20  ts a.** WITHOUT 
3bd0: 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 4e 20 69  ROWID table, N i
3be0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3bf0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
3c00: 6d 6e 73 2c 20 6e 6f 74 20 74 68 65 0a 2a 2a 20  mns, not the.** 
3c10: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
3c20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
3c30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  able..**.** Note
3c40: 20 32 3a 20 20 43 20 69 73 20 6f 6e 6c 79 20 75   2:  C is only u
3c50: 73 65 64 20 66 6f 72 20 53 54 41 54 33 20 61 6e  sed for STAT3 an
3c60: 64 20 53 54 41 54 34 2e 0a 2a 2a 0a 2a 2a 20 46  d STAT4..**.** F
3c70: 6f 72 20 69 6e 64 65 78 65 73 20 6f 6e 20 6f 72  or indexes on or
3c80: 64 69 6e 61 72 79 20 72 6f 77 69 64 20 74 61 62  dinary rowid tab
3c90: 6c 65 73 2c 20 4e 3d 3d 4b 2b 31 2e 20 20 42 75  les, N==K+1.  Bu
3ca0: 74 20 66 6f 72 20 69 6e 64 65 78 65 73 20 6f 6e  t for indexes on
3cb0: 0a 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57 49  .** WITHOUT ROWI
3cc0: 44 20 74 61 62 6c 65 73 2c 20 4e 3d 4b 2b 50 20  D tables, N=K+P 
3cd0: 77 68 65 72 65 20 50 20 69 73 20 74 68 65 20 6e  where P is the n
3ce0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
3cf0: 20 69 6e 20 74 68 65 0a 2a 2a 20 50 52 49 4d 41   in the.** PRIMA
3d00: 52 59 20 4b 45 59 20 6f 66 20 74 68 65 20 74 61  RY KEY of the ta
3d10: 62 6c 65 2e 20 20 54 68 65 20 63 6f 76 65 72 69  ble.  The coveri
3d20: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 69 6d  ng index that im
3d30: 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20  plements the.** 
3d40: 6f 72 69 67 69 6e 61 6c 20 57 49 54 48 4f 55 54  original WITHOUT
3d50: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 61 73 20   ROWID table as 
3d60: 4e 3d 3d 4b 20 61 73 20 61 20 73 70 65 63 69 61  N==K as a specia
3d70: 6c 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l case..**.** Th
3d80: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
3d90: 61 74 65 73 20 74 68 65 20 53 74 61 74 34 41 63  ates the Stat4Ac
3da0: 63 75 6d 20 6f 62 6a 65 63 74 20 69 6e 20 68 65  cum object in he
3db0: 61 70 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 72  ap memory. The r
3dc0: 65 74 75 72 6e 20 0a 2a 2a 20 76 61 6c 75 65 20  eturn .** value 
3dd0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
3de0: 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 20 6f  the Stat4Accum o
3df0: 62 6a 65 63 74 2e 20 20 54 68 65 20 64 61 74 61  bject.  The data
3e00: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 72  type of the.** r
3e10: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 42  eturn value is B
3e20: 4c 4f 42 2c 20 62 75 74 20 69 74 20 69 73 20 72  LOB, but it is r
3e30: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 70 6f 69  eally just a poi
3e40: 6e 74 65 72 20 74 6f 20 74 68 65 20 53 74 61 74  nter to the Stat
3e50: 34 41 63 63 75 6d 0a 2a 2a 20 6f 62 6a 65 63 74  4Accum.** object
3e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e70: 20 73 74 61 74 49 6e 69 74 28 0a 20 20 73 71 6c   statInit(.  sql
3e80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3e90: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
3ea0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
3eb0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53  ue **argv.){.  S
3ec0: 74 61 74 34 41 63 63 75 6d 20 2a 70 3b 0a 20 20  tat4Accum *p;.  
3ed0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
3f00: 75 6d 6e 73 20 69 6e 20 69 6e 64 65 78 20 62 65  umns in index be
3f10: 69 6e 67 20 73 61 6d 70 6c 65 64 20 2a 2f 0a 20  ing sampled */. 
3f20: 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   int nKeyCol;   
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
3f50: 79 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  y columns */.  i
3f60: 6e 74 20 6e 43 6f 6c 55 70 3b 20 20 20 20 20 20  nt nColUp;      
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f80: 2a 20 6e 43 6f 6c 20 72 6f 75 6e 64 65 64 20 75  * nCol rounded u
3f90: 70 20 66 6f 72 20 61 6c 69 67 6e 6d 65 6e 74 20  p for alignment 
3fa0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
3fd0: 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
3fe0: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
3ff0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
4000: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4010: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
4020: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4030: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
4040: 53 54 41 54 34 0a 20 20 69 6e 74 20 6d 78 53 61  STAT4.  int mxSa
4050: 6d 70 6c 65 20 3d 20 53 51 4c 49 54 45 5f 53 54  mple = SQLITE_ST
4060: 41 54 34 5f 53 41 4d 50 4c 45 53 3b 0a 23 65 6e  AT4_SAMPLES;.#en
4070: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 63 6f 64 65  dif..  /* Decode
4080: 20 74 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   the three funct
4090: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
40a0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
40b0: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e 43 6f  TER(argc);.  nCo
40c0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
40d0: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
40e0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3e 30    assert( nCol>0
40f0: 20 29 3b 0a 20 20 6e 43 6f 6c 55 70 20 3d 20 73   );.  nColUp = s
4100: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 3c 38  izeof(tRowcnt)<8
4110: 20 3f 20 28 6e 43 6f 6c 2b 31 29 26 7e 31 20 3a   ? (nCol+1)&~1 :
4120: 20 6e 43 6f 6c 3b 0a 20 20 6e 4b 65 79 43 6f 6c   nCol;.  nKeyCol
4130: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4140: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20  _int(argv[1]);. 
4150: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
4160: 3c 3d 6e 43 6f 6c 20 29 3b 0a 20 20 61 73 73 65  <=nCol );.  asse
4170: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
4180: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
4190: 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
41a0: 65 64 20 66 6f 72 20 74 68 65 20 53 74 61 74 34  ed for the Stat4
41b0: 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a  Accum object */.
41c0: 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29    n = sizeof(*p)
41d0: 20 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 74   .    + sizeof(t
41e0: 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 55 70 20 20  Rowcnt)*nColUp  
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e 61 6e  /* Stat4Accum.an
4210: 45 71 20 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65  Eq */.    + size
4220: 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c  of(tRowcnt)*nCol
4230: 55 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Up              
4240: 20 20 20 20 2f 2a 20 53 74 61 74 34 41 63 63 75      /* Stat4Accu
4250: 6d 2e 61 6e 44 4c 74 20 2a 2f 0a 23 69 66 64 65  m.anDLt */.#ifde
4260: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4270: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
4280: 20 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77     + sizeof(tRow
4290: 63 6e 74 29 2a 6e 43 6f 6c 55 70 20 20 20 20 20  cnt)*nColUp     
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42b0: 53 74 61 74 34 41 63 63 75 6d 2e 61 6e 4c 74 20  Stat4Accum.anLt 
42c0: 2a 2f 0a 20 20 20 20 2b 20 73 69 7a 65 6f 66 28  */.    + sizeof(
42d0: 53 74 61 74 34 53 61 6d 70 6c 65 29 2a 28 6e 43  Stat4Sample)*(nC
42e0: 6f 6c 2b 6d 78 53 61 6d 70 6c 65 29 20 20 20 20  ol+mxSample)    
42f0: 20 2f 2a 20 53 74 61 74 34 41 63 63 75 6d 2e 61   /* Stat4Accum.a
4300: 42 65 73 74 5b 5d 2c 20 61 5b 5d 20 2a 2f 0a 20  Best[], a[] */. 
4310: 20 20 20 2b 20 73 69 7a 65 6f 66 28 74 52 6f 77     + sizeof(tRow
4320: 63 6e 74 29 2a 33 2a 6e 43 6f 6c 55 70 2a 28 6e  cnt)*3*nColUp*(n
4330: 43 6f 6c 2b 6d 78 53 61 6d 70 6c 65 29 0a 23 65  Col+mxSample).#e
4340: 6e 64 69 66 0a 20 20 3b 0a 20 20 64 62 20 3d 20  ndif.  ;.  db = 
4350: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
4360: 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78  db_handle(contex
4370: 74 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  t);.  p = sqlite
4380: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
4390: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  , n);.  if( p==0
43a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
43b0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
43c0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
43d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
43e0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 2d  p->db = db;.  p-
43f0: 3e 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 70 2d 3e  >nRow = 0;.  p->
4400: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 70  nCol = nCol;.  p
4410: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 4b 65 79  ->nKeyCol = nKey
4420: 43 6f 6c 3b 0a 20 20 70 2d 3e 63 75 72 72 65 6e  Col;.  p->curren
4430: 74 2e 61 6e 44 4c 74 20 3d 20 28 74 52 6f 77 63  t.anDLt = (tRowc
4440: 6e 74 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e  nt*)&p[1];.  p->
4450: 63 75 72 72 65 6e 74 2e 61 6e 45 71 20 3d 20 26  current.anEq = &
4460: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44 4c 74  p->current.anDLt
4470: 5b 6e 43 6f 6c 55 70 5d 3b 0a 0a 23 69 66 64 65  [nColUp];..#ifde
4480: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4490: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
44a0: 20 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63   {.    u8 *pSpac
44b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
44c0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
44d0: 74 65 64 20 73 70 61 63 65 20 6e 6f 74 20 79 65  ted space not ye
44e0: 74 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  t assigned */.  
44f0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
4520: 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 2d 3e  rate through p->
4530: 61 53 61 6d 70 6c 65 5b 5d 20 2a 2f 0a 0a 20 20  aSample[] */..  
4540: 20 20 70 2d 3e 69 47 65 74 20 3d 20 2d 31 3b 0a    p->iGet = -1;.
4550: 20 20 20 20 70 2d 3e 6d 78 53 61 6d 70 6c 65 20      p->mxSample 
4560: 3d 20 6d 78 53 61 6d 70 6c 65 3b 0a 20 20 20 20  = mxSample;.    
4570: 70 2d 3e 6e 50 53 61 6d 70 6c 65 20 3d 20 28 74  p->nPSample = (t
4580: 52 6f 77 63 6e 74 29 28 73 71 6c 69 74 65 33 5f  Rowcnt)(sqlite3_
4590: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
45a0: 5b 32 5d 29 2f 28 6d 78 53 61 6d 70 6c 65 2f 33  [2])/(mxSample/3
45b0: 2b 31 29 20 2b 20 31 29 3b 0a 20 20 20 20 70 2d  +1) + 1);.    p-
45c0: 3e 63 75 72 72 65 6e 74 2e 61 6e 4c 74 20 3d 20  >current.anLt = 
45d0: 26 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71  &p->current.anEq
45e0: 5b 6e 43 6f 6c 55 70 5d 3b 0a 20 20 20 20 70 2d  [nColUp];.    p-
45f0: 3e 69 50 72 6e 20 3d 20 30 78 36 38 39 65 39 36  >iPrn = 0x689e96
4600: 32 64 2a 28 75 33 32 29 6e 43 6f 6c 20 5e 20 30  2d*(u32)nCol ^ 0
4610: 78 64 30 39 34 34 35 36 35 2a 28 75 33 32 29 73  xd0944565*(u32)s
4620: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
4630: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 0a 20 20  (argv[2]);.  .  
4640: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
4650: 53 74 61 74 34 41 63 63 75 6d 2e 61 5b 5d 20 61  Stat4Accum.a[] a
4660: 6e 64 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79  nd aBest[] array
4670: 73 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 20 3d 20  s */.    p->a = 
4680: 28 73 74 72 75 63 74 20 53 74 61 74 34 53 61 6d  (struct Stat4Sam
4690: 70 6c 65 2a 29 26 70 2d 3e 63 75 72 72 65 6e 74  ple*)&p->current
46a0: 2e 61 6e 4c 74 5b 6e 43 6f 6c 55 70 5d 3b 0a 20  .anLt[nColUp];. 
46b0: 20 20 20 70 2d 3e 61 42 65 73 74 20 3d 20 26 70     p->aBest = &p
46c0: 2d 3e 61 5b 6d 78 53 61 6d 70 6c 65 5d 3b 0a 20  ->a[mxSample];. 
46d0: 20 20 20 70 53 70 61 63 65 20 3d 20 28 75 38 2a     pSpace = (u8*
46e0: 29 28 26 70 2d 3e 61 5b 6d 78 53 61 6d 70 6c 65  )(&p->a[mxSample
46f0: 2b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 66 6f 72  +nCol]);.    for
4700: 28 69 3d 30 3b 20 69 3c 28 6d 78 53 61 6d 70 6c  (i=0; i<(mxSampl
4710: 65 2b 6e 43 6f 6c 29 3b 20 69 2b 2b 29 7b 0a 20  e+nCol); i++){. 
4720: 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 45       p->a[i].anE
4730: 71 20 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29 70  q = (tRowcnt *)p
4740: 53 70 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d  Space; pSpace +=
4750: 20 28 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74   (sizeof(tRowcnt
4760: 29 20 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20 20  ) * nColUp);.   
4770: 20 20 20 70 2d 3e 61 5b 69 5d 2e 61 6e 4c 74 20     p->a[i].anLt 
4780: 3d 20 28 74 52 6f 77 63 6e 74 20 2a 29 70 53 70  = (tRowcnt *)pSp
4790: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 28  ace; pSpace += (
47a0: 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20  sizeof(tRowcnt) 
47b0: 2a 20 6e 43 6f 6c 55 70 29 3b 0a 20 20 20 20 20  * nColUp);.     
47c0: 20 70 2d 3e 61 5b 69 5d 2e 61 6e 44 4c 74 20 3d   p->a[i].anDLt =
47d0: 20 28 74 52 6f 77 63 6e 74 20 2a 29 70 53 70 61   (tRowcnt *)pSpa
47e0: 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 28 73  ce; pSpace += (s
47f0: 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 20 2a  izeof(tRowcnt) *
4800: 20 6e 43 6f 6c 55 70 29 3b 0a 20 20 20 20 7d 0a   nColUp);.    }.
4810: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 70      assert( (pSp
4820: 61 63 65 20 2d 20 28 75 38 2a 29 70 29 3d 3d 6e  ace - (u8*)p)==n
4830: 20 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69   );.  .    for(i
4840: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
4850: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 42 65 73 74  {.      p->aBest
4860: 5b 69 5d 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20  [i].iCol = i;.  
4870: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
4880: 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
4890: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
48a0: 6f 63 61 74 65 64 20 6f 62 6a 65 63 74 20 74 6f  ocated object to
48b0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 4e 6f   the caller.  No
48c0: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 6f 6e 6c  te that.  ** onl
48d0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 20 28 74  y the pointer (t
48e0: 68 65 20 32 6e 64 20 70 61 72 61 6d 65 74 65 72  he 2nd parameter
48f0: 29 20 6d 61 74 74 65 72 73 2e 20 20 54 68 65 20  ) matters.  The 
4900: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 62 6a 65  size of the obje
4910: 63 74 0a 20 20 2a 2a 20 28 67 69 76 65 6e 20 62  ct.  ** (given b
4920: 79 20 74 68 65 20 33 72 64 20 70 61 72 61 6d 65  y the 3rd parame
4930: 74 65 72 29 20 69 73 20 6e 65 76 65 72 20 75 73  ter) is never us
4940: 65 64 20 61 6e 64 20 63 61 6e 20 62 65 20 61 6e  ed and can be an
4950: 79 20 70 6f 73 69 74 69 76 65 0a 20 20 2a 2a 20  y positive.  ** 
4960: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  value. */.  sqli
4970: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28  te3_result_blob(
4980: 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 69 7a 65  context, p, size
4990: 6f 66 28 2a 70 29 2c 20 73 74 61 74 34 44 65 73  of(*p), stat4Des
49a0: 74 72 75 63 74 6f 72 29 3b 0a 7d 0a 73 74 61 74  tructor);.}.stat
49b0: 69 63 20 63 6f 6e 73 74 20 46 75 6e 63 44 65 66  ic const FuncDef
49c0: 20 73 74 61 74 49 6e 69 74 46 75 6e 63 64 65 66   statInitFuncdef
49d0: 20 3d 20 7b 0a 20 20 32 2b 49 73 53 74 61 74 33   = {.  2+IsStat3
49e0: 34 2c 20 20 20 20 20 20 2f 2a 20 6e 41 72 67 20  4,      /* nArg 
49f0: 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 55 54 46 38  */.  SQLITE_UTF8
4a00: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61  ,     /* funcFla
4a10: 67 73 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  gs */.  0,      
4a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
4a30: 72 44 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20  rData */.  0,   
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
4a50: 4e 65 78 74 20 2a 2f 0a 20 20 73 74 61 74 49 6e  Next */.  statIn
4a60: 69 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 53  it,        /* xS
4a70: 46 75 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Func */.  0,    
4a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
4a90: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 22 73 74  inalize */.  "st
4aa0: 61 74 5f 69 6e 69 74 22 2c 20 20 20 20 20 2f 2a  at_init",     /*
4ab0: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7b 30 7d 0a   zName */.  {0}.
4ac0: 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  };..#ifdef SQLIT
4ad0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 34 0a 2f  E_ENABLE_STAT4./
4ae0: 2a 0a 2a 2a 20 70 4e 65 77 20 61 6e 64 20 70 4f  *.** pNew and pO
4af0: 6c 64 20 61 72 65 20 62 6f 74 68 20 63 61 6e 64  ld are both cand
4b00: 69 64 61 74 65 20 6e 6f 6e 2d 70 65 72 69 6f 64  idate non-period
4b10: 69 63 20 73 61 6d 70 6c 65 73 20 73 65 6c 65 63  ic samples selec
4b20: 74 65 64 20 66 6f 72 20 0a 2a 2a 20 74 68 65 20  ted for .** the 
4b30: 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 70 4e 65  same column (pNe
4b40: 77 2d 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69  w->iCol==pOld->i
4b50: 43 6f 6c 29 2e 20 49 67 6e 6f 72 69 6e 67 20 74  Col). Ignoring t
4b60: 68 69 73 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 0a  his column and .
4b70: 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 6f  ** considering o
4b80: 6e 6c 79 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  nly any trailing
4b90: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
4ba0: 20 73 61 6d 70 6c 65 20 68 61 73 68 20 76 61 6c   sample hash val
4bb0: 75 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  ue, this.** func
4bc0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
4bd0: 65 20 69 66 20 73 61 6d 70 6c 65 20 70 4e 65 77  e if sample pNew
4be0: 20 69 73 20 74 6f 20 62 65 20 70 72 65 66 65 72   is to be prefer
4bf0: 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a 2a  red over pOld..*
4c00: 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
4c10: 2c 20 69 66 20 77 65 20 61 73 73 75 6d 65 20 74  , if we assume t
4c20: 68 61 74 20 74 68 65 20 63 61 72 64 69 6e 61 6c  hat the cardinal
4c30: 69 74 69 65 73 20 6f 66 20 74 68 65 20 73 65 6c  ities of the sel
4c40: 65 63 74 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  ected.** column 
4c50: 66 6f 72 20 70 4e 65 77 20 61 6e 64 20 70 4f 6c  for pNew and pOl
4c60: 64 20 61 72 65 20 65 71 75 61 6c 2c 20 69 73 20  d are equal, is 
4c70: 70 4e 65 77 20 74 6f 20 62 65 20 70 72 65 66 65  pNew to be prefe
4c80: 72 72 65 64 20 6f 76 65 72 20 70 4f 6c 64 2e 0a  rred over pOld..
4c90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4ca0: 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
4cb0: 20 66 6f 72 20 65 61 63 68 20 61 72 67 75 6d 65   for each argume
4cc0: 6e 74 20 73 61 6d 70 6c 65 2c 20 74 68 65 20 63  nt sample, the c
4cd0: 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68  ontents of.** th
4ce0: 65 20 61 6e 45 71 5b 5d 20 61 72 72 61 79 20 66  e anEq[] array f
4cf0: 72 6f 6d 20 70 53 61 6d 70 6c 65 2d 3e 61 6e 45  rom pSample->anE
4d00: 71 5b 70 53 61 6d 70 6c 65 2d 3e 69 43 6f 6c 2b  q[pSample->iCol+
4d10: 31 5d 20 6f 6e 77 61 72 64 73 20 61 72 65 20 76  1] onwards are v
4d20: 61 6c 69 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  alid. .*/.static
4d30: 20 69 6e 74 20 73 61 6d 70 6c 65 49 73 42 65 74   int sampleIsBet
4d40: 74 65 72 50 6f 73 74 28 0a 20 20 53 74 61 74 34  terPost(.  Stat4
4d50: 41 63 63 75 6d 20 2a 70 41 63 63 75 6d 2c 20 0a  Accum *pAccum, .
4d60: 20 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70    Stat4Sample *p
4d70: 4e 65 77 2c 20 0a 20 20 53 74 61 74 34 53 61 6d  New, .  Stat4Sam
4d80: 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a 20 20 69  ple *pOld.){.  i
4d90: 6e 74 20 6e 43 6f 6c 20 3d 20 70 41 63 63 75 6d  nt nCol = pAccum
4da0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b  ->nCol;.  int i;
4db0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
4dc0: 3e 69 43 6f 6c 3d 3d 70 4f 6c 64 2d 3e 69 43 6f  >iCol==pOld->iCo
4dd0: 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4e 65  l );.  for(i=pNe
4de0: 77 2d 3e 69 43 6f 6c 2b 31 3b 20 69 3c 6e 43 6f  w->iCol+1; i<nCo
4df0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
4e00: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3e 70   pNew->anEq[i]>p
4e10: 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72  Old->anEq[i] ) r
4e20: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
4e30: 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 69 5d 3c 70   pNew->anEq[i]<p
4e40: 4f 6c 64 2d 3e 61 6e 45 71 5b 69 5d 20 29 20 72  Old->anEq[i] ) r
4e50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
4e60: 66 28 20 70 4e 65 77 2d 3e 69 48 61 73 68 3e 70  f( pNew->iHash>p
4e70: 4f 6c 64 2d 3e 69 48 61 73 68 20 29 20 72 65 74  Old->iHash ) ret
4e80: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
4e90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
4ea0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4eb0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
4ec0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
4ed0: 75 65 20 69 66 20 70 4e 65 77 20 69 73 20 74 6f  ue if pNew is to
4ee0: 20 62 65 20 70 72 65 66 65 72 72 65 64 20 6f 76   be preferred ov
4ef0: 65 72 20 70 4f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  er pOld..**.** T
4f00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
4f10: 75 6d 65 73 20 74 68 61 74 20 66 6f 72 20 65 61  umes that for ea
4f20: 63 68 20 61 72 67 75 6d 65 6e 74 20 73 61 6d 70  ch argument samp
4f30: 6c 65 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  le, the contents
4f40: 20 6f 66 0a 2a 2a 20 74 68 65 20 61 6e 45 71 5b   of.** the anEq[
4f50: 5d 20 61 72 72 61 79 20 66 72 6f 6d 20 70 53 61  ] array from pSa
4f60: 6d 70 6c 65 2d 3e 61 6e 45 71 5b 70 53 61 6d 70  mple->anEq[pSamp
4f70: 6c 65 2d 3e 69 43 6f 6c 5d 20 6f 6e 77 61 72 64  le->iCol] onward
4f80: 73 20 61 72 65 20 76 61 6c 69 64 2e 20 0a 2a 2f  s are valid. .*/
4f90: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6d 70  .static int samp
4fa0: 6c 65 49 73 42 65 74 74 65 72 28 0a 20 20 53 74  leIsBetter(.  St
4fb0: 61 74 34 41 63 63 75 6d 20 2a 70 41 63 63 75 6d  at4Accum *pAccum
4fc0: 2c 20 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  , .  Stat4Sample
4fd0: 20 2a 70 4e 65 77 2c 20 0a 20 20 53 74 61 74 34   *pNew, .  Stat4
4fe0: 53 61 6d 70 6c 65 20 2a 70 4f 6c 64 0a 29 7b 0a  Sample *pOld.){.
4ff0: 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 4e 65 77    tRowcnt nEqNew
5000: 20 3d 20 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e   = pNew->anEq[pN
5010: 65 77 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 74 52 6f  ew->iCol];.  tRo
5020: 77 63 6e 74 20 6e 45 71 4f 6c 64 20 3d 20 70 4f  wcnt nEqOld = pO
5030: 6c 64 2d 3e 61 6e 45 71 5b 70 4f 6c 64 2d 3e 69  ld->anEq[pOld->i
5040: 43 6f 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  Col];..  assert(
5050: 20 70 4f 6c 64 2d 3e 69 73 50 53 61 6d 70 6c 65   pOld->isPSample
5060: 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 69 73 50  ==0 && pNew->isP
5070: 53 61 6d 70 6c 65 3d 3d 30 20 29 3b 0a 20 20 61  Sample==0 );.  a
5080: 73 73 65 72 74 28 20 49 73 53 74 61 74 34 20 7c  ssert( IsStat4 |
5090: 7c 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 30  | (pNew->iCol==0
50a0: 20 26 26 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3d 3d   && pOld->iCol==
50b0: 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 28 6e 45  0) );..  if( (nE
50c0: 71 4e 65 77 3e 6e 45 71 4f 6c 64 29 20 29 20 72  qNew>nEqOld) ) r
50d0: 65 74 75 72 6e 20 31 3b 0a 23 69 66 64 65 66 20  eturn 1;.#ifdef 
50e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
50f0: 41 54 34 0a 20 20 69 66 28 20 6e 45 71 4e 65 77  AT4.  if( nEqNew
5100: 3d 3d 6e 45 71 4f 6c 64 20 29 7b 0a 20 20 20 20  ==nEqOld ){.    
5110: 69 66 28 20 70 4e 65 77 2d 3e 69 43 6f 6c 3c 70  if( pNew->iCol<p
5120: 4f 6c 64 2d 3e 69 43 6f 6c 20 29 20 72 65 74 75  Old->iCol ) retu
5130: 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 1;.    return
5140: 20 28 70 4e 65 77 2d 3e 69 43 6f 6c 3d 3d 70 4f   (pNew->iCol==pO
5150: 6c 64 2d 3e 69 43 6f 6c 20 26 26 20 73 61 6d 70  ld->iCol && samp
5160: 6c 65 49 73 42 65 74 74 65 72 50 6f 73 74 28 70  leIsBetterPost(p
5170: 41 63 63 75 6d 2c 20 70 4e 65 77 2c 20 70 4f 6c  Accum, pNew, pOl
5180: 64 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  d));.  }.  retur
5190: 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  n 0;.#else.  ret
51a0: 75 72 6e 20 28 6e 45 71 4e 65 77 3d 3d 6e 45 71  urn (nEqNew==nEq
51b0: 4f 6c 64 20 26 26 20 70 4e 65 77 2d 3e 69 48 61  Old && pNew->iHa
51c0: 73 68 3e 70 4f 6c 64 2d 3e 69 48 61 73 68 29 3b  sh>pOld->iHash);
51d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
51e0: 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
51f0: 74 73 20 6f 66 20 73 61 6d 70 6c 65 20 2a 70 4e  ts of sample *pN
5200: 65 77 20 69 6e 74 6f 20 74 68 65 20 70 2d 3e 61  ew into the p->a
5210: 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 6e 65 63  [] array. If nec
5220: 65 73 73 61 72 79 2c 0a 2a 2a 20 72 65 6d 6f 76  essary,.** remov
5230: 65 20 74 68 65 20 6c 65 61 73 74 20 64 65 73 69  e the least desi
5240: 72 61 62 6c 65 20 73 61 6d 70 6c 65 20 66 72 6f  rable sample fro
5250: 6d 20 70 2d 3e 61 5b 5d 20 74 6f 20 6d 61 6b 65  m p->a[] to make
5260: 20 72 6f 6f 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63   room..*/.static
5270: 20 76 6f 69 64 20 73 61 6d 70 6c 65 49 6e 73 65   void sampleInse
5280: 72 74 28 53 74 61 74 34 41 63 63 75 6d 20 2a 70  rt(Stat4Accum *p
5290: 2c 20 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70  , Stat4Sample *p
52a0: 4e 65 77 2c 20 69 6e 74 20 6e 45 71 5a 65 72 6f  New, int nEqZero
52b0: 29 7b 0a 20 20 53 74 61 74 34 53 61 6d 70 6c 65  ){.  Stat4Sample
52c0: 20 2a 70 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20   *pSample = 0;. 
52d0: 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
52e0: 74 28 20 49 73 53 74 61 74 34 20 7c 7c 20 6e 45  t( IsStat4 || nE
52f0: 71 5a 65 72 6f 3d 3d 30 20 29 3b 0a 0a 23 69 66  qZero==0 );..#if
5300: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5310: 45 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 4e  E_STAT4.  if( pN
5320: 65 77 2d 3e 69 73 50 53 61 6d 70 6c 65 3d 3d 30  ew->isPSample==0
5330: 20 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d   ){.    Stat4Sam
5340: 70 6c 65 20 2a 70 55 70 67 72 61 64 65 20 3d 20  ple *pUpgrade = 
5350: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5360: 4e 65 77 2d 3e 61 6e 45 71 5b 70 4e 65 77 2d 3e  New->anEq[pNew->
5370: 69 43 6f 6c 5d 3e 30 20 29 3b 0a 0a 20 20 20 20  iCol]>0 );..    
5380: 2f 2a 20 54 68 69 73 20 73 61 6d 70 6c 65 20 69  /* This sample i
5390: 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 62 65  s being added be
53a0: 63 61 75 73 65 20 74 68 65 20 70 72 65 66 69 78  cause the prefix
53b0: 20 74 68 61 74 20 65 6e 64 73 20 69 6e 20 63 6f   that ends in co
53c0: 6c 75 6d 6e 20 0a 20 20 20 20 2a 2a 20 69 43 6f  lumn .    ** iCo
53d0: 6c 20 6f 63 63 75 72 73 20 6d 61 6e 79 20 74 69  l occurs many ti
53e0: 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mes in the table
53f0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 77 65  . However, if we
5400: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
5410: 20 20 2a 2a 20 61 64 64 65 64 20 61 20 73 61 6d    ** added a sam
5420: 70 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20  ple that shares 
5430: 74 68 69 73 20 70 72 65 66 69 78 2c 20 74 68 65  this prefix, the
5440: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
5450: 20 61 64 64 0a 20 20 20 20 2a 2a 20 74 68 69 73   add.    ** this
5460: 20 6f 6e 65 2e 20 49 6e 73 74 65 61 64 2c 20 75   one. Instead, u
5470: 70 67 72 61 64 65 20 74 68 65 20 70 72 69 6f 72  pgrade the prior
5480: 69 74 79 20 6f 66 20 74 68 65 20 68 69 67 68 65  ity of the highe
5490: 73 74 20 70 72 69 6f 72 69 74 79 0a 20 20 20 20  st priority.    
54a0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 73 61 6d 70  ** existing samp
54b0: 6c 65 20 74 68 61 74 20 73 68 61 72 65 73 20 74  le that shares t
54c0: 68 69 73 20 70 72 65 66 69 78 2e 20 20 2a 2f 0a  his prefix.  */.
54d0: 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61      for(i=p->nSa
54e0: 6d 70 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  mple-1; i>=0; i-
54f0: 2d 29 7b 0a 20 20 20 20 20 20 53 74 61 74 34 53  -){.      Stat4S
5500: 61 6d 70 6c 65 20 2a 70 4f 6c 64 20 3d 20 26 70  ample *pOld = &p
5510: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->a[i];.      if
5520: 28 20 70 4f 6c 64 2d 3e 61 6e 45 71 5b 70 4e 65  ( pOld->anEq[pNe
5530: 77 2d 3e 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20  w->iCol]==0 ){. 
5540: 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
5550: 3e 69 73 50 53 61 6d 70 6c 65 20 29 20 72 65 74  >isPSample ) ret
5560: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
5570: 65 72 74 28 20 70 4f 6c 64 2d 3e 69 43 6f 6c 3e  ert( pOld->iCol>
5580: 70 4e 65 77 2d 3e 69 43 6f 6c 20 29 3b 0a 20 20  pNew->iCol );.  
5590: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61        assert( sa
55a0: 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c 20  mpleIsBetter(p, 
55b0: 70 4e 65 77 2c 20 70 4f 6c 64 29 20 29 3b 0a 20  pNew, pOld) );. 
55c0: 20 20 20 20 20 20 20 69 66 28 20 70 55 70 67 72         if( pUpgr
55d0: 61 64 65 3d 3d 30 20 7c 7c 20 73 61 6d 70 6c 65  ade==0 || sample
55e0: 49 73 42 65 74 74 65 72 28 70 2c 20 70 4f 6c 64  IsBetter(p, pOld
55f0: 2c 20 70 55 70 67 72 61 64 65 29 20 29 7b 0a 20  , pUpgrade) ){. 
5600: 20 20 20 20 20 20 20 20 20 70 55 70 67 72 61 64           pUpgrad
5610: 65 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  e = pOld;.      
5620: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5630: 7d 0a 20 20 20 20 69 66 28 20 70 55 70 67 72 61  }.    if( pUpgra
5640: 64 65 20 29 7b 0a 20 20 20 20 20 20 70 55 70 67  de ){.      pUpg
5650: 72 61 64 65 2d 3e 69 43 6f 6c 20 3d 20 70 4e 65  rade->iCol = pNe
5660: 77 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70  w->iCol;.      p
5670: 55 70 67 72 61 64 65 2d 3e 61 6e 45 71 5b 70 55  Upgrade->anEq[pU
5680: 70 67 72 61 64 65 2d 3e 69 43 6f 6c 5d 20 3d 20  pgrade->iCol] = 
5690: 70 4e 65 77 2d 3e 61 6e 45 71 5b 70 55 70 67 72  pNew->anEq[pUpgr
56a0: 61 64 65 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 20 20  ade->iCol];.    
56b0: 20 20 67 6f 74 6f 20 66 69 6e 64 5f 6e 65 77 5f    goto find_new_
56c0: 6d 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  min;.    }.  }.#
56d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6e  endif..  /* If n
56e0: 65 63 65 73 73 61 72 79 2c 20 72 65 6d 6f 76 65  ecessary, remove
56f0: 20 73 61 6d 70 6c 65 20 69 4d 69 6e 20 74 6f 20   sample iMin to 
5700: 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
5710: 65 20 6e 65 77 20 73 61 6d 70 6c 65 2e 20 2a 2f  e new sample. */
5720: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
5730: 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20 29  e>=p->mxSample )
5740: 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70 6c  {.    Stat4Sampl
5750: 65 20 2a 70 4d 69 6e 20 3d 20 26 70 2d 3e 61 5b  e *pMin = &p->a[
5760: 70 2d 3e 69 4d 69 6e 5d 3b 0a 20 20 20 20 74 52  p->iMin];.    tR
5770: 6f 77 63 6e 74 20 2a 61 6e 45 71 20 3d 20 70 4d  owcnt *anEq = pM
5780: 69 6e 2d 3e 61 6e 45 71 3b 0a 20 20 20 20 74 52  in->anEq;.    tR
5790: 6f 77 63 6e 74 20 2a 61 6e 4c 74 20 3d 20 70 4d  owcnt *anLt = pM
57a0: 69 6e 2d 3e 61 6e 4c 74 3b 0a 20 20 20 20 74 52  in->anLt;.    tR
57b0: 6f 77 63 6e 74 20 2a 61 6e 44 4c 74 20 3d 20 70  owcnt *anDLt = p
57c0: 4d 69 6e 2d 3e 61 6e 44 4c 74 3b 0a 20 20 20 20  Min->anDLt;.    
57d0: 73 61 6d 70 6c 65 43 6c 65 61 72 28 70 2d 3e 64  sampleClear(p->d
57e0: 62 2c 20 70 4d 69 6e 29 3b 0a 20 20 20 20 6d 65  b, pMin);.    me
57f0: 6d 6d 6f 76 65 28 70 4d 69 6e 2c 20 26 70 4d 69  mmove(pMin, &pMi
5800: 6e 5b 31 5d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  n[1], sizeof(p->
5810: 61 5b 30 5d 29 2a 28 70 2d 3e 6e 53 61 6d 70 6c  a[0])*(p->nSampl
5820: 65 2d 70 2d 3e 69 4d 69 6e 2d 31 29 29 3b 0a 20  e-p->iMin-1));. 
5830: 20 20 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d     pSample = &p-
5840: 3e 61 5b 70 2d 3e 6e 53 61 6d 70 6c 65 2d 31 5d  >a[p->nSample-1]
5850: 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 6e  ;.    pSample->n
5860: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Rowid = 0;.    p
5870: 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 20 3d 20 61  Sample->anEq = a
5880: 6e 45 71 3b 0a 20 20 20 20 70 53 61 6d 70 6c 65  nEq;.    pSample
5890: 2d 3e 61 6e 44 4c 74 20 3d 20 61 6e 44 4c 74 3b  ->anDLt = anDLt;
58a0: 0a 20 20 20 20 70 53 61 6d 70 6c 65 2d 3e 61 6e  .    pSample->an
58b0: 4c 74 20 3d 20 61 6e 4c 74 3b 0a 20 20 20 20 70  Lt = anLt;.    p
58c0: 2d 3e 6e 53 61 6d 70 6c 65 20 3d 20 70 2d 3e 6d  ->nSample = p->m
58d0: 78 53 61 6d 70 6c 65 2d 31 3b 0a 20 20 7d 0a 0a  xSample-1;.  }..
58e0: 20 20 2f 2a 20 54 68 65 20 22 72 6f 77 73 20 6c    /* The "rows l
58f0: 65 73 73 2d 74 68 61 6e 22 20 66 6f 72 20 74 68  ess-than" for th
5900: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6d  e rowid column m
5910: 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
5920: 68 61 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66 6f  han that.  ** fo
5930: 72 20 74 68 65 20 6c 61 73 74 20 73 61 6d 70 6c  r the last sampl
5940: 65 20 69 6e 20 74 68 65 20 70 2d 3e 61 5b 5d 20  e in the p->a[] 
5950: 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
5960: 2c 20 74 68 65 20 73 61 6d 70 6c 65 73 20 77 6f  , the samples wo
5970: 75 6c 64 0a 20 20 2a 2a 20 62 65 20 6f 75 74 20  uld.  ** be out 
5980: 6f 66 20 6f 72 64 65 72 2e 20 2a 2f 0a 23 69 66  of order. */.#if
5990: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
59a0: 45 5f 53 54 41 54 34 0a 20 20 61 73 73 65 72 74  E_STAT4.  assert
59b0: 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30 20  ( p->nSample==0 
59c0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
59d0: 3e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >anLt[p->nCol-1]
59e0: 20 3e 20 70 2d 3e 61 5b 70 2d 3e 6e 53 61 6d 70   > p->a[p->nSamp
59f0: 6c 65 2d 31 5d 2e 61 6e 4c 74 5b 70 2d 3e 6e 43  le-1].anLt[p->nC
5a00: 6f 6c 2d 31 5d 20 29 3b 0a 23 65 6e 64 69 66 0a  ol-1] );.#endif.
5a10: 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
5a20: 20 6e 65 77 20 73 61 6d 70 6c 65 20 2a 2f 0a 20   new sample */. 
5a30: 20 70 53 61 6d 70 6c 65 20 3d 20 26 70 2d 3e 61   pSample = &p->a
5a40: 5b 70 2d 3e 6e 53 61 6d 70 6c 65 5d 3b 0a 20 20  [p->nSample];.  
5a50: 73 61 6d 70 6c 65 43 6f 70 79 28 70 2c 20 70 53  sampleCopy(p, pS
5a60: 61 6d 70 6c 65 2c 20 70 4e 65 77 29 3b 0a 20 20  ample, pNew);.  
5a70: 70 2d 3e 6e 53 61 6d 70 6c 65 2b 2b 3b 0a 0a 20  p->nSample++;.. 
5a80: 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69 72   /* Zero the fir
5a90: 73 74 20 6e 45 71 5a 65 72 6f 20 65 6e 74 72 69  st nEqZero entri
5aa0: 65 73 20 69 6e 20 74 68 65 20 61 6e 45 71 5b 5d  es in the anEq[]
5ab0: 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 6d 65 6d   array. */.  mem
5ac0: 73 65 74 28 70 53 61 6d 70 6c 65 2d 3e 61 6e 45  set(pSample->anE
5ad0: 71 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 52 6f  q, 0, sizeof(tRo
5ae0: 77 63 6e 74 29 2a 6e 45 71 5a 65 72 6f 29 3b 0a  wcnt)*nEqZero);.
5af0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5b00: 4e 41 42 4c 45 5f 53 54 41 54 34 0a 20 66 69 6e  NABLE_STAT4. fin
5b10: 64 5f 6e 65 77 5f 6d 69 6e 3a 0a 23 65 6e 64 69  d_new_min:.#endi
5b20: 66 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  f.  if( p->nSamp
5b30: 6c 65 3e 3d 70 2d 3e 6d 78 53 61 6d 70 6c 65 20  le>=p->mxSample 
5b40: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 69 6e 20  ){.    int iMin 
5b50: 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = -1;.    for(i=
5b60: 30 3b 20 69 3c 70 2d 3e 6d 78 53 61 6d 70 6c 65  0; i<p->mxSample
5b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
5b80: 28 20 70 2d 3e 61 5b 69 5d 2e 69 73 50 53 61 6d  ( p->a[i].isPSam
5b90: 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ple ) continue;.
5ba0: 20 20 20 20 20 20 69 66 28 20 69 4d 69 6e 3c 30        if( iMin<0
5bb0: 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74   || sampleIsBett
5bc0: 65 72 28 70 2c 20 26 70 2d 3e 61 5b 69 4d 69 6e  er(p, &p->a[iMin
5bd0: 5d 2c 20 26 70 2d 3e 61 5b 69 5d 29 20 29 7b 0a  ], &p->a[i]) ){.
5be0: 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69          iMin = i
5bf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5c00: 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 69 6e      assert( iMin
5c10: 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4d  >=0 );.    p->iM
5c20: 69 6e 20 3d 20 69 4d 69 6e 3b 0a 20 20 7d 0a 7d  in = iMin;.  }.}
5c30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5c40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
5c50: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
5c60: 2a 20 46 69 65 6c 64 20 69 43 68 6e 67 20 6f 66  * Field iChng of
5c70: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
5c80: 20 73 63 61 6e 6e 65 64 20 68 61 73 20 63 68 61   scanned has cha
5c90: 6e 67 65 64 2e 20 53 6f 20 61 74 20 74 68 69 73  nged. So at this
5ca0: 20 70 6f 69 6e 74 0a 2a 2a 20 70 2d 3e 63 75 72   point.** p->cur
5cb0: 72 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  rent contains a 
5cc0: 73 61 6d 70 6c 65 20 74 68 61 74 20 72 65 66 6c  sample that refl
5cd0: 65 63 74 73 20 74 68 65 20 70 72 65 76 69 6f 75  ects the previou
5ce0: 73 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20  s row of the.** 
5cf0: 69 6e 64 65 78 2e 20 54 68 65 20 76 61 6c 75 65  index. The value
5d00: 20 6f 66 20 61 6e 45 71 5b 69 43 68 6e 67 5d 20   of anEq[iChng] 
5d10: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
5d20: 6e 45 71 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 61  nEq[] elements a
5d30: 72 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 74  re.** correct at
5d40: 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
5d50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 6d 70  static void samp
5d60: 6c 65 50 75 73 68 50 72 65 76 69 6f 75 73 28 53  lePushPrevious(S
5d70: 74 61 74 34 41 63 63 75 6d 20 2a 70 2c 20 69 6e  tat4Accum *p, in
5d80: 74 20 69 43 68 6e 67 29 7b 0a 23 69 66 64 65 66  t iChng){.#ifdef
5d90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5da0: 54 41 54 34 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  TAT4.  int i;.. 
5db0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 79   /* Check if any
5dc0: 20 73 61 6d 70 6c 65 73 20 66 72 6f 6d 20 74 68   samples from th
5dd0: 65 20 61 42 65 73 74 5b 5d 20 61 72 72 61 79 20  e aBest[] array 
5de0: 73 68 6f 75 6c 64 20 62 65 20 70 75 73 68 65 64  should be pushed
5df0: 0a 20 20 2a 2a 20 69 6e 74 6f 20 49 6e 64 65 78  .  ** into Index
5e00: 53 61 6d 70 6c 65 2e 61 5b 5d 20 61 74 20 74 68  Sample.a[] at th
5e10: 69 73 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20  is point.  */.  
5e20: 66 6f 72 28 69 3d 28 70 2d 3e 6e 43 6f 6c 2d 32  for(i=(p->nCol-2
5e30: 29 3b 20 69 3e 3d 69 43 68 6e 67 3b 20 69 2d 2d  ); i>=iChng; i--
5e40: 29 7b 0a 20 20 20 20 53 74 61 74 34 53 61 6d 70  ){.    Stat4Samp
5e50: 6c 65 20 2a 70 42 65 73 74 20 3d 20 26 70 2d 3e  le *pBest = &p->
5e60: 61 42 65 73 74 5b 69 5d 3b 0a 20 20 20 20 70 42  aBest[i];.    pB
5e70: 65 73 74 2d 3e 61 6e 45 71 5b 69 5d 20 3d 20 70  est->anEq[i] = p
5e80: 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69  ->current.anEq[i
5e90: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  ];.    if( p->nS
5ea0: 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53 61 6d 70 6c  ample<p->mxSampl
5eb0: 65 20 7c 7c 20 73 61 6d 70 6c 65 49 73 42 65 74  e || sampleIsBet
5ec0: 74 65 72 28 70 2c 20 70 42 65 73 74 2c 20 26 70  ter(p, pBest, &p
5ed0: 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 29 7b  ->a[p->iMin]) ){
5ee0: 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 49 6e 73  .      sampleIns
5ef0: 65 72 74 28 70 2c 20 70 42 65 73 74 2c 20 69 29  ert(p, pBest, i)
5f00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
5f10: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 6e 45  * Update the anE
5f20: 71 5b 5d 20 66 69 65 6c 64 73 20 6f 66 20 61 6e  q[] fields of an
5f30: 79 20 73 61 6d 70 6c 65 73 20 61 6c 72 65 61 64  y samples alread
5f40: 79 20 63 6f 6c 6c 65 63 74 65 64 2e 20 2a 2f 0a  y collected. */.
5f50: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 61 6d 70    for(i=p->nSamp
5f60: 6c 65 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  le-1; i>=0; i--)
5f70: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
5f80: 20 66 6f 72 28 6a 3d 69 43 68 6e 67 3b 20 6a 3c   for(j=iChng; j<
5f90: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
5fa0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 69 5d       if( p->a[i]
5fb0: 2e 61 6e 45 71 5b 6a 5d 3d 3d 30 20 29 20 70 2d  .anEq[j]==0 ) p-
5fc0: 3e 61 5b 69 5d 2e 61 6e 45 71 5b 6a 5d 20 3d 20  >a[i].anEq[j] = 
5fd0: 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b  p->current.anEq[
5fe0: 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  j];.    }.  }.#e
5ff0: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
6000: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
6010: 53 54 41 54 33 29 20 26 26 20 21 64 65 66 69 6e  STAT3) && !defin
6020: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
6030: 5f 53 54 41 54 34 29 0a 20 20 69 66 28 20 69 43  _STAT4).  if( iC
6040: 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 74 52  hng==0 ){.    tR
6050: 6f 77 63 6e 74 20 6e 4c 74 20 3d 20 70 2d 3e 63  owcnt nLt = p->c
6060: 75 72 72 65 6e 74 2e 61 6e 4c 74 5b 30 5d 3b 0a  urrent.anLt[0];.
6070: 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 45 71 20      tRowcnt nEq 
6080: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 45  = p->current.anE
6090: 71 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  q[0];..    /* Ch
60a0: 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74  eck if this is t
60b0: 6f 20 62 65 20 61 20 70 65 72 69 6f 64 69 63 20  o be a periodic 
60c0: 73 61 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61  sample. If so, a
60d0: 64 64 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  dd it. */.    if
60e0: 28 20 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70  ( (nLt/p->nPSamp
60f0: 6c 65 29 21 3d 28 6e 4c 74 2b 6e 45 71 29 2f 70  le)!=(nLt+nEq)/p
6100: 2d 3e 6e 50 53 61 6d 70 6c 65 20 29 7b 0a 20 20  ->nPSample ){.  
6110: 20 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 69      p->current.i
6120: 73 50 53 61 6d 70 6c 65 20 3d 20 31 3b 0a 20 20  sPSample = 1;.  
6130: 20 20 20 20 73 61 6d 70 6c 65 49 6e 73 65 72 74      sampleInsert
6140: 28 70 2c 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c  (p, &p->current,
6150: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75   0);.      p->cu
6160: 72 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20  rrent.isPSample 
6170: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 0a  = 0;.    }else .
6180: 0a 20 20 20 20 2f 2a 20 4f 72 20 69 66 20 69 74  .    /* Or if it
6190: 20 69 73 20 61 20 6e 6f 6e 2d 70 65 72 69 6f 64   is a non-period
61a0: 69 63 20 73 61 6d 70 6c 65 2e 20 41 64 64 20 69  ic sample. Add i
61b0: 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 74  t in this case t
61c0: 6f 6f 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  oo. */.    if( p
61d0: 2d 3e 6e 53 61 6d 70 6c 65 3c 70 2d 3e 6d 78 53  ->nSample<p->mxS
61e0: 61 6d 70 6c 65 20 0a 20 20 20 20 20 7c 7c 20 73  ample .     || s
61f0: 61 6d 70 6c 65 49 73 42 65 74 74 65 72 28 70 2c  ampleIsBetter(p,
6200: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 26 70   &p->current, &p
6210: 2d 3e 61 5b 70 2d 3e 69 4d 69 6e 5d 29 20 0a 20  ->a[p->iMin]) . 
6220: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 61 6d 70     ){.      samp
6230: 6c 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e  leInsert(p, &p->
6240: 63 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  current, 0);.   
6250: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
6260: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
6270: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
6280: 41 54 34 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  AT4.  UNUSED_PAR
6290: 41 4d 45 54 45 52 28 20 70 20 29 3b 0a 20 20 55  AMETER( p );.  U
62a0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
62b0: 20 69 43 68 6e 67 20 29 3b 0a 23 65 6e 64 69 66   iChng );.#endif
62c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
62d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
62e0: 73 74 61 74 5f 70 75 73 68 20 53 51 4c 20 66 75  stat_push SQL fu
62f0: 6e 63 74 69 6f 6e 3a 20 20 73 74 61 74 5f 70 75  nction:  stat_pu
6300: 73 68 28 50 2c 43 2c 52 29 0a 2a 2a 20 41 72 67  sh(P,C,R).** Arg
6310: 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uments:.**.**   
6320: 20 50 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74   P     Pointer t
6330: 6f 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d  o the Stat4Accum
6340: 20 6f 62 6a 65 63 74 20 63 72 65 61 74 65 64 20   object created 
6350: 62 79 20 73 74 61 74 5f 69 6e 69 74 28 29 0a 2a  by stat_init().*
6360: 2a 20 20 20 20 43 20 20 20 20 20 49 6e 64 65 78  *    C     Index
6370: 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f   of left-most co
6380: 6c 75 6d 6e 20 74 6f 20 64 69 66 66 65 72 20 66  lumn to differ f
6390: 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 72 6f 77  rom previous row
63a0: 0a 2a 2a 20 20 20 20 52 20 20 20 20 20 52 6f 77  .**    R     Row
63b0: 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  id for the curre
63c0: 6e 74 20 72 6f 77 2e 20 20 4d 69 67 68 74 20 62  nt row.  Might b
63d0: 65 20 61 20 6b 65 79 20 72 65 63 6f 72 64 20 66  e a key record f
63e0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 57  or.**          W
63f0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
6400: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
6410: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  SQL function alw
6420: 61 79 73 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ays returns NULL
6430: 2e 20 20 49 74 27 73 20 70 75 72 70 6f 73 65 20  .  It's purpose 
6440: 69 74 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  it to accumulate
6450: 0a 2a 2a 20 73 74 61 74 69 73 74 69 63 61 6c 20  .** statistical 
6460: 64 61 74 61 20 61 6e 64 2f 6f 72 20 73 61 6d 70  data and/or samp
6470: 6c 65 73 20 69 6e 20 74 68 65 20 53 74 61 74 34  les in the Stat4
6480: 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 61 62 6f  Accum object abo
6490: 75 74 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ut the.** index 
64a0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e 20  being analyzed. 
64b0: 20 54 68 65 20 73 74 61 74 5f 67 65 74 28 29 20   The stat_get() 
64c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  SQL function wil
64d0: 6c 20 6c 61 74 65 72 20 62 65 20 75 73 65 64 20  l later be used 
64e0: 74 6f 0a 2a 2a 20 65 78 74 72 61 63 74 20 72 65  to.** extract re
64f0: 6c 65 76 61 6e 74 20 69 6e 66 6f 72 6d 61 74 69  levant informati
6500: 6f 6e 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74  on for construct
6510: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ing the sqlite_s
6520: 74 61 74 4e 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  tatN tables..**.
6530: 2a 2a 20 54 68 65 20 52 20 70 61 72 61 6d 65 74  ** The R paramet
6540: 65 72 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  er is only used 
6550: 66 6f 72 20 53 54 41 54 33 20 61 6e 64 20 53 54  for STAT3 and ST
6560: 41 54 34 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  AT4.*/.static vo
6570: 69 64 20 73 74 61 74 50 75 73 68 28 0a 20 20 73  id statPush(.  s
6580: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6590: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
65a0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
65b0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
65c0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 54 68   int i;..  /* Th
65d0: 65 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  e three function
65e0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
65f0: 53 74 61 74 34 41 63 63 75 6d 20 2a 70 20 3d 20  Stat4Accum *p = 
6600: 28 53 74 61 74 34 41 63 63 75 6d 2a 29 73 71 6c  (Stat4Accum*)sql
6610: 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
6620: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  argv[0]);.  int 
6630: 69 43 68 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  iChng = sqlite3_
6640: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
6650: 5d 29 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  ]);..  UNUSED_PA
6660: 52 41 4d 45 54 45 52 28 20 61 72 67 63 20 29 3b  RAMETER( argc );
6670: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6680: 54 45 52 28 20 63 6f 6e 74 65 78 74 20 29 3b 0a  TER( context );.
6690: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 43 6f    assert( p->nCo
66a0: 6c 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  l>0 );.  assert(
66b0: 20 69 43 68 6e 67 3c 70 2d 3e 6e 43 6f 6c 20 29   iChng<p->nCol )
66c0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 6f 77  ;..  if( p->nRow
66d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
66e0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
66f0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
6700: 63 74 69 6f 6e 2e 20 44 6f 20 69 6e 69 74 69 61  ction. Do initia
6710: 6c 69 7a 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  lization. */.   
6720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6730: 43 6f 6c 3b 20 69 2b 2b 29 20 70 2d 3e 63 75 72  Col; i++) p->cur
6740: 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d 20 31  rent.anEq[i] = 1
6750: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6760: 2a 20 53 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  * Second and sub
6770: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 67 65  sequent calls ge
6780: 74 20 70 72 6f 63 65 73 73 65 64 20 68 65 72 65  t processed here
6790: 20 2a 2f 0a 20 20 20 20 73 61 6d 70 6c 65 50 75   */.    samplePu
67a0: 73 68 50 72 65 76 69 6f 75 73 28 70 2c 20 69 43  shPrevious(p, iC
67b0: 68 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  hng);..    /* Up
67c0: 64 61 74 65 20 61 6e 44 4c 74 5b 5d 2c 20 61 6e  date anDLt[], an
67d0: 4c 74 5b 5d 20 61 6e 64 20 61 6e 45 71 5b 5d 20  Lt[] and anEq[] 
67e0: 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 76  to reflect the v
67f0: 61 6c 75 65 73 20 74 68 61 74 20 61 70 70 6c 79  alues that apply
6800: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 63  .    ** to the c
6810: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
6820: 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20  e index. */.    
6830: 66 6f 72 28 69 3d 30 3b 20 69 3c 69 43 68 6e 67  for(i=0; i<iChng
6840: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
6850: 3e 63 75 72 72 65 6e 74 2e 61 6e 45 71 5b 69 5d  >current.anEq[i]
6860: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
6870: 72 28 69 3d 69 43 68 6e 67 3b 20 69 3c 70 2d 3e  r(i=iChng; i<p->
6880: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6890: 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e 44    p->current.anD
68a0: 4c 74 5b 69 5d 2b 2b 3b 0a 23 69 66 64 65 66 20  Lt[i]++;.#ifdef 
68b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
68c0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
68d0: 20 20 20 70 2d 3e 63 75 72 72 65 6e 74 2e 61 6e     p->current.an
68e0: 4c 74 5b 69 5d 20 2b 3d 20 70 2d 3e 63 75 72 72  Lt[i] += p->curr
68f0: 65 6e 74 2e 61 6e 45 71 5b 69 5d 3b 0a 23 65 6e  ent.anEq[i];.#en
6900: 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  dif.      p->cur
6910: 72 65 6e 74 2e 61 6e 45 71 5b 69 5d 20 3d 20 31  rent.anEq[i] = 1
6920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
6930: 3e 6e 52 6f 77 2b 2b 3b 0a 23 69 66 64 65 66 20  >nRow++;.#ifdef 
6940: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
6950: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69  AT3_OR_STAT4.  i
6960: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
6970: 5f 74 79 70 65 28 61 72 67 76 5b 32 5d 29 3d 3d  _type(argv[2])==
6980: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
6990: 7b 0a 20 20 20 20 73 61 6d 70 6c 65 53 65 74 52  {.    sampleSetR
69a0: 6f 77 69 64 49 6e 74 36 34 28 70 2d 3e 64 62 2c  owidInt64(p->db,
69b0: 20 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 73 71   &p->current, sq
69c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
69d0: 34 28 61 72 67 76 5b 32 5d 29 29 3b 0a 20 20 7d  4(argv[2]));.  }
69e0: 65 6c 73 65 7b 0a 20 20 20 20 73 61 6d 70 6c 65  else{.    sample
69f0: 53 65 74 52 6f 77 69 64 28 70 2d 3e 64 62 2c 20  SetRowid(p->db, 
6a00: 26 70 2d 3e 63 75 72 72 65 6e 74 2c 20 73 71 6c  &p->current, sql
6a10: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
6a20: 28 61 72 67 76 5b 32 5d 29 2c 0a 20 20 20 20 20  (argv[2]),.     
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
6a60: 62 6c 6f 62 28 61 72 67 76 5b 32 5d 29 29 3b 0a  blob(argv[2]));.
6a70: 20 20 7d 0a 20 20 70 2d 3e 63 75 72 72 65 6e 74    }.  p->current
6a80: 2e 69 48 61 73 68 20 3d 20 70 2d 3e 69 50 72 6e  .iHash = p->iPrn
6a90: 20 3d 20 70 2d 3e 69 50 72 6e 2a 31 31 30 33 35   = p->iPrn*11035
6aa0: 31 35 32 34 35 20 2b 20 31 32 33 34 35 3b 0a 23  15245 + 12345;.#
6ab0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
6ac0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
6ad0: 34 0a 20 20 7b 0a 20 20 20 20 74 52 6f 77 63 6e  4.  {.    tRowcn
6ae0: 74 20 6e 4c 74 20 3d 20 70 2d 3e 63 75 72 72 65  t nLt = p->curre
6af0: 6e 74 2e 61 6e 4c 74 5b 70 2d 3e 6e 43 6f 6c 2d  nt.anLt[p->nCol-
6b00: 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  1];..    /* Chec
6b10: 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 6f 20  k if this is to 
6b20: 62 65 20 61 20 70 65 72 69 6f 64 69 63 20 73 61  be a periodic sa
6b30: 6d 70 6c 65 2e 20 49 66 20 73 6f 2c 20 61 64 64  mple. If so, add
6b40: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
6b50: 28 6e 4c 74 2f 70 2d 3e 6e 50 53 61 6d 70 6c 65  (nLt/p->nPSample
6b60: 29 21 3d 28 6e 4c 74 2b 31 29 2f 70 2d 3e 6e 50  )!=(nLt+1)/p->nP
6b70: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
6b80: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 73 50 53 61  p->current.isPSa
6b90: 6d 70 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  mple = 1;.      
6ba0: 70 2d 3e 63 75 72 72 65 6e 74 2e 69 43 6f 6c 20  p->current.iCol 
6bb0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 61 6d 70 6c  = 0;.      sampl
6bc0: 65 49 6e 73 65 72 74 28 70 2c 20 26 70 2d 3e 63  eInsert(p, &p->c
6bd0: 75 72 72 65 6e 74 2c 20 70 2d 3e 6e 43 6f 6c 2d  urrent, p->nCol-
6be0: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 63 75 72  1);.      p->cur
6bf0: 72 65 6e 74 2e 69 73 50 53 61 6d 70 6c 65 20 3d  rent.isPSample =
6c00: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
6c10: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 42 65  * Update the aBe
6c20: 73 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  st[] array. */. 
6c30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 70     for(i=0; i<(p
6c40: 2d 3e 6e 43 6f 6c 2d 31 29 3b 20 69 2b 2b 29 7b  ->nCol-1); i++){
6c50: 0a 20 20 20 20 20 20 70 2d 3e 63 75 72 72 65 6e  .      p->curren
6c60: 74 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20 20 20  t.iCol = i;.    
6c70: 20 20 69 66 28 20 69 3e 3d 69 43 68 6e 67 20 7c    if( i>=iChng |
6c80: 7c 20 73 61 6d 70 6c 65 49 73 42 65 74 74 65 72  | sampleIsBetter
6c90: 50 6f 73 74 28 70 2c 20 26 70 2d 3e 63 75 72 72  Post(p, &p->curr
6ca0: 65 6e 74 2c 20 26 70 2d 3e 61 42 65 73 74 5b 69  ent, &p->aBest[i
6cb0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 61  ]) ){.        sa
6cc0: 6d 70 6c 65 43 6f 70 79 28 70 2c 20 26 70 2d 3e  mpleCopy(p, &p->
6cd0: 61 42 65 73 74 5b 69 5d 2c 20 26 70 2d 3e 63 75  aBest[i], &p->cu
6ce0: 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  rrent);.      }.
6cf0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6d00: 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
6d10: 46 75 6e 63 44 65 66 20 73 74 61 74 50 75 73 68  FuncDef statPush
6d20: 46 75 6e 63 64 65 66 20 3d 20 7b 0a 20 20 32 2b  Funcdef = {.  2+
6d30: 49 73 53 74 61 74 33 34 2c 20 20 20 20 20 20 2f  IsStat34,      /
6d40: 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 53 51 4c 49  * nArg */.  SQLI
6d50: 54 45 5f 55 54 46 38 2c 20 20 20 20 20 2f 2a 20  TE_UTF8,     /* 
6d60: 66 75 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 30  funcFlags */.  0
6d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6d80: 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f 0a  /* pUserData */.
6d90: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
6da0: 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
6db0: 20 73 74 61 74 50 75 73 68 2c 20 20 20 20 20 20   statPush,      
6dc0: 20 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20    /* xSFunc */. 
6dd0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
6de0: 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65 20 2a    /* xFinalize *
6df0: 2f 0a 20 20 22 73 74 61 74 5f 70 75 73 68 22 2c  /.  "stat_push",
6e00: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
6e10: 0a 20 20 7b 30 7d 0a 7d 3b 0a 0a 23 64 65 66 69  .  {0}.};..#defi
6e20: 6e 65 20 53 54 41 54 5f 47 45 54 5f 53 54 41 54  ne STAT_GET_STAT
6e30: 31 20 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1 0          /* 
6e40: 22 73 74 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66  "stat" column of
6e50: 20 73 74 61 74 31 20 74 61 62 6c 65 20 2a 2f 0a   stat1 table */.
6e60: 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54  #define STAT_GET
6e70: 5f 52 4f 57 49 44 20 31 20 20 20 20 20 20 20 20  _ROWID 1        
6e80: 20 20 2f 2a 20 22 72 6f 77 69 64 22 20 63 6f 6c    /* "rowid" col
6e90: 75 6d 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20  umn of stat[34] 
6ea0: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
6eb0: 20 53 54 41 54 5f 47 45 54 5f 4e 45 51 20 20 20   STAT_GET_NEQ   
6ec0: 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 6e  2          /* "n
6ed0: 65 71 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74  eq" column of st
6ee0: 61 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a  at[34] entry */.
6ef0: 23 64 65 66 69 6e 65 20 53 54 41 54 5f 47 45 54  #define STAT_GET
6f00: 5f 4e 4c 54 20 20 20 33 20 20 20 20 20 20 20 20  _NLT   3        
6f10: 20 20 2f 2a 20 22 6e 6c 74 22 20 63 6f 6c 75 6d    /* "nlt" colum
6f20: 6e 20 6f 66 20 73 74 61 74 5b 33 34 5d 20 65 6e  n of stat[34] en
6f30: 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  try */.#define S
6f40: 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20 20 34 20  TAT_GET_NDLT  4 
6f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 6e 64 6c           /* "ndl
6f60: 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 74 61  t" column of sta
6f70: 74 5b 33 34 5d 20 65 6e 74 72 79 20 2a 2f 0a 0a  t[34] entry */..
6f80: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
6f90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
6fa0: 5f 67 65 74 28 50 2c 4a 29 20 53 51 4c 20 66 75  _get(P,J) SQL fu
6fb0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f  nction.  This ro
6fc0: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 75 73 65 64  utine is.** used
6fd0: 20 74 6f 20 71 75 65 72 79 20 73 74 61 74 69 73   to query statis
6fe0: 74 69 63 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  tical informatio
6ff0: 6e 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  n that has been 
7000: 67 61 74 68 65 72 65 64 20 69 6e 74 6f 0a 2a 2a  gathered into.**
7010: 20 74 68 65 20 53 74 61 74 34 41 63 63 75 6d 20   the Stat4Accum 
7020: 6f 62 6a 65 63 74 20 62 79 20 70 72 69 6f 72 20  object by prior 
7030: 63 61 6c 6c 73 20 74 6f 20 73 74 61 74 5f 70 75  calls to stat_pu
7040: 73 68 28 29 2e 20 20 54 68 65 20 50 20 70 61 72  sh().  The P par
7050: 61 6d 65 74 65 72 0a 2a 2a 20 68 61 73 20 74 79  ameter.** has ty
7060: 70 65 20 42 4c 4f 42 20 62 75 74 20 69 74 20 69  pe BLOB but it i
7070: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
7080: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53  pointer to the S
7090: 74 61 74 34 41 63 63 75 6d 20 6f 62 6a 65 63 74  tat4Accum object
70a0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  ..** The content
70b0: 20 74 6f 20 72 65 74 75 72 6e 65 64 20 69 73 20   to returned is 
70c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
70d0: 65 20 70 61 72 61 6d 65 74 65 72 20 4a 0a 2a 2a  e parameter J.**
70e0: 20 77 68 69 63 68 20 69 73 20 6f 6e 65 20 6f 66   which is one of
70f0: 20 74 68 65 20 53 54 41 54 5f 47 45 54 5f 78 78   the STAT_GET_xx
7100: 78 78 20 76 61 6c 75 65 73 20 64 65 66 69 6e 65  xx values define
7110: 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49  d above..**.** I
7120: 66 20 6e 65 69 74 68 65 72 20 53 54 41 54 33 20  f neither STAT3 
7130: 6e 6f 72 20 53 54 41 54 34 20 61 72 65 20 65 6e  nor STAT4 are en
7140: 61 62 6c 65 64 2c 20 74 68 65 6e 20 4a 20 69 73  abled, then J is
7150: 20 61 6c 77 61 79 73 0a 2a 2a 20 53 54 41 54 5f   always.** STAT_
7160: 47 45 54 5f 53 54 41 54 31 20 61 6e 64 20 69 73  GET_STAT1 and is
7170: 20 68 65 6e 63 65 20 6f 6d 69 74 74 65 64 20 61   hence omitted a
7180: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
7190: 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 6f 6e 65  becomes.** a one
71a0: 2d 70 61 72 61 6d 65 74 65 72 20 66 75 6e 63 74  -parameter funct
71b0: 69 6f 6e 2c 20 73 74 61 74 5f 67 65 74 28 50 29  ion, stat_get(P)
71c0: 2c 20 74 68 61 74 20 61 6c 77 61 79 73 20 72 65  , that always re
71d0: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 73 74 61  turns the.** sta
71e0: 74 31 20 74 61 62 6c 65 20 65 6e 74 72 79 20 69  t1 table entry i
71f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
7200: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74 47  tatic void statG
7210: 65 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  et(.  sqlite3_co
7220: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
7230: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
7240: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7250: 67 76 0a 29 7b 0a 20 20 53 74 61 74 34 41 63 63  gv.){.  Stat4Acc
7260: 75 6d 20 2a 70 20 3d 20 28 53 74 61 74 34 41 63  um *p = (Stat4Ac
7270: 63 75 6d 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  cum*)sqlite3_val
7280: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
7290: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
72a0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
72b0: 53 54 41 54 34 0a 20 20 2f 2a 20 53 54 41 54 33  STAT4.  /* STAT3
72c0: 20 61 6e 64 20 53 54 41 54 34 20 68 61 76 65 20   and STAT4 have 
72d0: 61 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 20 74  a parameter on t
72e0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  his routine. */.
72f0: 20 20 69 6e 74 20 65 43 61 6c 6c 20 3d 20 73 71    int eCall = sq
7300: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
7310: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 61 73 73 65  argv[1]);.  asse
7320: 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20  rt( argc==2 );. 
7330: 20 61 73 73 65 72 74 28 20 65 43 61 6c 6c 3d 3d   assert( eCall==
7340: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 7c  STAT_GET_STAT1 |
7350: 7c 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45  | eCall==STAT_GE
7360: 54 5f 4e 45 51 20 0a 20 20 20 20 20 20 20 7c 7c  T_NEQ .       ||
7370: 20 65 43 61 6c 6c 3d 3d 53 54 41 54 5f 47 45 54   eCall==STAT_GET
7380: 5f 52 4f 57 49 44 20 7c 7c 20 65 43 61 6c 6c 3d  _ROWID || eCall=
7390: 3d 53 54 41 54 5f 47 45 54 5f 4e 4c 54 0a 20 20  =STAT_GET_NLT.  
73a0: 20 20 20 20 20 7c 7c 20 65 43 61 6c 6c 3d 3d 53       || eCall==S
73b0: 54 41 54 5f 47 45 54 5f 4e 44 4c 54 20 0a 20 20  TAT_GET_NDLT .  
73c0: 29 3b 0a 20 20 69 66 28 20 65 43 61 6c 6c 3d 3d  );.  if( eCall==
73d0: 53 54 41 54 5f 47 45 54 5f 53 54 41 54 31 20 29  STAT_GET_STAT1 )
73e0: 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28  .#else.  assert(
73f0: 20 61 72 67 63 3d 3d 31 20 29 3b 0a 23 65 6e 64   argc==1 );.#end
7400: 69 66 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 52 65  if.  {.    /* Re
7410: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 74  turn the value t
7420: 6f 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 22  o store in the "
7430: 73 74 61 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  stat" column of 
7440: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
7450: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 66 6f  .    ** table fo
7460: 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  r this index..  
7470: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
7480: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
7490: 67 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 20  g composed of a 
74a0: 6c 69 73 74 20 6f 66 20 69 6e 74 65 67 65 72 73  list of integers
74b0: 20 64 65 73 63 72 69 62 69 6e 67 20 0a 20 20 20   describing .   
74c0: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 20 54   ** the index. T
74d0: 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
74e0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   in the list is 
74f0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7500: 20 6f 66 20 0a 20 20 20 20 2a 2a 20 65 6e 74 72   of .    ** entr
7510: 69 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ies in the index
7520: 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 61  . There is one a
7530: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 74 65 67 65  dditional intege
7540: 72 20 69 6e 20 74 68 65 20 6c 69 73 74 20 0a 20  r in the list . 
7550: 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20 69     ** for each i
7560: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 54  ndexed column. T
7570: 68 69 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  his additional i
7580: 6e 74 65 67 65 72 20 69 73 20 61 6e 20 65 73 74  nteger is an est
7590: 69 6d 61 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20  imate of.    ** 
75a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
75b0: 77 73 20 6d 61 74 63 68 65 64 20 62 79 20 61 20  ws matched by a 
75c0: 73 74 61 62 62 69 6e 67 20 71 75 65 72 79 20 6f  stabbing query o
75d0: 6e 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  n the index usin
75e0: 67 0a 20 20 20 20 2a 2a 20 61 20 6b 65 79 20 77  g.    ** a key w
75f0: 69 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ith the correspo
7600: 6e 64 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  nding number of 
7610: 66 69 65 6c 64 73 2e 20 49 6e 20 6f 74 68 65 72  fields. In other
7620: 20 77 6f 72 64 73 2c 0a 20 20 20 20 2a 2a 20 69   words,.    ** i
7630: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f  f the index is o
7640: 6e 20 63 6f 6c 75 6d 6e 73 20 28 61 2c 62 29 20  n columns (a,b) 
7650: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73  and the sqlite_s
7660: 74 61 74 31 20 76 61 6c 75 65 20 69 73 20 0a 20  tat1 value is . 
7670: 20 20 20 2a 2a 20 22 31 30 30 20 31 30 20 32 22     ** "100 10 2"
7680: 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 65 73  , then SQLite es
7690: 74 69 6d 61 74 65 73 20 74 68 61 74 3a 0a 20 20  timates that:.  
76a0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 2a 20    **.    **   * 
76b0: 74 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  the index contai
76c0: 6e 73 20 31 30 30 20 72 6f 77 73 2c 0a 20 20 20  ns 100 rows,.   
76d0: 20 2a 2a 20 20 20 2a 20 22 57 48 45 52 45 20 61   **   * "WHERE a
76e0: 3d 3f 22 20 6d 61 74 63 68 65 73 20 31 30 20 72  =?" matches 10 r
76f0: 6f 77 73 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ows, and.    ** 
7700: 20 20 2a 20 22 57 48 45 52 45 20 61 3d 3f 20 41    * "WHERE a=? A
7710: 4e 44 20 62 3d 3f 22 20 6d 61 74 63 68 65 73 20  ND b=?" matches 
7720: 32 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 0a 20  2 rows..    **. 
7730: 20 20 20 2a 2a 20 49 66 20 44 20 69 73 20 74 68     ** If D is th
7740: 65 20 63 6f 75 6e 74 20 6f 66 20 64 69 73 74 69  e count of disti
7750: 6e 63 74 20 76 61 6c 75 65 73 20 61 6e 64 20 4b  nct values and K
7760: 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
7770: 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 2a 2a 20  mber of .    ** 
7780: 72 6f 77 73 2c 20 74 68 65 6e 20 65 61 63 68 20  rows, then each 
7790: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6d 70  estimate is comp
77a0: 75 74 65 64 20 61 73 3a 0a 20 20 20 20 2a 2a 0a  uted as:.    **.
77b0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 49 20      **        I 
77c0: 3d 20 28 4b 2b 44 2d 31 29 2f 44 0a 20 20 20 20  = (K+D-1)/D.    
77d0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  */.    char *z;.
77e0: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
77f0: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 73 71 6c  char *zRet = sql
7800: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
7810: 28 70 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 29 2a 32  (p->nKeyCol+1)*2
7820: 35 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65  5 );.    if( zRe
7830: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
7840: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7850: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
7860: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
7870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
7880: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 34 2c  te3_snprintf(24,
7890: 20 7a 52 65 74 2c 20 22 25 6c 6c 75 22 2c 20 28   zRet, "%llu", (
78a0: 75 36 34 29 70 2d 3e 6e 52 6f 77 29 3b 0a 20 20  u64)p->nRow);.  
78b0: 20 20 7a 20 3d 20 7a 52 65 74 20 2b 20 73 71 6c    z = zRet + sql
78c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 52 65  ite3Strlen30(zRe
78d0: 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
78e0: 20 69 3c 70 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69   i<p->nKeyCol; i
78f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 75 36 34 20 6e  ++){.      u64 n
7900: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 63 75  Distinct = p->cu
7910: 72 72 65 6e 74 2e 61 6e 44 4c 74 5b 69 5d 20 2b  rrent.anDLt[i] +
7920: 20 31 3b 0a 20 20 20 20 20 20 75 36 34 20 69 56   1;.      u64 iV
7930: 61 6c 20 3d 20 28 70 2d 3e 6e 52 6f 77 20 2b 20  al = (p->nRow + 
7940: 6e 44 69 73 74 69 6e 63 74 20 2d 20 31 29 20 2f  nDistinct - 1) /
7950: 20 6e 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20   nDistinct;.    
7960: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7970: 74 66 28 32 34 2c 20 7a 2c 20 22 20 25 6c 6c 75  tf(24, z, " %llu
7980: 22 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  ", iVal);.      
7990: 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
79a0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 61  en30(z);.      a
79b0: 73 73 65 72 74 28 20 70 2d 3e 63 75 72 72 65 6e  ssert( p->curren
79c0: 74 2e 61 6e 45 71 5b 69 5d 20 29 3b 0a 20 20 20  t.anEq[i] );.   
79d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a   }.    assert( z
79e0: 5b 30 5d 3d 3d 27 5c 30 27 20 26 26 20 7a 3e 7a  [0]=='\0' && z>z
79f0: 52 65 74 20 29 3b 0a 0a 20 20 20 20 73 71 6c 69  Ret );..    sqli
7a00: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
7a10: 63 6f 6e 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d  context, zRet, -
7a20: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
7a30: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
7a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
7a50: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 65 6c 73 65  _OR_STAT4.  else
7a60: 20 69 66 28 20 65 43 61 6c 6c 3d 3d 53 54 41 54   if( eCall==STAT
7a70: 5f 47 45 54 5f 52 4f 57 49 44 20 29 7b 0a 20 20  _GET_ROWID ){.  
7a80: 20 20 69 66 28 20 70 2d 3e 69 47 65 74 3c 30 20    if( p->iGet<0 
7a90: 29 7b 0a 20 20 20 20 20 20 73 61 6d 70 6c 65 50  ){.      sampleP
7aa0: 75 73 68 50 72 65 76 69 6f 75 73 28 70 2c 20 30  ushPrevious(p, 0
7ab0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 47 65 74  );.      p->iGet
7ac0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7ad0: 69 66 28 20 70 2d 3e 69 47 65 74 3c 70 2d 3e 6e  if( p->iGet<p->n
7ae0: 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
7af0: 53 74 61 74 34 53 61 6d 70 6c 65 20 2a 70 53 20  Stat4Sample *pS 
7b00: 3d 20 70 2d 3e 61 20 2b 20 70 2d 3e 69 47 65 74  = p->a + p->iGet
7b10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 2d 3e  ;.      if( pS->
7b20: 6e 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20  nRowid==0 ){.   
7b30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
7b40: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
7b50: 74 2c 20 70 53 2d 3e 75 2e 69 52 6f 77 69 64 29  t, pS->u.iRowid)
7b60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
7b80: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
7b90: 78 74 2c 20 70 53 2d 3e 75 2e 61 52 6f 77 69 64  xt, pS->u.aRowid
7ba0: 2c 20 70 53 2d 3e 6e 52 6f 77 69 64 2c 0a 20 20  , pS->nRowid,.  
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
7bd0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
7be0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
7bf0: 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  se{.    tRowcnt 
7c00: 2a 61 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  *aCnt = 0;..    
7c10: 61 73 73 65 72 74 28 20 70 2d 3e 69 47 65 74 3c  assert( p->iGet<
7c20: 70 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a 20 20  p->nSample );.  
7c30: 20 20 73 77 69 74 63 68 28 20 65 43 61 6c 6c 20    switch( eCall 
7c40: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 54  ){.      case ST
7c50: 41 54 5f 47 45 54 5f 4e 45 51 3a 20 20 61 43 6e  AT_GET_NEQ:  aCn
7c60: 74 20 3d 20 70 2d 3e 61 5b 70 2d 3e 69 47 65 74  t = p->a[p->iGet
7c70: 5d 2e 61 6e 45 71 3b 20 62 72 65 61 6b 3b 0a 20  ].anEq; break;. 
7c80: 20 20 20 20 20 63 61 73 65 20 53 54 41 54 5f 47       case STAT_G
7c90: 45 54 5f 4e 4c 54 3a 20 20 61 43 6e 74 20 3d 20  ET_NLT:  aCnt = 
7ca0: 70 2d 3e 61 5b 70 2d 3e 69 47 65 74 5d 2e 61 6e  p->a[p->iGet].an
7cb0: 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Lt; break;.     
7cc0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7cd0: 20 20 20 20 61 43 6e 74 20 3d 20 70 2d 3e 61 5b      aCnt = p->a[
7ce0: 70 2d 3e 69 47 65 74 5d 2e 61 6e 44 4c 74 3b 20  p->iGet].anDLt; 
7cf0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 47 65 74  .        p->iGet
7d00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
7d10: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7d20: 0a 0a 20 20 20 20 69 66 28 20 49 73 53 74 61 74  ..    if( IsStat
7d30: 33 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  3 ){.      sqlit
7d40: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
7d50: 63 6f 6e 74 65 78 74 2c 20 28 69 36 34 29 61 43  context, (i64)aC
7d60: 6e 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  nt[0]);.    }els
7d70: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
7d80: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Ret = sqlite3Mal
7d90: 6c 6f 63 5a 65 72 6f 28 70 2d 3e 6e 43 6f 6c 20  locZero(p->nCol 
7da0: 2a 20 32 35 29 3b 0a 20 20 20 20 20 20 69 66 28  * 25);.      if(
7db0: 20 7a 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zRet==0 ){.    
7dc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7dd0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
7de0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
7df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
7e00: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 63 68 61  t i;.        cha
7e10: 72 20 2a 7a 20 3d 20 7a 52 65 74 3b 0a 20 20 20  r *z = zRet;.   
7e20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7e30: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
7e40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7e50: 5f 73 6e 70 72 69 6e 74 66 28 32 34 2c 20 7a 2c  _snprintf(24, z,
7e60: 20 22 25 6c 6c 75 20 22 2c 20 28 75 36 34 29 61   "%llu ", (u64)a
7e70: 43 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Cnt[i]);.       
7e80: 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
7e90: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
7ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
7eb0: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27  sert( z[0]=='\0'
7ec0: 20 26 26 20 7a 3e 7a 52 65 74 20 29 3b 0a 20 20   && z>zRet );.  
7ed0: 20 20 20 20 20 20 7a 5b 2d 31 5d 20 3d 20 27 5c        z[-1] = '\
7ee0: 30 27 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0';.        sqli
7ef0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
7f00: 63 6f 6e 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d  context, zRet, -
7f10: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
7f20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7f30: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
7f40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
7f50: 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 23 69  3_OR_STAT4 */.#i
7f60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
7f70: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
7f80: 4d 45 54 45 52 28 20 61 72 67 63 20 29 3b 0a 23  METER( argc );.#
7f90: 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 63  endif.}.static c
7fa0: 6f 6e 73 74 20 46 75 6e 63 44 65 66 20 73 74 61  onst FuncDef sta
7fb0: 74 47 65 74 46 75 6e 63 64 65 66 20 3d 20 7b 0a  tGetFuncdef = {.
7fc0: 20 20 31 2b 49 73 53 74 61 74 33 34 2c 20 20 20    1+IsStat34,   
7fd0: 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20     /* nArg */.  
7fe0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
7ff0: 20 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20 2a 2f   /* funcFlags */
8000: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
8010: 20 20 20 20 2f 2a 20 70 55 73 65 72 44 61 74 61      /* pUserData
8020: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
8030: 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
8040: 2a 2f 0a 20 20 73 74 61 74 47 65 74 2c 20 20 20  */.  statGet,   
8050: 20 20 20 20 20 20 2f 2a 20 78 53 46 75 6e 63 20        /* xSFunc 
8060: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
8070: 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69        /* xFinali
8080: 7a 65 20 2a 2f 0a 20 20 22 73 74 61 74 5f 67 65  ze */.  "stat_ge
8090: 74 22 2c 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d  t",      /* zNam
80a0: 65 20 2a 2f 0a 20 20 7b 30 7d 0a 7d 3b 0a 0a 73  e */.  {0}.};..s
80b0: 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 53  tatic void callS
80c0: 74 61 74 47 65 74 28 56 64 62 65 20 2a 76 2c 20  tatGet(Vdbe *v, 
80d0: 69 6e 74 20 72 65 67 53 74 61 74 34 2c 20 69 6e  int regStat4, in
80e0: 74 20 69 50 61 72 61 6d 2c 20 69 6e 74 20 72 65  t iParam, int re
80f0: 67 4f 75 74 29 7b 0a 20 20 61 73 73 65 72 74 28  gOut){.  assert(
8100: 20 72 65 67 4f 75 74 21 3d 72 65 67 53 74 61 74   regOut!=regStat
8110: 34 20 26 26 20 72 65 67 4f 75 74 21 3d 72 65 67  4 && regOut!=reg
8120: 53 74 61 74 34 2b 31 20 29 3b 0a 23 69 66 64 65  Stat4+1 );.#ifde
8130: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8140: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
8150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8160: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8170: 2c 20 69 50 61 72 61 6d 2c 20 72 65 67 53 74 61  , iParam, regSta
8180: 74 34 2b 31 29 3b 0a 23 65 6c 69 66 20 53 51 4c  t4+1);.#elif SQL
8190: 49 54 45 5f 44 45 42 55 47 0a 20 20 61 73 73 65  ITE_DEBUG.  asse
81a0: 72 74 28 20 69 50 61 72 61 6d 3d 3d 53 54 41 54  rt( iParam==STAT
81b0: 5f 47 45 54 5f 53 54 41 54 31 20 29 3b 0a 23 65  _GET_STAT1 );.#e
81c0: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
81d0: 41 4d 45 54 45 52 28 20 69 50 61 72 61 6d 20 29  AMETER( iParam )
81e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
81f0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
8200: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c  OP_Function0, 0,
8210: 20 72 65 67 53 74 61 74 34 2c 20 72 65 67 4f 75   regStat4, regOu
8220: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
8230: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73         (char*)&s
8240: 74 61 74 47 65 74 46 75 6e 63 64 65 66 2c 20 50  tatGetFuncdef, P
8250: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 73 71  4_FUNCDEF);.  sq
8260: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8270: 35 28 76 2c 20 31 20 2b 20 49 73 53 74 61 74 33  5(v, 1 + IsStat3
8280: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  4);.}../*.** Gen
8290: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
82a0: 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20   an analysis of 
82b0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
82c0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  ciated with.** a
82d0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 0a 2a   single table..*
82e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6e  /.static void an
82f0: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 0a 20  alyzeOneTable(. 
8300: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8310: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
8320: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
8330: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61 62  pTab,     /* Tab
8340: 6c 65 20 77 68 6f 73 65 20 69 6e 64 69 63 65 73  le whose indices
8350: 20 61 72 65 20 74 6f 20 62 65 20 61 6e 61 6c 79   are to be analy
8360: 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  zed */.  Index *
8370: 70 4f 6e 6c 79 49 64 78 2c 20 2f 2a 20 49 66 20  pOnlyIdx, /* If 
8380: 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 6e 6c 79 20 61  not NULL, only a
8390: 6e 61 6c 79 7a 65 20 74 68 69 73 20 6f 6e 65 20  nalyze this one 
83a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
83b0: 53 74 61 74 43 75 72 2c 20 20 20 20 2f 2a 20 49  StatCur,    /* I
83c0: 6e 64 65 78 20 6f 66 20 56 64 62 65 43 75 72 73  ndex of VdbeCurs
83d0: 6f 72 20 74 68 61 74 20 77 72 69 74 65 73 20 74  or that writes t
83e0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
83f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
8400: 4d 65 6d 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  Mem,        /* A
8410: 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20  vailable memory 
8420: 6c 6f 63 61 74 69 6f 6e 73 20 62 65 67 69 6e 20  locations begin 
8430: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  here */.  int iT
8440: 61 62 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  ab         /* Ne
8450: 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63 75 72  xt available cur
8460: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  sor */.){.  sqli
8470: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8480: 2d 3e 64 62 3b 20 20 20 20 2f 2a 20 44 61 74 61  ->db;    /* Data
8490: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
84a0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
84c0: 20 41 6e 20 69 6e 64 65 78 20 74 6f 20 62 65 69   An index to bei
84d0: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  ng analyzed */. 
84e0: 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20   int iIdxCur;   
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8500: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
8510: 69 6e 64 65 78 20 62 65 69 6e 67 20 61 6e 61 6c  index being anal
8520: 79 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  yzed */.  int iT
8530: 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  abCur;          
8540: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
8550: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62 65  cursor */.  Vdbe
8560: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
8570: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8580: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
8590: 62 65 69 6e 67 20 62 75 69 6c 74 20 75 70 20 2a  being built up *
85a0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
85d0: 20 2a 2f 0a 20 20 69 6e 74 20 6a 5a 65 72 6f 52   */.  int jZeroR
85e0: 6f 77 73 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  ows = -1;       
85f0: 20 20 20 2f 2a 20 4a 75 6d 70 20 66 72 6f 6d 20     /* Jump from 
8600: 68 65 72 65 20 69 66 20 6e 75 6d 62 65 72 20 6f  here if number o
8610: 66 20 72 6f 77 73 20 69 73 20 7a 65 72 6f 20 2a  f rows is zero *
8620: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
8650: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
8660: 20 70 54 61 62 20 2a 2f 0a 20 20 75 38 20 6e 65   pTab */.  u8 ne
8670: 65 64 54 61 62 6c 65 43 6e 74 20 3d 20 31 3b 20  edTableCnt = 1; 
8680: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
8690: 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 74 61 62  to count the tab
86a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  le */.  int regN
86b0: 65 77 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b  ewRowid = iMem++
86c0: 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f  ;    /* Rowid fo
86d0: 72 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 72  r the inserted r
86e0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72  ecord */.  int r
86f0: 65 67 53 74 61 74 34 20 3d 20 69 4d 65 6d 2b 2b  egStat4 = iMem++
8700: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
8710: 74 65 72 20 74 6f 20 68 6f 6c 64 20 53 74 61 74  ter to hold Stat
8720: 34 41 63 63 75 6d 20 6f 62 6a 65 63 74 20 2a 2f  4Accum object */
8730: 0a 20 20 69 6e 74 20 72 65 67 43 68 6e 67 20 3d  .  int regChng =
8740: 20 69 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20   iMem++;        
8750: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 61 6e  /* Index of chan
8760: 67 65 64 20 69 6e 64 65 78 20 66 69 65 6c 64 20  ged index field 
8770: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8780: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
8790: 5f 53 54 41 54 34 0a 20 20 69 6e 74 20 72 65 67  _STAT4.  int reg
87a0: 52 6f 77 69 64 20 3d 20 69 4d 65 6d 2b 2b 3b 20  Rowid = iMem++; 
87b0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 61        /* Rowid a
87c0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
87d0: 6f 20 73 74 61 74 5f 70 75 73 68 28 29 20 2a 2f  o stat_push() */
87e0: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65  .#endif.  int re
87f0: 67 54 65 6d 70 20 3d 20 69 4d 65 6d 2b 2b 3b 20  gTemp = iMem++; 
8800: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
8810: 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
8820: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 54 61 62   */.  int regTab
8830: 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b 2b 3b 20 20  name = iMem++;  
8840: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63     /* Register c
8850: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 20  ontaining table 
8860: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  name */.  int re
8870: 67 49 64 78 6e 61 6d 65 20 3d 20 69 4d 65 6d 2b  gIdxname = iMem+
8880: 2b 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  +;     /* Regist
8890: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e  er containing in
88a0: 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  dex name */.  in
88b0: 74 20 72 65 67 53 74 61 74 31 20 3d 20 69 4d 65  t regStat1 = iMe
88c0: 6d 2b 2b 3b 20 20 20 20 20 20 20 2f 2a 20 56 61  m++;       /* Va
88d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 74 61 74  lue for the stat
88e0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 73 71 6c 69 74   column of sqlit
88f0: 65 5f 73 74 61 74 31 20 2a 2f 0a 20 20 69 6e 74  e_stat1 */.  int
8900: 20 72 65 67 50 72 65 76 20 3d 20 69 4d 65 6d 3b   regPrev = iMem;
8910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 55 53            /* MUS
8920: 54 20 42 45 20 4c 41 53 54 20 28 73 65 65 20 62  T BE LAST (see b
8930: 65 6c 6f 77 29 20 2a 2f 0a 0a 20 20 70 50 61 72  elow) */..  pPar
8940: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70  se->nMem = MAX(p
8950: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20 69 4d 65  Parse->nMem, iMe
8960: 6d 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  m);.  v = sqlite
8970: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
8980: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
8990: 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29  NEVER(pTab==0) )
89a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
89b0: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e  }.  if( pTab->tn
89c0: 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  um==0 ){.    /* 
89d0: 44 6f 20 6e 6f 74 20 67 61 74 68 65 72 20 73 74  Do not gather st
89e0: 61 74 69 73 74 69 63 73 20 6f 6e 20 76 69 65 77  atistics on view
89f0: 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
8a00: 6c 65 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  les */.    retur
8a10: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  n;.  }.  if( sql
8a20: 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 73 71  ite3_strlike("sq
8a30: 6c 69 74 65 5f 25 22 2c 20 70 54 61 62 2d 3e 7a  lite_%", pTab->z
8a40: 4e 61 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  Name, 0)==0 ){. 
8a50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 67 61 74     /* Do not gat
8a60: 68 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f  her statistics o
8a70: 6e 20 73 79 73 74 65 6d 20 74 61 62 6c 65 73 20  n system tables 
8a80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
8a90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
8aa0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
8ab0: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
8ac0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
8ad0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
8ae0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
8af0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
8b00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8b10: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
8b20: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
8b30: 29 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ) );.#ifndef SQL
8b40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
8b50: 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
8b60: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
8b70: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4e 41  arse, SQLITE_ANA
8b80: 4c 59 5a 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LYZE, pTab->zNam
8b90: 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
8ba0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
8bb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
8bc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
8bd0: 20 45 73 74 61 62 6c 69 73 68 20 61 20 72 65 61   Establish a rea
8be0: 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  d-lock on the ta
8bf0: 62 6c 65 20 61 74 20 74 68 65 20 73 68 61 72 65  ble at the share
8c00: 64 2d 63 61 63 68 65 20 6c 65 76 65 6c 2e 20 0a  d-cache level. .
8c10: 20 20 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    ** Open a read
8c20: 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 6e 20  -only cursor on 
8c30: 74 68 65 20 74 61 62 6c 65 2e 20 41 6c 73 6f 20  the table. Also 
8c40: 61 6c 6c 6f 63 61 74 65 20 61 20 63 75 72 73 6f  allocate a curso
8c50: 72 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 74 6f  r number.  ** to
8c60: 20 75 73 65 20 66 6f 72 20 73 63 61 6e 6e 69 6e   use for scannin
8c70: 67 20 69 6e 64 65 78 65 73 20 28 69 49 64 78 43  g indexes (iIdxC
8c80: 75 72 29 2e 20 4e 6f 20 69 6e 64 65 78 20 63 75  ur). No index cu
8c90: 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 61  rsor is opened a
8ca0: 74 0a 20 20 2a 2a 20 74 68 69 73 20 74 69 6d 65  t.  ** this time
8cb0: 20 74 68 6f 75 67 68 2e 20 20 2a 2f 0a 20 20 73   though.  */.  s
8cc0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
8cd0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
8ce0: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
8cf0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 54 61 62  ->zName);.  iTab
8d00: 43 75 72 20 3d 20 69 54 61 62 2b 2b 3b 0a 20 20  Cur = iTab++;.  
8d10: 69 49 64 78 43 75 72 20 3d 20 69 54 61 62 2b 2b  iIdxCur = iTab++
8d20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  ;.  pParse->nTab
8d30: 20 3d 20 4d 41 58 28 70 50 61 72 73 65 2d 3e 6e   = MAX(pParse->n
8d40: 54 61 62 2c 20 69 54 61 62 29 3b 0a 20 20 73 71  Tab, iTab);.  sq
8d50: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
8d60: 50 61 72 73 65 2c 20 69 54 61 62 43 75 72 2c 20  Parse, iTabCur, 
8d70: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
8d80: 65 6e 52 65 61 64 29 3b 0a 20 20 73 71 6c 69 74  enRead);.  sqlit
8d90: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
8da0: 28 76 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20  (v, regTabname, 
8db0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
8dc0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
8dd0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
8de0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
8df0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e20: 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 64 78 2e  columns in pIdx.
8e30: 20 22 4e 22 20 2a 2f 0a 20 20 20 20 69 6e 74 20   "N" */.    int 
8e40: 61 64 64 72 52 65 77 69 6e 64 3b 20 20 20 20 20  addrRewind;     
8e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
8e60: 72 65 73 73 20 6f 66 20 22 4f 50 5f 52 65 77 69  ress of "OP_Rewi
8e70: 6e 64 20 69 49 64 78 43 75 72 22 20 2a 2f 0a 20  nd iIdxCur" */. 
8e80: 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 52     int addrNextR
8e90: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
8ea0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 22   /* Address of "
8eb0: 6e 65 78 74 5f 72 6f 77 3a 22 20 2a 2f 0a 20 20  next_row:" */.  
8ec0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
8ed0: 64 78 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  dxName;         
8ee0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
8ef0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
8f00: 6e 43 6f 6c 54 65 73 74 3b 20 20 20 20 20 20 20  nColTest;       
8f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f20: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
8f30: 6f 20 74 65 73 74 20 66 6f 72 20 63 68 61 6e 67  o test for chang
8f40: 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  es */..    if( p
8f50: 4f 6e 6c 79 49 64 78 20 26 26 20 70 4f 6e 6c 79  OnlyIdx && pOnly
8f60: 49 64 78 21 3d 70 49 64 78 20 29 20 63 6f 6e 74  Idx!=pIdx ) cont
8f70: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
8f80: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
8f90: 65 3d 3d 30 20 29 20 6e 65 65 64 54 61 62 6c 65  e==0 ) needTable
8fa0: 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Cnt = 0;.    if(
8fb0: 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
8fc0: 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79   && IsPrimaryKey
8fd0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a 20  Index(pIdx) ){. 
8fe0: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78       nCol = pIdx
8ff0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
9000: 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 54 61 62   zIdxName = pTab
9010: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e  ->zName;.      n
9020: 43 6f 6c 54 65 73 74 20 3d 20 6e 43 6f 6c 20 2d  ColTest = nCol -
9030: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
9040: 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78       nCol = pIdx
9050: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
9060: 20 7a 49 64 78 4e 61 6d 65 20 3d 20 70 49 64 78   zIdxName = pIdx
9070: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e  ->zName;.      n
9080: 43 6f 6c 54 65 73 74 20 3d 20 70 49 64 78 2d 3e  ColTest = pIdx->
9090: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49  uniqNotNull ? pI
90a0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 20 3a 20  dx->nKeyCol-1 : 
90b0: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  nCol-1;.    }.. 
90c0: 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
90d0: 68 65 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  he register cont
90e0: 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
90f0: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 73 71   name. */.    sq
9100: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
9110: 69 6e 67 28 76 2c 20 72 65 67 49 64 78 6e 61 6d  ing(v, regIdxnam
9120: 65 2c 20 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20  e, zIdxName);.  
9130: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
9140: 2c 20 22 41 6e 61 6c 79 73 69 73 20 66 6f 72 20  , "Analysis for 
9150: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
9160: 61 6d 65 2c 20 7a 49 64 78 4e 61 6d 65 29 29 3b  ame, zIdxName));
9170: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
9180: 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20  Pseudo-code for 
9190: 6c 6f 6f 70 20 74 68 61 74 20 63 61 6c 6c 73 20  loop that calls 
91a0: 73 74 61 74 5f 70 75 73 68 28 29 3a 0a 20 20 20  stat_push():.   
91b0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 52 65 77   **.    **   Rew
91c0: 69 6e 64 20 63 73 72 0a 20 20 20 20 2a 2a 20 20  ind csr.    **  
91d0: 20 69 66 20 65 6f 66 28 63 73 72 29 20 67 6f 74   if eof(csr) got
91e0: 6f 20 65 6e 64 5f 6f 66 5f 73 63 61 6e 3b 0a 20  o end_of_scan;. 
91f0: 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20     **   regChng 
9200: 3d 20 30 0a 20 20 20 20 2a 2a 20 20 20 67 6f 74  = 0.    **   got
9210: 6f 20 63 68 6e 67 5f 61 64 64 72 5f 30 3b 0a 20  o chng_addr_0;. 
9220: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 65     **.    **  ne
9230: 78 74 5f 72 6f 77 3a 0a 20 20 20 20 2a 2a 20 20  xt_row:.    **  
9240: 20 72 65 67 43 68 6e 67 20 3d 20 30 0a 20 20 20   regChng = 0.   
9250: 20 2a 2a 20 20 20 69 66 28 20 69 64 78 28 30 29   **   if( idx(0)
9260: 20 21 3d 20 72 65 67 50 72 65 76 28 30 29 20 29   != regPrev(0) )
9270: 20 67 6f 74 6f 20 63 68 6e 67 5f 61 64 64 72 5f   goto chng_addr_
9280: 30 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43 68  0.    **   regCh
9290: 6e 67 20 3d 20 31 0a 20 20 20 20 2a 2a 20 20 20  ng = 1.    **   
92a0: 69 66 28 20 69 64 78 28 31 29 20 21 3d 20 72 65  if( idx(1) != re
92b0: 67 50 72 65 76 28 31 29 20 29 20 67 6f 74 6f 20  gPrev(1) ) goto 
92c0: 63 68 6e 67 5f 61 64 64 72 5f 31 0a 20 20 20 20  chng_addr_1.    
92d0: 2a 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  **   ....    ** 
92e0: 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20 20    regChng = N.  
92f0: 20 20 2a 2a 20 20 20 67 6f 74 6f 20 63 68 6e 67    **   goto chng
9300: 5f 61 64 64 72 5f 4e 0a 20 20 20 20 2a 2a 0a 20  _addr_N.    **. 
9310: 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72     **  chng_addr
9320: 5f 30 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67  _0:.    **   reg
9330: 50 72 65 76 28 30 29 20 3d 20 69 64 78 28 30 29  Prev(0) = idx(0)
9340: 0a 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64  .    **  chng_ad
9350: 64 72 5f 31 3a 0a 20 20 20 20 2a 2a 20 20 20 72  dr_1:.    **   r
9360: 65 67 50 72 65 76 28 31 29 20 3d 20 69 64 78 28  egPrev(1) = idx(
9370: 31 29 0a 20 20 20 20 2a 2a 20 20 2e 2e 2e 0a 20  1).    **  .... 
9380: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 6e     **.    **  en
9390: 64 44 69 73 74 69 6e 63 74 54 65 73 74 3a 0a 20  dDistinctTest:. 
93a0: 20 20 20 2a 2a 20 20 20 72 65 67 52 6f 77 69 64     **   regRowid
93b0: 20 3d 20 69 64 78 28 72 6f 77 69 64 29 0a 20 20   = idx(rowid).  
93c0: 20 20 2a 2a 20 20 20 73 74 61 74 5f 70 75 73 68    **   stat_push
93d0: 28 50 2c 20 72 65 67 43 68 6e 67 2c 20 72 65 67  (P, regChng, reg
93e0: 52 6f 77 69 64 29 0a 20 20 20 20 2a 2a 20 20 20  Rowid).    **   
93f0: 4e 65 78 74 20 63 73 72 0a 20 20 20 20 2a 2a 20  Next csr.    ** 
9400: 20 20 69 66 20 21 65 6f 66 28 63 73 72 29 20 67    if !eof(csr) g
9410: 6f 74 6f 20 6e 65 78 74 5f 72 6f 77 3b 0a 20 20  oto next_row;.  
9420: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 65 6e 64    **.    **  end
9430: 5f 6f 66 5f 73 63 61 6e 3a 0a 20 20 20 20 2a 2f  _of_scan:.    */
9440: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9450: 72 65 20 74 68 65 72 65 20 61 72 65 20 65 6e 6f  re there are eno
9460: 75 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ugh memory cells
9470: 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 61 63   allocated to ac
9480: 63 6f 6d 6d 6f 64 61 74 65 20 0a 20 20 20 20 2a  commodate .    *
9490: 2a 20 74 68 65 20 72 65 67 50 72 65 76 20 61 72  * the regPrev ar
94a0: 72 61 79 20 61 6e 64 20 61 20 74 72 61 69 6c 69  ray and a traili
94b0: 6e 67 20 72 6f 77 69 64 20 28 74 68 65 20 72 6f  ng rowid (the ro
94c0: 77 69 64 20 73 6c 6f 74 20 69 73 20 72 65 71 75  wid slot is requ
94d0: 69 72 65 64 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ired.    ** when
94e0: 20 62 75 69 6c 64 69 6e 67 20 61 20 72 65 63 6f   building a reco
94f0: 72 64 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rd to insert int
9500: 6f 20 74 68 65 20 73 61 6d 70 6c 65 20 63 6f 6c  o the sample col
9510: 75 6d 6e 20 6f 66 20 0a 20 20 20 20 2a 2a 20 74  umn of .    ** t
9520: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  he sqlite_stat4 
9530: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 70  table.  */.    p
9540: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 4d 41  Parse->nMem = MA
9550: 58 28 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 20  X(pParse->nMem, 
9560: 72 65 67 50 72 65 76 2b 6e 43 6f 6c 54 65 73 74  regPrev+nColTest
9570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
9580: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
9590: 6f 72 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  or on the index 
95a0: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 2e 20  being analyzed. 
95b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
95c0: 44 62 3d 3d 73 71 6c 69 74 65 33 53 63 68 65 6d  Db==sqlite3Schem
95d0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64  aToIndex(db, pId
95e0: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
95f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9600: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
9610: 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49  ead, iIdxCur, pI
9620: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
9630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9640: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
9650: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 56  se, pIdx);.    V
9660: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
9670: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
9680: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f  ));..    /* Invo
9690: 6b 65 20 74 68 65 20 73 74 61 74 5f 69 6e 69 74  ke the stat_init
96a0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  () function. The
96b0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 3a 0a   arguments are:.
96c0: 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20      ** .    **  
96d0: 20 20 28 31 29 20 74 68 65 20 6e 75 6d 62 65 72    (1) the number
96e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
96f0: 68 65 20 69 6e 64 65 78 20 69 6e 63 6c 75 64 69  he index includi
9700: 6e 67 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20  ng the rowid.   
9710: 20 2a 2a 20 20 20 20 20 20 20 20 28 6f 72 20 66   **        (or f
9720: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
9730: 49 44 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 75  ID table, the nu
9740: 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c 75 6d  mber of PK colum
9750: 6e 73 29 2c 0a 20 20 20 20 2a 2a 20 20 20 20 28  ns),.    **    (
9760: 32 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  2) the number of
9770: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
9780: 6b 65 79 20 77 69 74 68 6f 75 74 20 74 68 65 20  key without the 
9790: 72 6f 77 69 64 2f 70 6b 0a 20 20 20 20 2a 2a 20  rowid/pk.    ** 
97a0: 20 20 20 28 33 29 20 74 68 65 20 6e 75 6d 62 65     (3) the numbe
97b0: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
97c0: 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 0a 20   index,.    **. 
97d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
97e0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
97f0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
9800: 20 53 54 41 54 33 20 61 6e 64 20 53 54 41 54 34   STAT3 and STAT4
9810: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
9820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
9830: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
9840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9850: 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
9860: 49 64 78 43 75 72 2c 20 72 65 67 53 74 61 74 34  IdxCur, regStat4
9870: 2b 33 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  +3);.#endif.    
9880: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9890: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
98a0: 20 6e 43 6f 6c 2c 20 72 65 67 53 74 61 74 34 2b   nCol, regStat4+
98b0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
98c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
98d0: 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6e  Integer, pIdx->n
98e0: 4b 65 79 43 6f 6c 2c 20 72 65 67 53 74 61 74 34  KeyCol, regStat4
98f0: 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
9900: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9910: 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 30 2c 20 72  _Function0, 0, r
9920: 65 67 53 74 61 74 34 2b 31 2c 20 72 65 67 53 74  egStat4+1, regSt
9930: 61 74 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20  at4,.           
9940: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
9950: 29 26 73 74 61 74 49 6e 69 74 46 75 6e 63 64 65  )&statInitFuncde
9960: 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P4_FUNCDEF);.
9970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9980: 68 61 6e 67 65 50 35 28 76 2c 20 32 2b 49 73 53  hangeP5(v, 2+IsS
9990: 74 61 74 33 34 29 3b 0a 0a 20 20 20 20 2f 2a 20  tat34);..    /* 
99a0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
99b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
99c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
99d0: 20 52 65 77 69 6e 64 20 63 73 72 0a 20 20 20 20   Rewind csr.    
99e0: 2a 2a 20 20 20 69 66 20 65 6f 66 28 63 73 72 29  **   if eof(csr)
99f0: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 73 63 61   goto end_of_sca
9a00: 6e 3b 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 43  n;.    **   regC
9a10: 68 6e 67 20 3d 20 30 0a 20 20 20 20 2a 2a 20 20  hng = 0.    **  
9a20: 20 67 6f 74 6f 20 6e 65 78 74 5f 70 75 73 68 5f   goto next_push_
9a30: 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  0;.    **.    */
9a40: 0a 20 20 20 20 61 64 64 72 52 65 77 69 6e 64 20  .    addrRewind 
9a50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
9a60: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
9a70: 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
9a80: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
9a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9aa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9ab0: 65 67 65 72 2c 20 30 2c 20 72 65 67 43 68 6e 67  eger, 0, regChng
9ac0: 29 3b 0a 20 20 20 20 61 64 64 72 4e 65 78 74 52  );.    addrNextR
9ad0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
9ae0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
9af0: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 54 65 73  .    if( nColTes
9b00: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
9b10: 20 65 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74   endDistinctTest
9b20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
9b30: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
9b40: 20 20 69 6e 74 20 2a 61 47 6f 74 6f 43 68 6e 67    int *aGotoChng
9b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9b60: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6a 75 6d 70  /* Array of jump
9b70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
9b80: 72 65 73 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  resses */.      
9b90: 61 47 6f 74 6f 43 68 6e 67 20 3d 20 73 71 6c 69  aGotoChng = sqli
9ba0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
9bb0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
9bc0: 2a 6e 43 6f 6c 54 65 73 74 29 3b 0a 20 20 20 20  *nColTest);.    
9bd0: 20 20 69 66 28 20 61 47 6f 74 6f 43 68 6e 67 3d    if( aGotoChng=
9be0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
9bf0: 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a        /*.      *
9c00: 2a 20 20 6e 65 78 74 5f 72 6f 77 3a 0a 20 20 20  *  next_row:.   
9c10: 20 20 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20     **   regChng 
9c20: 3d 20 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 69  = 0.      **   i
9c30: 66 28 20 69 64 78 28 30 29 20 21 3d 20 72 65 67  f( idx(0) != reg
9c40: 50 72 65 76 28 30 29 20 29 20 67 6f 74 6f 20 63  Prev(0) ) goto c
9c50: 68 6e 67 5f 61 64 64 72 5f 30 0a 20 20 20 20 20  hng_addr_0.     
9c60: 20 2a 2a 20 20 20 72 65 67 43 68 6e 67 20 3d 20   **   regChng = 
9c70: 31 0a 20 20 20 20 20 20 2a 2a 20 20 20 69 66 28  1.      **   if(
9c80: 20 69 64 78 28 31 29 20 21 3d 20 72 65 67 50 72   idx(1) != regPr
9c90: 65 76 28 31 29 20 29 20 67 6f 74 6f 20 63 68 6e  ev(1) ) goto chn
9ca0: 67 5f 61 64 64 72 5f 31 0a 20 20 20 20 20 20 2a  g_addr_1.      *
9cb0: 2a 20 20 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  *   ....      **
9cc0: 20 20 20 72 65 67 43 68 6e 67 20 3d 20 4e 0a 20     regChng = N. 
9cd0: 20 20 20 20 20 2a 2a 20 20 20 67 6f 74 6f 20 65       **   goto e
9ce0: 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 0a 20  ndDistinctTest. 
9cf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
9d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
9d10: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
9d20: 20 20 20 61 64 64 72 4e 65 78 74 52 6f 77 20 3d     addrNextRow =
9d30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
9d40: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
9d50: 20 20 69 66 28 20 6e 43 6f 6c 54 65 73 74 3d 3d    if( nColTest==
9d60: 31 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43  1 && pIdx->nKeyC
9d70: 6f 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69 71 75  ol==1 && IsUniqu
9d80: 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b 0a  eIndex(pIdx) ){.
9d90: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
9da0: 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20 55   single-column U
9db0: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 6f 6e 63  NIQUE index, onc
9dc0: 65 20 77 65 20 68 61 76 65 20 66 6f 75 6e 64 20  e we have found 
9dd0: 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 20 20 20 20 20  a non-NULL.     
9de0: 20 20 20 2a 2a 20 72 6f 77 2c 20 77 65 20 6b 6e     ** row, we kn
9df0: 6f 77 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  ow that all the 
9e00: 72 65 73 74 20 77 69 6c 6c 20 62 65 20 64 69 73  rest will be dis
9e10: 74 69 6e 63 74 2c 20 73 6f 20 73 6b 69 70 20 0a  tinct, so skip .
9e20: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65          ** subse
9e30: 71 75 65 6e 74 20 64 69 73 74 69 6e 63 74 6e 65  quent distinctne
9e40: 73 73 20 74 65 73 74 73 2e 20 2a 2f 0a 20 20 20  ss tests. */.   
9e50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9e60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp2(v, OP_Not
9e70: 4e 75 6c 6c 2c 20 72 65 67 50 72 65 76 2c 20 65  Null, regPrev, e
9e80: 6e 64 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b  ndDistinctTest);
9e90: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
9ea0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
9eb0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
9ec0: 20 69 3c 6e 43 6f 6c 54 65 73 74 3b 20 69 2b 2b   i<nColTest; i++
9ed0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
9ee0: 2a 70 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29  *pColl = (char*)
9ef0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9f00: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64  lSeq(pParse, pId
9f10: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  x->azColl[i]);. 
9f20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9f30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
9f40: 6e 74 65 67 65 72 2c 20 69 2c 20 72 65 67 43 68  nteger, i, regCh
9f50: 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ng);.        sql
9f60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9f70: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
9f80: 78 43 75 72 2c 20 69 2c 20 72 65 67 54 65 6d 70  xCur, i, regTemp
9f90: 29 3b 0a 20 20 20 20 20 20 20 20 61 47 6f 74 6f  );.        aGoto
9fa0: 43 68 6e 67 5b 69 5d 20 3d 20 0a 20 20 20 20 20  Chng[i] = .     
9fb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9fc0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
9fd0: 65 67 54 65 6d 70 2c 20 30 2c 20 72 65 67 50 72  egTemp, 0, regPr
9fe0: 65 76 2b 69 2c 20 70 43 6f 6c 6c 2c 20 50 34 5f  ev+i, pColl, P4_
9ff0: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
a000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a010: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
a020: 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
a030: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a060: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
a070: 20 6e 43 6f 6c 54 65 73 74 2c 20 72 65 67 43 68   nColTest, regCh
a080: 6e 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ng);.      sqlit
a090: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e  e3VdbeGoto(v, en
a0a0: 64 44 69 73 74 69 6e 63 74 54 65 73 74 29 3b 0a  dDistinctTest);.
a0b0: 20 20 0a 20 20 0a 20 20 20 20 20 20 2f 2a 0a 20    .  .      /*. 
a0c0: 20 20 20 20 20 2a 2a 20 20 63 68 6e 67 5f 61 64       **  chng_ad
a0d0: 64 72 5f 30 3a 0a 20 20 20 20 20 20 2a 2a 20 20  dr_0:.      **  
a0e0: 20 72 65 67 50 72 65 76 28 30 29 20 3d 20 69 64   regPrev(0) = id
a0f0: 78 28 30 29 0a 20 20 20 20 20 20 2a 2a 20 20 63  x(0).      **  c
a100: 68 6e 67 5f 61 64 64 72 5f 31 3a 0a 20 20 20 20  hng_addr_1:.    
a110: 20 20 2a 2a 20 20 20 72 65 67 50 72 65 76 28 31    **   regPrev(1
a120: 29 20 3d 20 69 64 78 28 31 29 0a 20 20 20 20 20  ) = idx(1).     
a130: 20 2a 2a 20 20 2e 2e 2e 0a 20 20 20 20 20 20 2a   **  ....      *
a140: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
a150: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
a160: 64 64 72 4e 65 78 74 52 6f 77 2d 31 29 3b 0a 20  ddrNextRow-1);. 
a170: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
a180: 6e 43 6f 6c 54 65 73 74 3b 20 69 2b 2b 29 7b 0a  nColTest; i++){.
a190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a1a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
a1b0: 47 6f 74 6f 43 68 6e 67 5b 69 5d 29 3b 0a 20 20  GotoChng[i]);.  
a1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a1d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
a1e0: 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 69  lumn, iIdxCur, i
a1f0: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
a200: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a210: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
a220: 62 65 6c 28 76 2c 20 65 6e 64 44 69 73 74 69 6e  bel(v, endDistin
a230: 63 74 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73  ctTest);.      s
a240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a250: 20 61 47 6f 74 6f 43 68 6e 67 29 3b 0a 20 20 20   aGotoChng);.   
a260: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20   }.  .    /*.   
a270: 20 2a 2a 20 20 63 68 6e 67 5f 61 64 64 72 5f 4e   **  chng_addr_N
a280: 3a 0a 20 20 20 20 2a 2a 20 20 20 72 65 67 52 6f  :.    **   regRo
a290: 77 69 64 20 3d 20 69 64 78 28 72 6f 77 69 64 29  wid = idx(rowid)
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 53              // S
a2b0: 54 41 54 33 34 20 6f 6e 6c 79 0a 20 20 20 20 2a  TAT34 only.    *
a2c0: 2a 20 20 20 73 74 61 74 5f 70 75 73 68 28 50 2c  *   stat_push(P,
a2d0: 20 72 65 67 43 68 6e 67 2c 20 72 65 67 52 6f 77   regChng, regRow
a2e0: 69 64 29 20 20 2f 2f 20 33 72 64 20 70 61 72 61  id)  // 3rd para
a2f0: 6d 65 74 65 72 20 53 54 41 54 33 34 20 6f 6e 6c  meter STAT34 onl
a300: 79 0a 20 20 20 20 2a 2a 20 20 20 4e 65 78 74 20  y.    **   Next 
a310: 63 73 72 0a 20 20 20 20 2a 2a 20 20 20 69 66 20  csr.    **   if 
a320: 21 65 6f 66 28 63 73 72 29 20 67 6f 74 6f 20 6e  !eof(csr) goto n
a330: 65 78 74 5f 72 6f 77 3b 0a 20 20 20 20 2a 2f 0a  ext_row;.    */.
a340: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a350: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a360: 41 54 34 0a 20 20 20 20 61 73 73 65 72 74 28 20  AT4.    assert( 
a370: 72 65 67 52 6f 77 69 64 3d 3d 28 72 65 67 53 74  regRowid==(regSt
a380: 61 74 34 2b 32 29 20 29 3b 0a 20 20 20 20 69 66  at4+2) );.    if
a390: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
a3a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a3b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a3c0: 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
a3d0: 43 75 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Cur, regRowid);.
a3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a3f0: 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
a400: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
a410: 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61 62 6c  ndex(pIdx->pTabl
a420: 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 2c  e);.      int j,
a430: 20 6b 2c 20 72 65 67 4b 65 79 3b 0a 20 20 20 20   k, regKey;.    
a440: 20 20 72 65 67 4b 65 79 20 3d 20 73 71 6c 69 74    regKey = sqlit
a450: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
a460: 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79  Parse, pPk->nKey
a470: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Col);.      for(
a480: 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
a490: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
a4a0: 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f     k = sqlite3Co
a4b0: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
a4c0: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
a4d0: 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  j]);.        ass
a4e0: 65 72 74 28 20 6b 3e 3d 30 20 26 26 20 6b 3c 70  ert( k>=0 && k<p
a4f0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
a500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a510: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a520: 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6b 2c  umn, iIdxCur, k,
a530: 20 72 65 67 4b 65 79 2b 6a 29 3b 0a 20 20 20 20   regKey+j);.    
a540: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
a550: 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e  (v, "%s", pTab->
a560: 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75  aCol[pPk->aiColu
a570: 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  mn[j]].zName));.
a580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a590: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a5a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
a5b0: 2c 20 72 65 67 4b 65 79 2c 20 70 50 6b 2d 3e 6e  , regKey, pPk->n
a5c0: 4b 65 79 43 6f 6c 2c 20 72 65 67 52 6f 77 69 64  KeyCol, regRowid
a5d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a5e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
a5f0: 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c  (pParse, regKey,
a600: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a   pPk->nKeyCol);.
a610: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a620: 20 61 73 73 65 72 74 28 20 72 65 67 43 68 6e 67   assert( regChng
a630: 3d 3d 28 72 65 67 53 74 61 74 34 2b 31 29 20 29  ==(regStat4+1) )
a640: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a650: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
a660: 6e 63 74 69 6f 6e 30 2c 20 31 2c 20 72 65 67 53  nction0, 1, regS
a670: 74 61 74 34 2c 20 72 65 67 54 65 6d 70 2c 0a 20  tat4, regTemp,. 
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 28 63 68 61 72 2a 29 26 73 74 61 74      (char*)&stat
a6a0: 50 75 73 68 46 75 6e 63 64 65 66 2c 20 50 34 5f  PushFuncdef, P4_
a6b0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
a6c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a6d0: 35 28 76 2c 20 32 2b 49 73 53 74 61 74 33 34 29  5(v, 2+IsStat34)
a6e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a6f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
a700: 78 74 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  xt, iIdxCur, add
a710: 72 4e 65 78 74 52 6f 77 29 3b 20 56 64 62 65 43  rNextRow); VdbeC
a720: 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
a730: 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72   /* Add the entr
a740: 79 20 74 6f 20 74 68 65 20 73 74 61 74 31 20 74  y to the stat1 t
a750: 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 63 61 6c  able. */.    cal
a760: 6c 53 74 61 74 47 65 74 28 76 2c 20 72 65 67 53  lStatGet(v, regS
a770: 74 61 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 53  tat4, STAT_GET_S
a780: 54 41 54 31 2c 20 72 65 67 53 74 61 74 31 29 3b  TAT1, regStat1);
a790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 22 42 42  .    assert( "BB
a7a0: 42 22 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  B"[0]==SQLITE_AF
a7b0: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 73 71  F_TEXT );.    sq
a7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a7d0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
a7e0: 2c 20 72 65 67 54 61 62 6e 61 6d 65 2c 20 33 2c  , regTabname, 3,
a7f0: 20 72 65 67 54 65 6d 70 2c 20 22 42 42 42 22 2c   regTemp, "BBB",
a800: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a810: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a820: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61 74  _NewRowid, iStat
a830: 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64  Cur, regNewRowid
a840: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a850: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
a860: 6e 73 65 72 74 2c 20 69 53 74 61 74 43 75 72 2c  nsert, iStatCur,
a870: 20 72 65 67 54 65 6d 70 2c 20 72 65 67 4e 65 77   regTemp, regNew
a880: 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Rowid);.    sqli
a890: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
a8a0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
a8b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  );..    /* Add t
a8c0: 68 65 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  he entries to th
a8d0: 65 20 73 74 61 74 33 20 6f 72 20 73 74 61 74 34  e stat3 or stat4
a8e0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65   table. */.#ifde
a8f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a900: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
a910: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72     {.      int r
a920: 65 67 45 71 20 3d 20 72 65 67 53 74 61 74 31 3b  egEq = regStat1;
a930: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4c 74  .      int regLt
a940: 20 3d 20 72 65 67 53 74 61 74 31 2b 31 3b 0a 20   = regStat1+1;. 
a950: 20 20 20 20 20 69 6e 74 20 72 65 67 44 4c 74 20       int regDLt 
a960: 3d 20 72 65 67 53 74 61 74 31 2b 32 3b 0a 20 20  = regStat1+2;.  
a970: 20 20 20 20 69 6e 74 20 72 65 67 53 61 6d 70 6c      int regSampl
a980: 65 20 3d 20 72 65 67 53 74 61 74 31 2b 33 3b 0a  e = regStat1+3;.
a990: 20 20 20 20 20 20 69 6e 74 20 72 65 67 43 6f 6c        int regCol
a9a0: 20 3d 20 72 65 67 53 74 61 74 31 2b 34 3b 0a 20   = regStat1+4;. 
a9b0: 20 20 20 20 20 69 6e 74 20 72 65 67 53 61 6d 70       int regSamp
a9c0: 6c 65 52 6f 77 69 64 20 3d 20 72 65 67 43 6f 6c  leRowid = regCol
a9d0: 20 2b 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69   + nCol;.      i
a9e0: 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 20  nt addrNext;.   
a9f0: 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c     int addrIsNul
aa00: 6c 3b 0a 20 20 20 20 20 20 75 38 20 73 65 65 6b  l;.      u8 seek
aa10: 4f 70 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54  Op = HasRowid(pT
aa20: 61 62 29 20 3f 20 4f 50 5f 4e 6f 74 45 78 69 73  ab) ? OP_NotExis
aa30: 74 73 20 3a 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  ts : OP_NotFound
aa40: 3b 0a 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ;..      pParse-
aa50: 3e 6e 4d 65 6d 20 3d 20 4d 41 58 28 70 50 61 72  >nMem = MAX(pPar
aa60: 73 65 2d 3e 6e 4d 65 6d 2c 20 72 65 67 43 6f 6c  se->nMem, regCol
aa70: 2b 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 20 20 61  +nCol);..      a
aa80: 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
aa90: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
aaa0: 28 76 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53  (v);.      callS
aab0: 74 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61  tatGet(v, regSta
aac0: 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 52 4f 57  t4, STAT_GET_ROW
aad0: 49 44 2c 20 72 65 67 53 61 6d 70 6c 65 52 6f 77  ID, regSampleRow
aae0: 69 64 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49  id);.      addrI
aaf0: 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  sNull = sqlite3V
ab00: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ab10: 49 73 4e 75 6c 6c 2c 20 72 65 67 53 61 6d 70 6c  IsNull, regSampl
ab20: 65 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 56  eRowid);.      V
ab30: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ab40: 20 20 20 20 20 20 63 61 6c 6c 53 74 61 74 47 65        callStatGe
ab50: 74 28 76 2c 20 72 65 67 53 74 61 74 34 2c 20 53  t(v, regStat4, S
ab60: 54 41 54 5f 47 45 54 5f 4e 45 51 2c 20 72 65 67  TAT_GET_NEQ, reg
ab70: 45 71 29 3b 0a 20 20 20 20 20 20 63 61 6c 6c 53  Eq);.      callS
ab80: 74 61 74 47 65 74 28 76 2c 20 72 65 67 53 74 61  tatGet(v, regSta
ab90: 74 34 2c 20 53 54 41 54 5f 47 45 54 5f 4e 4c 54  t4, STAT_GET_NLT
aba0: 2c 20 72 65 67 4c 74 29 3b 0a 20 20 20 20 20 20  , regLt);.      
abb0: 63 61 6c 6c 53 74 61 74 47 65 74 28 76 2c 20 72  callStatGet(v, r
abc0: 65 67 53 74 61 74 34 2c 20 53 54 41 54 5f 47 45  egStat4, STAT_GE
abd0: 54 5f 4e 44 4c 54 2c 20 72 65 67 44 4c 74 29 3b  T_NDLT, regDLt);
abe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
abf0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 73  beAddOp4Int(v, s
ac00: 65 65 6b 4f 70 2c 20 69 54 61 62 43 75 72 2c 20  eekOp, iTabCur, 
ac10: 61 64 64 72 4e 65 78 74 2c 20 72 65 67 53 61 6d  addrNext, regSam
ac20: 70 6c 65 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20  pleRowid, 0);.  
ac30: 20 20 20 20 2f 2a 20 57 65 20 6b 6e 6f 77 20 74      /* We know t
ac40: 68 61 74 20 74 68 65 20 72 65 67 53 61 6d 70 6c  hat the regSampl
ac50: 65 52 6f 77 69 64 20 72 6f 77 20 65 78 69 73 74  eRowid row exist
ac60: 73 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  s because it was
ac70: 20 72 65 61 64 20 62 79 0a 20 20 20 20 20 20 2a   read by.      *
ac80: 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  * the previous l
ac90: 6f 6f 70 2e 20 20 54 68 75 73 20 74 68 65 20 6e  oop.  Thus the n
aca0: 6f 74 2d 66 6f 75 6e 64 20 6a 75 6d 70 20 6f 66  ot-found jump of
acb0: 20 73 65 65 6b 4f 70 20 77 69 6c 6c 20 6e 65 76   seekOp will nev
acc0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 74  er.      ** be t
acd0: 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 56 64  aken */.      Vd
ace0: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
acf0: 61 6b 65 6e 28 76 29 3b 0a 23 69 66 64 65 66 20  aken(v);.#ifdef 
ad00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
ad10: 41 54 33 0a 20 20 20 20 20 20 73 71 6c 69 74 65  AT3.      sqlite
ad20: 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
ad30: 65 78 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  exColumn(pParse,
ad40: 20 70 49 64 78 2c 20 69 54 61 62 43 75 72 2c 20   pIdx, iTabCur, 
ad50: 30 2c 20 72 65 67 53 61 6d 70 6c 65 29 3b 0a 23  0, regSample);.#
ad60: 65 6c 73 65 0a 20 20 20 20 20 20 66 6f 72 28 69  else.      for(i
ad70: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
ad80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ad90: 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64  3ExprCodeLoadInd
ada0: 65 78 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  exColumn(pParse,
adb0: 20 70 49 64 78 2c 20 69 54 61 62 43 75 72 2c 20   pIdx, iTabCur, 
adc0: 69 2c 20 72 65 67 43 6f 6c 2b 69 29 3b 0a 20 20  i, regCol+i);.  
add0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ade0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
adf0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
ae00: 72 65 67 43 6f 6c 2c 20 6e 43 6f 6c 2c 20 72 65  regCol, nCol, re
ae10: 67 53 61 6d 70 6c 65 29 3b 0a 23 65 6e 64 69 66  gSample);.#endif
ae20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ae30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
ae40: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61  akeRecord, regTa
ae50: 62 6e 61 6d 65 2c 20 36 2c 20 72 65 67 54 65 6d  bname, 6, regTem
ae60: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
ae70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ae80: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 53 74 61  P_NewRowid, iSta
ae90: 74 43 75 72 2b 31 2c 20 72 65 67 4e 65 77 52 6f  tCur+1, regNewRo
aea0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
aeb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
aec0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53 74 61   OP_Insert, iSta
aed0: 74 43 75 72 2b 31 2c 20 72 65 67 54 65 6d 70 2c  tCur+1, regTemp,
aee0: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
aef0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
af10: 6f 2c 20 31 2c 20 61 64 64 72 4e 65 78 74 29 3b  o, 1, addrNext);
af20: 20 2f 2a 20 50 31 3d 3d 31 20 66 6f 72 20 65 6e   /* P1==1 for en
af30: 64 2d 6f 66 2d 6c 6f 6f 70 20 2a 2f 0a 20 20 20  d-of-loop */.   
af40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
af50: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 73  mpHere(v, addrIs
af60: 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Null);.    }.#en
af70: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
af80: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
af90: 41 54 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45  AT4 */..    /* E
afa0: 6e 64 20 6f 66 20 61 6e 61 6c 79 73 69 73 20 2a  nd of analysis *
afb0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
afc0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
afd0: 72 52 65 77 69 6e 64 29 3b 0a 20 20 7d 0a 0a 0a  rRewind);.  }...
afe0: 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 73 69    /* Create a si
aff0: 6e 67 6c 65 20 73 71 6c 69 74 65 5f 73 74 61 74  ngle sqlite_stat
b000: 31 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69  1 entry containi
b010: 6e 67 20 4e 55 4c 4c 20 61 73 20 74 68 65 20 69  ng NULL as the i
b020: 6e 64 65 78 0a 20 20 2a 2a 20 6e 61 6d 65 20 61  ndex.  ** name a
b030: 6e 64 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74  nd the row count
b040: 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   as the content.
b050: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 6e 6c  .  */.  if( pOnl
b060: 79 49 64 78 3d 3d 30 20 26 26 20 6e 65 65 64 54  yIdx==0 && needT
b070: 61 62 6c 65 43 6e 74 20 29 7b 0a 20 20 20 20 56  ableCnt ){.    V
b080: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b090: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
b0a0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
b0b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b0c0: 43 6f 75 6e 74 2c 20 69 54 61 62 43 75 72 2c 20  Count, iTabCur, 
b0d0: 72 65 67 53 74 61 74 31 29 3b 0a 20 20 20 20 6a  regStat1);.    j
b0e0: 5a 65 72 6f 52 6f 77 73 20 3d 20 73 71 6c 69 74  ZeroRows = sqlit
b0f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b100: 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 53 74 61  OP_IfNot, regSta
b110: 74 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  t1); VdbeCoverag
b120: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
b130: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b140: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 64  P_Null, 0, regId
b150: 78 6e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65  xname);.    asse
b160: 72 74 28 20 22 42 42 42 22 5b 30 5d 3d 3d 53 51  rt( "BBB"[0]==SQ
b170: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
b180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b190: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b1a0: 65 52 65 63 6f 72 64 2c 20 72 65 67 54 61 62 6e  eRecord, regTabn
b1b0: 61 6d 65 2c 20 33 2c 20 72 65 67 54 65 6d 70 2c  ame, 3, regTemp,
b1c0: 20 22 42 42 42 22 2c 20 30 29 3b 0a 20 20 20 20   "BBB", 0);.    
b1d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b1e0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
b1f0: 2c 20 69 53 74 61 74 43 75 72 2c 20 72 65 67 4e  , iStatCur, regN
b200: 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  ewRowid);.    sq
b210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b220: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 53  v, OP_Insert, iS
b230: 74 61 74 43 75 72 2c 20 72 65 67 54 65 6d 70 2c  tatCur, regTemp,
b240: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
b250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
b260: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
b270: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
b280: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b290: 65 28 76 2c 20 6a 5a 65 72 6f 52 6f 77 73 29 3b  e(v, jZeroRows);
b2a0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
b2b0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
b2c0: 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  t will cause the
b2d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 64   most recent ind
b2e0: 65 78 20 61 6e 61 6c 79 73 69 73 20 74 6f 0a 2a  ex analysis to.*
b2f0: 2a 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f  * be loaded into
b300: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
b310: 61 62 6c 65 73 20 77 68 65 72 65 20 69 73 20 63  ables where is c
b320: 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 73  an be used..*/.s
b330: 74 61 74 69 63 20 76 6f 69 64 20 6c 6f 61 64 41  tatic void loadA
b340: 6e 61 6c 79 73 69 73 28 50 61 72 73 65 20 2a 70  nalysis(Parse *p
b350: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
b360: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
b370: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b380: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
b390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 6f 61 64  ddOp1(v, OP_Load
b3b0: 41 6e 61 6c 79 73 69 73 2c 20 69 44 62 29 3b 0a  Analysis, iDb);.
b3c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
b3d0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
b3e0: 77 69 6c 6c 20 64 6f 20 61 6e 20 61 6e 61 6c 79  will do an analy
b3f0: 73 69 73 20 6f 66 20 61 6e 20 65 6e 74 69 72 65  sis of an entire
b400: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61   database.*/.sta
b410: 74 69 63 20 76 6f 69 64 20 61 6e 61 6c 79 7a 65  tic void analyze
b420: 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
b430: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
b440: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
b450: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b460: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
b470: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
b480: 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 53 63  Schema;    /* Sc
b490: 68 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65  hema of database
b4a0: 20 69 44 62 20 2a 2f 0a 20 20 48 61 73 68 45 6c   iDb */.  HashEl
b4b0: 65 6d 20 2a 6b 3b 0a 20 20 69 6e 74 20 69 53 74  em *k;.  int iSt
b4c0: 61 74 43 75 72 3b 0a 20 20 69 6e 74 20 69 4d 65  atCur;.  int iMe
b4d0: 6d 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 0a  m;.  int iTab;..
b4e0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
b4f0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
b500: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
b510: 69 53 74 61 74 43 75 72 20 3d 20 70 50 61 72 73  iStatCur = pPars
b520: 65 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72 73  e->nTab;.  pPars
b530: 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20  e->nTab += 3;.  
b540: 6f 70 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50  openStatTable(pP
b550: 61 72 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74  arse, iDb, iStat
b560: 43 75 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 4d  Cur, 0, 0);.  iM
b570: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
b580: 6d 2b 31 3b 0a 20 20 69 54 61 62 20 3d 20 70 50  m+1;.  iTab = pP
b590: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 61 73  arse->nTab;.  as
b5a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
b5b0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
b5c0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f   iDb, 0) );.  fo
b5d0: 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
b5e0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
b5f0: 6c 48 61 73 68 29 3b 20 6b 3b 20 6b 3d 73 71 6c  lHash); k; k=sql
b600: 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
b610: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
b620: 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
b630: 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
b640: 20 20 61 6e 61 6c 79 7a 65 4f 6e 65 54 61 62 6c    analyzeOneTabl
b650: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
b660: 30 2c 20 69 53 74 61 74 43 75 72 2c 20 69 4d 65  0, iStatCur, iMe
b670: 6d 2c 20 69 54 61 62 29 3b 0a 20 20 7d 0a 20 20  m, iTab);.  }.  
b680: 6c 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61  loadAnalysis(pPa
b690: 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  rse, iDb);.}../*
b6a0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
b6b0: 65 20 74 68 61 74 20 77 69 6c 6c 20 64 6f 20 61  e that will do a
b6c0: 6e 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 61 20  n analysis of a 
b6d0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 0a  single table in.
b6e0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 2e 20 20  ** a database.  
b6f0: 49 66 20 70 4f 6e 6c 79 49 64 78 20 69 73 20 6e  If pOnlyIdx is n
b700: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
b710: 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  is a single inde
b720: 78 0a 2a 2a 20 69 6e 20 70 54 61 62 20 74 68 61  x.** in pTab tha
b730: 74 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 61 6c  t should be anal
b740: 79 7a 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  yzed..*/.static 
b750: 76 6f 69 64 20 61 6e 61 6c 79 7a 65 54 61 62 6c  void analyzeTabl
b760: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
b770: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 49 6e   Table *pTab, In
b780: 64 65 78 20 2a 70 4f 6e 6c 79 49 64 78 29 7b 0a  dex *pOnlyIdx){.
b790: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74    int iDb;.  int
b7a0: 20 69 53 74 61 74 43 75 72 3b 0a 0a 20 20 61 73   iStatCur;..  as
b7b0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
b7c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b7d0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
b7e0: 75 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64  utexes(pParse->d
b7f0: 62 29 20 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  b) );.  iDb = sq
b800: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
b810: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
b820: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
b830: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
b840: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
b850: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 69  se, 0, iDb);.  i
b860: 53 74 61 74 43 75 72 20 3d 20 70 50 61 72 73 65  StatCur = pParse
b870: 2d 3e 6e 54 61 62 3b 0a 20 20 70 50 61 72 73 65  ->nTab;.  pParse
b880: 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 20 20 69  ->nTab += 3;.  i
b890: 66 28 20 70 4f 6e 6c 79 49 64 78 20 29 7b 0a 20  f( pOnlyIdx ){. 
b8a0: 20 20 20 6f 70 65 6e 53 74 61 74 54 61 62 6c 65     openStatTable
b8b0: 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 69 53  (pParse, iDb, iS
b8c0: 74 61 74 43 75 72 2c 20 70 4f 6e 6c 79 49 64 78  tatCur, pOnlyIdx
b8d0: 2d 3e 7a 4e 61 6d 65 2c 20 22 69 64 78 22 29 3b  ->zName, "idx");
b8e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
b8f0: 65 6e 53 74 61 74 54 61 62 6c 65 28 70 50 61 72  enStatTable(pPar
b900: 73 65 2c 20 69 44 62 2c 20 69 53 74 61 74 43 75  se, iDb, iStatCu
b910: 72 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  r, pTab->zName, 
b920: 22 74 62 6c 22 29 3b 0a 20 20 7d 0a 20 20 61 6e  "tbl");.  }.  an
b930: 61 6c 79 7a 65 4f 6e 65 54 61 62 6c 65 28 70 50  alyzeOneTable(pP
b940: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 4f 6e 6c  arse, pTab, pOnl
b950: 79 49 64 78 2c 20 69 53 74 61 74 43 75 72 2c 70  yIdx, iStatCur,p
b960: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 2c 70 50  Parse->nMem+1,pP
b970: 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 6c  arse->nTab);.  l
b980: 6f 61 64 41 6e 61 6c 79 73 69 73 28 70 50 61 72  oadAnalysis(pPar
b990: 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  se, iDb);.}../*.
b9a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b9b0: 20 66 6f 72 20 74 68 65 20 41 4e 41 4c 59 5a 45   for the ANALYZE
b9c0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 70   command.  The p
b9d0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
b9e0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 68 65 6e   routine.** when
b9f0: 20 69 74 20 72 65 63 6f 67 6e 69 7a 65 73 20 61   it recognizes a
ba00: 6e 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  n ANALYZE comman
ba10: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
ba20: 41 4e 41 4c 59 5a 45 20 20 20 20 20 20 20 20 20  ANALYZE         
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
ba50: 20 20 41 4e 41 4c 59 5a 45 20 20 3c 64 61 74 61    ANALYZE  <data
ba60: 62 61 73 65 3e 20 20 20 20 20 20 20 20 20 20 20  base>           
ba70: 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
ba80: 20 20 20 20 41 4e 41 4c 59 5a 45 20 20 3f 3c 64      ANALYZE  ?<d
ba90: 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
baa0: 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 0a 2a  name>  -- 3.**.*
bab0: 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
bac0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
bad0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
bae0: 62 61 73 65 73 20 74 6f 20 62 65 20 61 6e 61 6c  bases to be anal
baf0: 79 7a 65 64 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  yzed..** Form 2 
bb00: 61 6e 61 6c 79 7a 65 73 20 61 6c 6c 20 69 6e 64  analyzes all ind
bb10: 69 63 65 73 20 74 68 65 20 73 69 6e 67 6c 65 20  ices the single 
bb20: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 2e 0a  database named..
bb30: 2a 2a 20 46 6f 72 6d 20 33 20 61 6e 61 6c 79 7a  ** Form 3 analyz
bb40: 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  es all indices a
bb50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
bb60: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
bb70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
bb80: 6e 61 6c 79 7a 65 28 50 61 72 73 65 20 2a 70 50  nalyze(Parse *pP
bb90: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
bba0: 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
bbb0: 65 32 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  e2){.  sqlite3 *
bbc0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bbd0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
bbe0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  t i;.  char *z, 
bbf0: 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  *zDb;.  Table *p
bc00: 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
bc10: 64 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61  dx;.  Token *pTa
bc20: 62 6c 65 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20  bleName;.  Vdbe 
bc30: 2a 76 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  *v;..  /* Read t
bc40: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
bc50: 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
bc60: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
bc70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
bc80: 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
bc90: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
bca0: 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  n NULL. */.  ass
bcb0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
bcc0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
bcd0: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 3b 0a  (pParse->db) );.
bce0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
bcf0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
bd00: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
bd10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
bd20: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21   assert( pName2!
bd30: 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 3d 3d 30 20  =0 || pName1==0 
bd40: 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  );.  if( pName1=
bd50: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  =0 ){.    /* For
bd60: 6d 20 31 3a 20 20 41 6e 61 6c 79 7a 65 20 65 76  m 1:  Analyze ev
bd70: 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  erything */.    
bd80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
bd90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
bda0: 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69  if( i==1 ) conti
bdb0: 6e 75 65 3b 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  nue;  /* Do not 
bdc0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 54 45 4d 50  analyze the TEMP
bdd0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
bde0: 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61 62 61     analyzeDataba
bdf0: 73 65 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  se(pParse, i);. 
be00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
be10: 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 29 7b   pName2->n==0 ){
be20: 0a 20 20 20 20 2f 2a 20 46 6f 72 6d 20 32 3a 20  .    /* Form 2: 
be30: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 64 61 74   Analyze the dat
be40: 61 62 61 73 65 20 6f 72 20 74 61 62 6c 65 20 6e  abase or table n
be50: 61 6d 65 64 20 2a 2f 0a 20 20 20 20 69 44 62 20  amed */.    iDb 
be60: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
be70: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
be80: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
be90: 20 20 20 20 20 61 6e 61 6c 79 7a 65 44 61 74 61       analyzeData
bea0: 62 61 73 65 28 70 50 61 72 73 65 2c 20 69 44 62  base(pParse, iDb
beb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bec0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e      z = sqlite3N
bed0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
bee0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
bef0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
bf00: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
bf10: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
bf20: 2c 20 7a 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  , z, 0))!=0 ){. 
bf30: 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a 65           analyze
bf40: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 49  Table(pParse, pI
bf50: 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 49 64 78  dx->pTable, pIdx
bf60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
bf70: 20 69 66 28 20 28 70 54 61 62 20 3d 20 73 71 6c   if( (pTab = sql
bf80: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
bf90: 70 50 61 72 73 65 2c 20 30 2c 20 7a 2c 20 30 29  pParse, 0, z, 0)
bfa0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
bfb0: 20 20 61 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70    analyzeTable(p
bfc0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
bfd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bfe0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bff0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  (db, z);.      }
c000: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c010: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 33 3a 20 41      /* Form 3: A
c020: 6e 61 6c 79 7a 65 20 74 68 65 20 66 75 6c 6c 79  nalyze the fully
c030: 20 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65   qualified table
c040: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 44 62   name */.    iDb
c050: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
c060: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
c070: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
c080: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20  TableName);.    
c090: 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
c0a0: 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44      zDb = db->aD
c0b0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
c0c0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e      z = sqlite3N
c0d0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
c0e0: 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20   pTableName);.  
c0f0: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
c100: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 20 3d       if( (pIdx =
c110: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
c120: 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 29 21 3d  x(db, z, zDb))!=
c130: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
c140: 6e 61 6c 79 7a 65 54 61 62 6c 65 28 70 50 61 72  nalyzeTable(pPar
c150: 73 65 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  se, pIdx->pTable
c160: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
c170: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 61 62   }else if( (pTab
c180: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
c190: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
c1a0: 20 7a 2c 20 7a 44 62 29 29 21 3d 30 20 29 7b 0a   z, zDb))!=0 ){.
c1b0: 20 20 20 20 20 20 20 20 20 20 61 6e 61 6c 79 7a            analyz
c1c0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c1d0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
c1e0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
c1f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
c200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20  .      }.    }  
c210: 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69   .  }.  v = sqli
c220: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c230: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 20 73 71  e);.  if( v ) sq
c240: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
c250: 76 2c 20 4f 50 5f 45 78 70 69 72 65 29 3b 0a 7d  v, OP_Expire);.}
c260: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20  ../*.** Used to 
c270: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
c280: 20 66 72 6f 6d 20 74 68 65 20 61 6e 61 6c 79 7a   from the analyz
c290: 65 72 20 72 65 61 64 65 72 20 74 68 72 6f 75 67  er reader throug
c2a0: 68 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  h to the.** call
c2b0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  back routine..*/
c2c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
c2d0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 61 6e 61  analysisInfo ana
c2e0: 6c 79 73 69 73 49 6e 66 6f 3b 0a 73 74 72 75 63  lysisInfo;.struc
c2f0: 74 20 61 6e 61 6c 79 73 69 73 49 6e 66 6f 20 7b  t analysisInfo {
c300: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c310: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
c320: 61 74 61 62 61 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a  atabase;.};../*.
c330: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
c340: 75 6d 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20  ument points to 
c350: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
c360: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
c370: 6e 67 20 61 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  ng a.** list of 
c380: 73 70 61 63 65 20 73 65 70 61 72 61 74 65 64 20  space separated 
c390: 69 6e 74 65 67 65 72 73 2e 20 52 65 61 64 20 74  integers. Read t
c3a0: 68 65 20 66 69 72 73 74 20 6e 4f 75 74 20 6f 66  he first nOut of
c3b0: 20 74 68 65 73 65 20 69 6e 74 6f 0a 2a 2a 20 74   these into.** t
c3c0: 68 65 20 61 72 72 61 79 20 61 4f 75 74 5b 5d 2e  he array aOut[].
c3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c3e0: 64 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a  decodeIntArray(.
c3f0: 20 20 63 68 61 72 20 2a 7a 49 6e 74 41 72 72 61    char *zIntArra
c400: 79 2c 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69  y,       /* Stri
c410: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e  ng containing in
c420: 74 20 61 72 72 61 79 20 74 6f 20 64 65 63 6f 64  t array to decod
c430: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  e */.  int nOut,
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c450: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
c460: 20 69 6e 20 61 4f 75 74 5b 5d 20 2a 2f 0a 20 20   in aOut[] */.  
c470: 74 52 6f 77 63 6e 74 20 2a 61 4f 75 74 2c 20 20  tRowcnt *aOut,  
c480: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
c490: 69 6e 74 65 67 65 72 73 20 68 65 72 65 20 2a 2f  integers here */
c4a0: 0a 20 20 4c 6f 67 45 73 74 20 2a 61 4c 6f 67 2c  .  LogEst *aLog,
c4b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 2c            /* Or,
c4c0: 20 69 66 20 61 4f 75 74 3d 3d 30 2c 20 68 65 72   if aOut==0, her
c4d0: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
c4e0: 6e 64 65 78 20 20 20 20 20 20 20 20 20 20 2f 2a  ndex          /*
c4f0: 20 48 61 6e 64 6c 65 20 65 78 74 72 61 20 66 6c   Handle extra fl
c500: 61 67 73 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ags for this ind
c510: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
c520: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20  */.){.  char *z 
c530: 3d 20 7a 49 6e 74 41 72 72 61 79 3b 0a 20 20 69  = zIntArray;.  i
c540: 6e 74 20 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt c;.  int i;. 
c550: 20 74 52 6f 77 63 6e 74 20 76 3b 0a 0a 23 69 66   tRowcnt v;..#if
c560: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c570: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
c580: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20  .  if( z==0 ) z 
c590: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 61 73  = "";.#else.  as
c5a0: 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 23 65  sert( z!=0 );.#e
c5b0: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
c5c0: 2a 7a 20 26 26 20 69 3c 6e 4f 75 74 3b 20 69 2b  *z && i<nOut; i+
c5d0: 2b 29 7b 0a 20 20 20 20 76 20 3d 20 30 3b 0a 20  +){.    v = 0;. 
c5e0: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 30     while( (c=z[0
c5f0: 5d 29 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39  ])>='0' && c<='9
c600: 27 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76  ' ){.      v = v
c610: 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20  *10 + c - '0';. 
c620: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
c630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c640: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
c650: 41 54 34 0a 20 20 20 20 69 66 28 20 61 4f 75 74  AT4.    if( aOut
c660: 20 29 20 61 4f 75 74 5b 69 5d 20 3d 20 76 3b 0a   ) aOut[i] = v;.
c670: 20 20 20 20 69 66 28 20 61 4c 6f 67 20 29 20 61      if( aLog ) a
c680: 4c 6f 67 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Log[i] = sqlite3
c690: 4c 6f 67 45 73 74 28 76 29 3b 0a 23 65 6c 73 65  LogEst(v);.#else
c6a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 75  .    assert( aOu
c6b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 55 4e 55 53  t==0 );.    UNUS
c6c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 4f 75  ED_PARAMETER(aOu
c6d0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
c6e0: 61 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 61  aLog!=0 );.    a
c6f0: 4c 6f 67 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Log[i] = sqlite3
c700: 4c 6f 67 45 73 74 28 76 29 3b 0a 23 65 6e 64 69  LogEst(v);.#endi
c710: 66 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 20  f.    if( *z==' 
c720: 27 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 23 69 66  ' ) z++;.  }.#if
c730: 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
c740: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
c750: 34 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  4.  assert( pInd
c760: 65 78 21 3d 30 20 29 3b 20 7b 0a 23 65 6c 73 65  ex!=0 ); {.#else
c770: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
c780: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49 6e 64  .#endif.    pInd
c790: 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d  ex->bUnordered =
c7a0: 20 30 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   0;.    pIndex->
c7b0: 6e 6f 53 6b 69 70 53 63 61 6e 20 3d 20 30 3b 0a  noSkipScan = 0;.
c7c0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20      while( z[0] 
c7d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c7e0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 75 6e  ite3_strglob("un
c7f0: 6f 72 64 65 72 65 64 2a 22 2c 20 7a 29 3d 3d 30  ordered*", z)==0
c800: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
c810: 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 3d  ex->bUnordered =
c820: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
c830: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
c840: 6c 6f 62 28 22 73 7a 3d 5b 30 2d 39 5d 2a 22 2c  lob("sz=[0-9]*",
c850: 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   z)==0 ){.      
c860: 20 20 70 49 6e 64 65 78 2d 3e 73 7a 49 64 78 52    pIndex->szIdxR
c870: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
c880: 73 74 28 73 71 6c 69 74 65 33 41 74 6f 69 28 7a  st(sqlite3Atoi(z
c890: 2b 33 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +3));.      }els
c8a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74  e if( sqlite3_st
c8b0: 72 67 6c 6f 62 28 22 6e 6f 73 6b 69 70 73 63 61  rglob("noskipsca
c8c0: 6e 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20  n*", z)==0 ){.  
c8d0: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 6f        pIndex->no
c8e0: 53 6b 69 70 53 63 61 6e 20 3d 20 31 3b 0a 20 20  SkipScan = 1;.  
c8f0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
c900: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d  ITE_ENABLE_COSTM
c910: 55 4c 54 0a 20 20 20 20 20 20 65 6c 73 65 20 69  ULT.      else i
c920: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
c930: 6f 62 28 22 63 6f 73 74 6d 75 6c 74 3d 5b 30 2d  ob("costmult=[0-
c940: 39 5d 2a 22 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20  9]*",z)==0 ){.  
c950: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
c960: 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 20 3d  able->costMult =
c970: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
c980: 71 6c 69 74 65 33 41 74 6f 69 28 7a 2b 39 29 29  qlite3Atoi(z+9))
c990: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
c9a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  .      while( z[
c9b0: 30 5d 21 3d 30 20 26 26 20 7a 5b 30 5d 21 3d 27  0]!=0 && z[0]!='
c9c0: 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20   ' ) z++;.      
c9d0: 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27  while( z[0]==' '
c9e0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
c9f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
ca00: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
ca10: 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
ca20: 68 20 69 6e 64 65 78 20 77 68 65 6e 20 72 65 61  h index when rea
ca30: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ding the.** sqli
ca40: 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2e 20  te_stat1 table. 
ca50: 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76   .**.**     argv
ca60: 5b 30 5d 20 3d 20 6e 61 6d 65 20 6f 66 20 74 68  [0] = name of th
ca70: 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 61  e table.**     a
ca80: 72 67 76 5b 31 5d 20 3d 20 6e 61 6d 65 20 6f 66  rgv[1] = name of
ca90: 20 74 68 65 20 69 6e 64 65 78 20 28 6d 69 67 68   the index (migh
caa0: 74 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 20 20  t be NULL).**   
cab0: 20 20 61 72 67 76 5b 32 5d 20 3d 20 72 65 73 75    argv[2] = resu
cac0: 6c 74 73 20 6f 66 20 61 6e 61 6c 79 73 69 73 20  lts of analysis 
cad0: 2d 20 6f 6e 20 69 6e 74 65 67 65 72 20 66 6f 72  - on integer for
cae0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   each column.**.
caf0: 2a 2a 20 45 6e 74 72 69 65 73 20 66 6f 72 20 77  ** Entries for w
cb00: 68 69 63 68 20 61 72 67 76 5b 31 5d 3d 3d 4e 55  hich argv[1]==NU
cb10: 4c 4c 20 73 69 6d 70 6c 79 20 72 65 63 6f 72 64  LL simply record
cb20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
cb30: 6f 77 73 20 69 6e 0a 2a 2a 20 74 68 65 20 74 61  ows in.** the ta
cb40: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
cb50: 6e 74 20 61 6e 61 6c 79 73 69 73 4c 6f 61 64 65  nt analysisLoade
cb60: 72 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  r(void *pData, i
cb70: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
cb80: 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74  argv, char **Not
cb90: 55 73 65 64 29 7b 0a 20 20 61 6e 61 6c 79 73 69  Used){.  analysi
cba0: 73 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 28  sInfo *pInfo = (
cbb0: 61 6e 61 6c 79 73 69 73 49 6e 66 6f 2a 29 70 44  analysisInfo*)pD
cbc0: 61 74 61 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ata;.  Index *pI
cbd0: 6e 64 65 78 3b 0a 20 20 54 61 62 6c 65 20 2a 70  ndex;.  Table *p
cbe0: 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  Table;.  const c
cbf0: 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
cc00: 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20  t( argc==3 );.  
cc10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
cc20: 32 28 4e 6f 74 55 73 65 64 2c 20 61 72 67 63 29  2(NotUsed, argc)
cc30: 3b 0a 0a 20 20 69 66 28 20 61 72 67 76 3d 3d 30  ;..  if( argv==0
cc40: 20 7c 7c 20 61 72 67 76 5b 30 5d 3d 3d 30 20 7c   || argv[0]==0 |
cc50: 7c 20 61 72 67 76 5b 32 5d 3d 3d 30 20 29 7b 0a  | argv[2]==0 ){.
cc60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cc70: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
cc80: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 49  ite3FindTable(pI
cc90: 6e 66 6f 2d 3e 64 62 2c 20 61 72 67 76 5b 30 5d  nfo->db, argv[0]
cca0: 2c 20 70 49 6e 66 6f 2d 3e 7a 44 61 74 61 62 61  , pInfo->zDataba
ccb0: 73 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  se);.  if( pTabl
ccc0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
ccd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
cce0: 61 72 67 76 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20  argv[1]==0 ){.  
ccf0: 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
cd00: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
cd10: 33 5f 73 74 72 69 63 6d 70 28 61 72 67 76 5b 30  3_stricmp(argv[0
cd20: 5d 2c 61 72 67 76 5b 31 5d 29 3d 3d 30 20 29 7b  ],argv[1])==0 ){
cd30: 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71  .    pIndex = sq
cd40: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
cd50: 6e 64 65 78 28 70 54 61 62 6c 65 29 3b 0a 20 20  ndex(pTable);.  
cd60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65  }else{.    pInde
cd70: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
cd80: 6e 64 65 78 28 70 49 6e 66 6f 2d 3e 64 62 2c 20  ndex(pInfo->db, 
cd90: 61 72 67 76 5b 31 5d 2c 20 70 49 6e 66 6f 2d 3e  argv[1], pInfo->
cda0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 7d 0a  zDatabase);.  }.
cdb0: 20 20 7a 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 0a    z = argv[2];..
cdc0: 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
cdd0: 20 20 20 20 74 52 6f 77 63 6e 74 20 2a 61 69 52      tRowcnt *aiR
cde0: 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 20 20 69  owEst = 0;.    i
cdf0: 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nt nCol = pIndex
ce00: 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 3b 0a 23 69 66  ->nKeyCol+1;.#if
ce10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ce20: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
ce30: 0a 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69  .    /* Index.ai
ce40: 52 6f 77 45 73 74 20 6d 61 79 20 61 6c 72 65 61  RowEst may alrea
ce50: 64 79 20 62 65 20 73 65 74 20 68 65 72 65 20 69  dy be set here i
ce60: 66 20 74 68 65 72 65 20 61 72 65 20 64 75 70 6c  f there are dupl
ce70: 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 73 71  icate .    ** sq
ce80: 6c 69 74 65 5f 73 74 61 74 31 20 65 6e 74 72 69  lite_stat1 entri
ce90: 65 73 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  es for this inde
cea0: 78 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  x. In that case 
ceb0: 6a 75 73 74 20 63 6c 6f 62 62 65 72 0a 20 20 20  just clobber.   
cec0: 20 2a 2a 20 74 68 65 20 6f 6c 64 20 64 61 74 61   ** the old data
ced0: 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 69 6e   with the new in
cee0: 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74  stead of allocat
cef0: 69 6e 67 20 61 20 6e 65 77 20 61 72 72 61 79 2e  ing a new array.
cf00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 6e    */.    if( pIn
cf10: 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 3d 3d 30  dex->aiRowEst==0
cf20: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
cf30: 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 74 52  ->aiRowEst = (tR
cf40: 6f 77 63 6e 74 2a 29 73 71 6c 69 74 65 33 4d 61  owcnt*)sqlite3Ma
cf50: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
cf60: 74 52 6f 77 63 6e 74 29 20 2a 20 6e 43 6f 6c 29  tRowcnt) * nCol)
cf70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  ;.      if( pInd
cf80: 65 78 2d 3e 61 69 52 6f 77 45 73 74 3d 3d 30 20  ex->aiRowEst==0 
cf90: 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c  ) sqlite3OomFaul
cfa0: 74 28 70 49 6e 66 6f 2d 3e 64 62 29 3b 0a 20 20  t(pInfo->db);.  
cfb0: 20 20 7d 0a 20 20 20 20 61 69 52 6f 77 45 73 74    }.    aiRowEst
cfc0: 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77   = pIndex->aiRow
cfd0: 45 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Est;.#endif.    
cfe0: 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
cff0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 65 63 6f  ed = 0;.    deco
d000: 64 65 49 6e 74 41 72 72 61 79 28 28 63 68 61 72  deIntArray((char
d010: 2a 29 7a 2c 20 6e 43 6f 6c 2c 20 61 69 52 6f 77  *)z, nCol, aiRow
d020: 45 73 74 2c 20 70 49 6e 64 65 78 2d 3e 61 69 52  Est, pIndex->aiR
d030: 6f 77 4c 6f 67 45 73 74 2c 20 70 49 6e 64 65 78  owLogEst, pIndex
d040: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
d050: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
d060: 3d 3d 30 20 29 20 70 54 61 62 6c 65 2d 3e 6e 52  ==0 ) pTable->nR
d070: 6f 77 4c 6f 67 45 73 74 20 3d 20 70 49 6e 64 65  owLogEst = pInde
d080: 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30  x->aiRowLogEst[0
d090: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
d0a0: 49 6e 64 65 78 20 66 61 6b 65 49 64 78 3b 0a 20  Index fakeIdx;. 
d0b0: 20 20 20 66 61 6b 65 49 64 78 2e 73 7a 49 64 78     fakeIdx.szIdx
d0c0: 52 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e 73 7a  Row = pTable->sz
d0d0: 54 61 62 52 6f 77 3b 0a 23 69 66 64 65 66 20 53  TabRow;.#ifdef S
d0e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
d0f0: 54 4d 55 4c 54 0a 20 20 20 20 66 61 6b 65 49 64  TMULT.    fakeId
d100: 78 2e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  x.pTable = pTabl
d110: 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  e;.#endif.    de
d120: 63 6f 64 65 49 6e 74 41 72 72 61 79 28 28 63 68  codeIntArray((ch
d130: 61 72 2a 29 7a 2c 20 31 2c 20 30 2c 20 26 70 54  ar*)z, 1, 0, &pT
d140: 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
d150: 2c 20 26 66 61 6b 65 49 64 78 29 3b 0a 20 20 20  , &fakeIdx);.   
d160: 20 70 54 61 62 6c 65 2d 3e 73 7a 54 61 62 52 6f   pTable->szTabRo
d170: 77 20 3d 20 66 61 6b 65 49 64 78 2e 73 7a 49 64  w = fakeIdx.szId
d180: 78 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  xRow;.  }..  ret
d190: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d1a0: 49 66 20 74 68 65 20 49 6e 64 65 78 2e 61 53 61  If the Index.aSa
d1b0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73  mple variable is
d1c0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 64 65 6c 65 74   not NULL, delet
d1d0: 65 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  e the aSample[] 
d1e0: 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20 69 74 73  array.** and its
d1f0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   contents..*/.vo
d200: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
d210: 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 73 71 6c  IndexSamples(sql
d220: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
d230: 2a 70 49 64 78 29 7b 0a 23 69 66 64 65 66 20 53  *pIdx){.#ifdef S
d240: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
d250: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66  T3_OR_STAT4.  if
d260: 28 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20  ( pIdx->aSample 
d270: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
d280: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
d290: 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20 6a 2b 2b 29  x->nSample; j++)
d2a0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 53 61 6d  {.      IndexSam
d2b0: 70 6c 65 20 2a 70 20 3d 20 26 70 49 64 78 2d 3e  ple *p = &pIdx->
d2c0: 61 53 61 6d 70 6c 65 5b 6a 5d 3b 0a 20 20 20 20  aSample[j];.    
d2d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d2e0: 64 62 2c 20 70 2d 3e 70 29 3b 0a 20 20 20 20 7d  db, p->p);.    }
d2f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d300: 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 61 53 61  ee(db, pIdx->aSa
d310: 6d 70 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  mple);.  }.  if(
d320: 20 64 62 20 26 26 20 64 62 2d 3e 70 6e 42 79 74   db && db->pnByt
d330: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
d340: 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20    pIdx->nSample 
d350: 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 2d 3e 61  = 0;.    pIdx->a
d360: 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  Sample = 0;.  }.
d370: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
d380: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
d390: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
d3a0: 28 70 49 64 78 29 3b 0a 23 65 6e 64 69 66 20 2f  (pIdx);.#endif /
d3b0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
d3c0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
d3d0: 2f 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  /.}..#ifdef SQLI
d3e0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
d3f0: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 50  OR_STAT4./*.** P
d400: 6f 70 75 6c 61 74 65 20 74 68 65 20 70 49 64 78  opulate the pIdx
d410: 2d 3e 61 41 76 67 45 71 5b 5d 20 61 72 72 61 79  ->aAvgEq[] array
d420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 61   based on the sa
d430: 6d 70 6c 65 73 20 63 75 72 72 65 6e 74 6c 79 0a  mples currently.
d440: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 49 64  ** stored in pId
d450: 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 2e 20 0a 2a  x->aSample[]. .*
d460: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
d470: 69 74 41 76 67 45 71 28 49 6e 64 65 78 20 2a 70  itAvgEq(Index *p
d480: 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78  Idx){.  if( pIdx
d490: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d   ){.    IndexSam
d4a0: 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70  ple *aSample = p
d4b0: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
d4c0: 20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 70    IndexSample *p
d4d0: 46 69 6e 61 6c 20 3d 20 26 61 53 61 6d 70 6c 65  Final = &aSample
d4e0: 5b 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31  [pIdx->nSample-1
d4f0: 5d 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  ];.    int iCol;
d500: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  .    int nCol = 
d510: 31 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  1;.    if( pIdx-
d520: 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3e 31 20 29 7b  >nSampleCol>1 ){
d530: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
d540: 73 20 69 73 20 73 74 61 74 34 20 64 61 74 61 2c  s is stat4 data,
d550: 20 74 68 65 6e 20 63 61 6c 63 75 6c 61 74 65 20   then calculate 
d560: 61 41 76 67 45 71 5b 5d 20 76 61 6c 75 65 73 20  aAvgEq[] values 
d570: 66 6f 72 20 61 6c 6c 0a 20 20 20 20 20 20 2a 2a  for all.      **
d580: 20 73 61 6d 70 6c 65 20 63 6f 6c 75 6d 6e 73 20   sample columns 
d590: 65 78 63 65 70 74 20 74 68 65 20 6c 61 73 74 2e  except the last.
d5a0: 20 54 68 65 20 6c 61 73 74 20 69 73 20 61 6c 77   The last is alw
d5b0: 61 79 73 20 73 65 74 20 74 6f 20 31 2c 20 61 73  ays set to 1, as
d5c0: 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74  .      ** once t
d5d0: 68 65 20 74 72 61 69 6c 69 6e 67 20 50 4b 20 66  he trailing PK f
d5e0: 69 65 6c 64 73 20 61 72 65 20 63 6f 6e 73 69 64  ields are consid
d5f0: 65 72 65 64 20 61 6c 6c 20 69 6e 64 65 78 20 6b  ered all index k
d600: 65 79 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  eys are.      **
d610: 20 75 6e 69 71 75 65 2e 20 20 2a 2f 0a 20 20 20   unique.  */.   
d620: 20 20 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e     nCol = pIdx->
d630: 6e 53 61 6d 70 6c 65 43 6f 6c 2d 31 3b 0a 20 20  nSampleCol-1;.  
d640: 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71      pIdx->aAvgEq
d650: 5b 6e 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20 20 20  [nCol] = 1;.    
d660: 7d 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  }.    for(iCol=0
d670: 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f  ; iCol<nCol; iCo
d680: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
d690: 6e 53 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e  nSample = pIdx->
d6a0: 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 20 20 69  nSample;.      i
d6b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
d6d0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
d6e0: 75 67 68 20 73 61 6d 70 6c 65 73 20 2a 2f 0a 20  ugh samples */. 
d6f0: 20 20 20 20 20 74 52 6f 77 63 6e 74 20 73 75 6d       tRowcnt sum
d700: 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  Eq = 0;        /
d710: 2a 20 53 75 6d 20 6f 66 20 74 68 65 20 6e 45 71  * Sum of the nEq
d720: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20   values */.     
d730: 20 74 52 6f 77 63 6e 74 20 61 76 67 45 71 20 3d   tRowcnt avgEq =
d740: 20 30 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e   0;.      tRowcn
d750: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
d760: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d770: 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 20 2a   rows in index *
d780: 2f 0a 20 20 20 20 20 20 69 36 34 20 6e 53 75 6d  /.      i64 nSum
d790: 31 30 30 20 3d 20 30 3b 20 20 20 20 20 20 20 20  100 = 0;        
d7a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d7b0: 65 72 6d 73 20 63 6f 6e 74 72 69 62 75 74 69 6e  erms contributin
d7c0: 67 20 74 6f 20 73 75 6d 45 71 20 2a 2f 0a 20 20  g to sumEq */.  
d7d0: 20 20 20 20 69 36 34 20 6e 44 69 73 74 31 30 30      i64 nDist100
d7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d7f0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 69 73 74 69   Number of disti
d800: 6e 63 74 20 76 61 6c 75 65 73 20 69 6e 20 69 6e  nct values in in
d810: 64 65 78 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  dex */..      if
d820: 28 20 21 70 49 64 78 2d 3e 61 69 52 6f 77 45 73  ( !pIdx->aiRowEs
d830: 74 20 7c 7c 20 69 43 6f 6c 3e 3d 70 49 64 78 2d  t || iCol>=pIdx-
d840: 3e 6e 4b 65 79 43 6f 6c 20 7c 7c 20 70 49 64 78  >nKeyCol || pIdx
d850: 2d 3e 61 69 52 6f 77 45 73 74 5b 69 43 6f 6c 2b  ->aiRowEst[iCol+
d860: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
d870: 20 6e 52 6f 77 20 3d 20 70 46 69 6e 61 6c 2d 3e   nRow = pFinal->
d880: 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
d890: 20 20 20 20 6e 44 69 73 74 31 30 30 20 3d 20 28      nDist100 = (
d8a0: 69 36 34 29 31 30 30 20 2a 20 70 46 69 6e 61 6c  i64)100 * pFinal
d8b0: 2d 3e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  ->anDLt[iCol];. 
d8c0: 20 20 20 20 20 20 20 6e 53 61 6d 70 6c 65 2d 2d         nSample--
d8d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d8e0: 20 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 70 49         nRow = pI
d8f0: 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b  dx->aiRowEst[0];
d900: 0a 20 20 20 20 20 20 20 20 6e 44 69 73 74 31 30  .        nDist10
d910: 30 20 3d 20 28 28 69 36 34 29 31 30 30 20 2a 20  0 = ((i64)100 * 
d920: 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30  pIdx->aiRowEst[0
d930: 5d 29 20 2f 20 70 49 64 78 2d 3e 61 69 52 6f 77  ]) / pIdx->aiRow
d940: 45 73 74 5b 69 43 6f 6c 2b 31 5d 3b 0a 20 20 20  Est[iCol+1];.   
d950: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 64 78 2d     }.      pIdx-
d960: 3e 6e 52 6f 77 45 73 74 30 20 3d 20 6e 52 6f 77  >nRowEst0 = nRow
d970: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
d980: 6e 53 75 6d 20 74 6f 20 74 68 65 20 6e 75 6d 62  nSum to the numb
d990: 65 72 20 6f 66 20 64 69 73 74 69 6e 63 74 20 28  er of distinct (
d9a0: 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72  iCol+1) field pr
d9b0: 65 66 69 78 65 73 20 74 68 61 74 0a 20 20 20 20  efixes that.    
d9c0: 20 20 2a 2a 20 6f 63 63 75 72 20 69 6e 20 74 68    ** occur in th
d9d0: 65 20 73 74 61 74 34 20 74 61 62 6c 65 20 66 6f  e stat4 table fo
d9e0: 72 20 74 68 69 73 20 69 6e 64 65 78 2e 20 53 65  r this index. Se
d9f0: 74 20 73 75 6d 45 71 20 74 6f 20 74 68 65 20 73  t sumEq to the s
da00: 75 6d 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20  um of .      ** 
da10: 74 68 65 20 6e 45 71 20 76 61 6c 75 65 73 20 66  the nEq values f
da20: 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 66  or column iCol f
da30: 6f 72 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  or the same set 
da40: 28 61 64 64 69 6e 67 20 74 68 65 20 76 61 6c 75  (adding the valu
da50: 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79  e .      ** only
da60: 20 6f 6e 63 65 20 77 68 65 72 65 20 74 68 65 72   once where ther
da70: 65 20 65 78 69 73 74 20 64 75 70 6c 69 63 61 74  e exist duplicat
da80: 65 20 70 72 65 66 69 78 65 73 29 2e 20 20 2a 2f  e prefixes).  */
da90: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
daa0: 69 3c 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  i<nSample; i++){
dab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
dac0: 28 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2d 31  (pIdx->nSample-1
dad0: 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 61 53  ).         || aS
dae0: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 44 4c 74 5b 69  ample[i].anDLt[i
daf0: 43 6f 6c 5d 21 3d 61 53 61 6d 70 6c 65 5b 69 2b  Col]!=aSample[i+
db00: 31 5d 2e 61 6e 44 4c 74 5b 69 43 6f 6c 5d 20 0a  1].anDLt[iCol] .
db10: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
db20: 20 20 20 20 20 73 75 6d 45 71 20 2b 3d 20 61 53       sumEq += aS
db30: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
db40: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ol];.          n
db50: 53 75 6d 31 30 30 20 2b 3d 20 31 30 30 3b 0a 20  Sum100 += 100;. 
db60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
db70: 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 73  ..      if( nDis
db80: 74 31 30 30 3e 6e 53 75 6d 31 30 30 20 29 7b 0a  t100>nSum100 ){.
db90: 20 20 20 20 20 20 20 20 61 76 67 45 71 20 3d 20          avgEq = 
dba0: 28 28 69 36 34 29 31 30 30 20 2a 20 28 6e 52 6f  ((i64)100 * (nRo
dbb0: 77 20 2d 20 73 75 6d 45 71 29 29 2f 28 6e 44 69  w - sumEq))/(nDi
dbc0: 73 74 31 30 30 20 2d 20 6e 53 75 6d 31 30 30 29  st100 - nSum100)
dbd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dbe0: 69 66 28 20 61 76 67 45 71 3d 3d 30 20 29 20 61  if( avgEq==0 ) a
dbf0: 76 67 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  vgEq = 1;.      
dc00: 70 49 64 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f  pIdx->aAvgEq[iCo
dc10: 6c 5d 20 3d 20 61 76 67 45 71 3b 0a 20 20 20 20  l] = avgEq;.    
dc20: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  }.  }.}../*.** L
dc30: 6f 6f 6b 20 75 70 20 61 6e 20 69 6e 64 65 78 20  ook up an index 
dc40: 62 79 20 6e 61 6d 65 2e 20 20 4f 72 2c 20 69 66  by name.  Or, if
dc50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 57   the name of a W
dc60: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
dc70: 6c 65 0a 2a 2a 20 69 73 20 73 75 70 70 6c 69 65  le.** is supplie
dc80: 64 20 69 6e 73 74 65 61 64 2c 20 66 69 6e 64 20  d instead, find 
dc90: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
dca0: 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74  index for that t
dcb0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
dcc0: 49 6e 64 65 78 20 2a 66 69 6e 64 49 6e 64 65 78  Index *findIndex
dcd0: 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  OrPrimaryKey(.  
dce0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
dcf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
dd00: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
dd10: 7a 44 62 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a  zDb.){.  Index *
dd20: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69  pIdx = sqlite3Fi
dd30: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
dd40: 65 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  e, zDb);.  if( p
dd50: 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  Idx==0 ){.    Ta
dd60: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
dd70: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
dd80: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20   zName, zDb);.  
dd90: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 48    if( pTab && !H
dda0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
ddb0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 50 72  pIdx = sqlite3Pr
ddc0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
ddd0: 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ab);.  }.  retur
dde0: 6e 20 70 49 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pIdx;.}../*.**
ddf0: 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Load the conten
de00: 74 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68  t from either th
de10: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 6f  e sqlite_stat4 o
de20: 72 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20 74  r sqlite_stat3 t
de30: 61 62 6c 65 20 0a 2a 2a 20 69 6e 74 6f 20 74 68  able .** into th
de40: 65 20 72 65 6c 65 76 61 6e 74 20 49 6e 64 65 78  e relevant Index
de50: 2e 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79  .aSample[] array
de60: 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  s..**.** Argumen
de70: 74 73 20 7a 53 71 6c 31 20 61 6e 64 20 7a 53 71  ts zSql1 and zSq
de80: 6c 32 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  l2 must point to
de90: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
dea0: 74 68 61 74 20 72 65 74 75 72 6e 0a 2a 2a 20 64  that return.** d
deb0: 61 74 61 20 65 71 75 69 76 61 6c 65 6e 74 20 74  ata equivalent t
dec0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
ded0: 28 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20  (statements are 
dee0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 73 74  different for st
def0: 61 74 33 2c 0a 2a 2a 20 73 65 65 20 74 68 65 20  at3,.** see the 
df00: 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
df10: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61  unction for deta
df20: 69 6c 73 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 7a  ils):.**.**    z
df30: 53 71 6c 31 3a 20 53 45 4c 45 43 54 20 69 64 78  Sql1: SELECT idx
df40: 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25  ,count(*) FROM %
df50: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 34 20 47  Q.sqlite_stat4 G
df60: 52 4f 55 50 20 42 59 20 69 64 78 0a 2a 2a 20 20  ROUP BY idx.**  
df70: 20 20 7a 53 71 6c 32 3a 20 53 45 4c 45 43 54 20    zSql2: SELECT 
df80: 69 64 78 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74  idx,neq,nlt,ndlt
df90: 2c 73 61 6d 70 6c 65 20 46 52 4f 4d 20 25 51 2e  ,sample FROM %Q.
dfa0: 73 71 6c 69 74 65 5f 73 74 61 74 34 0a 2a 2a 0a  sqlite_stat4.**.
dfb0: 2a 2a 20 77 68 65 72 65 20 25 51 20 69 73 20 72  ** where %Q is r
dfc0: 65 70 6c 61 63 65 64 20 77 69 74 68 20 74 68 65  eplaced with the
dfd0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 62   database name b
dfe0: 65 66 6f 72 65 20 74 68 65 20 53 51 4c 20 69 73  efore the SQL is
dff0: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74   executed..*/.st
e000: 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61  atic int loadSta
e010: 74 54 62 6c 28 0a 20 20 73 71 6c 69 74 65 33 20  tTbl(.  sqlite3 
e020: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
e030: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
e040: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
e050: 74 20 62 53 74 61 74 33 2c 20 20 20 20 20 20 20  t bStat3,       
e060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e070: 73 73 75 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c  ssume single col
e080: 75 6d 6e 20 72 65 63 6f 72 64 73 20 6f 6e 6c 79  umn records only
e090: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e0a0: 20 2a 7a 53 71 6c 31 2c 20 20 20 20 20 20 20 20   *zSql1,        
e0b0: 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
e0c0: 6d 65 6e 74 20 31 20 28 73 65 65 20 61 62 6f 76  ment 1 (see abov
e0d0: 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  e) */.  const ch
e0e0: 61 72 20 2a 7a 53 71 6c 32 2c 20 20 20 20 20 20  ar *zSql2,      
e0f0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
e100: 74 65 6d 65 6e 74 20 32 20 28 73 65 65 20 61 62  tement 2 (see ab
e110: 6f 76 65 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ove) */.  const 
e120: 63 68 61 72 20 2a 7a 44 62 20 20 20 20 20 20 20  char *zDb       
e130: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e140: 61 73 65 20 6e 61 6d 65 20 28 65 2e 67 2e 20 22  ase name (e.g. "
e150: 6d 61 69 6e 22 29 20 2a 2f 0a 29 7b 0a 20 20 69  main") */.){.  i
e160: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e180: 52 65 73 75 6c 74 20 63 6f 64 65 73 20 66 72 6f  Result codes fro
e190: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
e1a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
e1b0: 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
e1c0: 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65   /* An SQL state
e1d0: 6d 65 6e 74 20 62 65 69 6e 67 20 72 75 6e 20 2a  ment being run *
e1e0: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  /.  char *zSql; 
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
e210: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
e220: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 65 76  /.  Index *pPrev
e230: 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
e240: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 69 6e    /* Previous in
e250: 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70 20  dex in the loop 
e260: 2a 2f 0a 20 20 49 6e 64 65 78 53 61 6d 70 6c 65  */.  IndexSample
e270: 20 2a 70 53 61 6d 70 6c 65 3b 20 20 20 20 20 20   *pSample;      
e280: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 69 6e 20     /* A slot in 
e290: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b 5d 20  pIdx->aSample[] 
e2a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  */..  assert( db
e2b0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
e2c0: 61 62 6c 65 20 29 3b 0a 20 20 7a 53 71 6c 20 3d  able );.  zSql =
e2d0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e2e0: 64 62 2c 20 7a 53 71 6c 31 2c 20 7a 44 62 29 3b  db, zSql1, zDb);
e2f0: 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a  .  if( !zSql ){.
e300: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e310: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
e320: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e330: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
e340: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
e350: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
e360: 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  ee(db, zSql);.  
e370: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e380: 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 73 71  rc;..  while( sq
e390: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
e3a0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
e3b0: 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 43 6f 6c  .    int nIdxCol
e3c0: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
e3d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e3e0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 74 61 74 34  columns in stat4
e3f0: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 20 20 20   records */..   
e400: 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20   char *zIndex;  
e410: 20 2f 2a 20 49 6e 64 65 78 20 6e 61 6d 65 20 2a   /* Index name *
e420: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
e430: 78 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  x;    /* Pointer
e440: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 62   to the index ob
e450: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
e460: 6e 53 61 6d 70 6c 65 3b 20 20 20 20 2f 2a 20 4e  nSample;    /* N
e470: 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
e480: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
e490: 65 3b 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  e;      /* Bytes
e4a0: 20 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72   of space requir
e4b0: 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ed */.    int i;
e4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e4d0: 65 73 20 6f 66 20 73 70 61 63 65 20 72 65 71 75  es of space requ
e4e0: 69 72 65 64 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ired */.    tRow
e4f0: 63 6e 74 20 2a 70 53 70 61 63 65 3b 0a 0a 20 20  cnt *pSpace;..  
e500: 20 20 7a 49 6e 64 65 78 20 3d 20 28 63 68 61 72    zIndex = (char
e510: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
e520: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
e530: 3b 0a 20 20 20 20 69 66 28 20 7a 49 6e 64 65 78  ;.    if( zIndex
e540: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
e550: 20 20 20 20 6e 53 61 6d 70 6c 65 20 3d 20 73 71      nSample = sq
e560: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
e570: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
e580: 70 49 64 78 20 3d 20 66 69 6e 64 49 6e 64 65 78  pIdx = findIndex
e590: 4f 72 50 72 69 6d 61 72 79 4b 65 79 28 64 62 2c  OrPrimaryKey(db,
e5a0: 20 7a 49 6e 64 65 78 2c 20 7a 44 62 29 3b 0a 20   zIndex, zDb);. 
e5b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 3d     assert( pIdx=
e5c0: 3d 30 20 7c 7c 20 62 53 74 61 74 33 20 7c 7c 20  =0 || bStat3 || 
e5d0: 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3d 3d 30  pIdx->nSample==0
e5e0: 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 64 65 78   );.    /* Index
e5f0: 2e 6e 53 61 6d 70 6c 65 20 69 73 20 6e 6f 6e 2d  .nSample is non-
e600: 7a 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f 69  zero at this poi
e610: 6e 74 20 69 66 20 64 61 74 61 20 68 61 73 20 61  nt if data has a
e620: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
e630: 2a 2a 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74  ** loaded from t
e640: 68 65 20 73 74 61 74 34 20 74 61 62 6c 65 2e 20  he stat4 table. 
e650: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 67 6e  In this case ign
e660: 6f 72 65 20 73 74 61 74 33 20 64 61 74 61 2e 20  ore stat3 data. 
e670: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
e680: 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 6e 53 61  ==0 || pIdx->nSa
e690: 6d 70 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mple ) continue;
e6a0: 0a 20 20 20 20 69 66 28 20 62 53 74 61 74 33 3d  .    if( bStat3=
e6b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
e6c0: 72 74 28 20 21 48 61 73 52 6f 77 69 64 28 70 49  rt( !HasRowid(pI
e6d0: 64 78 2d 3e 70 54 61 62 6c 65 29 20 7c 7c 20 70  dx->pTable) || p
e6e0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 70 49  Idx->nColumn==pI
e6f0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 31 20 29 3b  dx->nKeyCol+1 );
e700: 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52  .      if( !HasR
e710: 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
e720: 65 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b  e) && IsPrimaryK
e730: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 7b  eyIndex(pIdx) ){
e740: 0a 20 20 20 20 20 20 20 20 6e 49 64 78 43 6f 6c  .        nIdxCol
e750: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
e760: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e770: 20 20 20 20 20 20 20 6e 49 64 78 43 6f 6c 20 3d         nIdxCol =
e780: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
e790: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e7a0: 20 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43    pIdx->nSampleC
e7b0: 6f 6c 20 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  ol = nIdxCol;.  
e7c0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
e7d0: 28 49 6e 64 65 78 53 61 6d 70 6c 65 29 20 2a 20  (IndexSample) * 
e7e0: 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20 6e 42 79  nSample;.    nBy
e7f0: 74 65 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52 6f  te += sizeof(tRo
e800: 77 63 6e 74 29 20 2a 20 6e 49 64 78 43 6f 6c 20  wcnt) * nIdxCol 
e810: 2a 20 33 20 2a 20 6e 53 61 6d 70 6c 65 3b 0a 20  * 3 * nSample;. 
e820: 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 49 64 78     nByte += nIdx
e830: 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 74 52 6f  Col * sizeof(tRo
e840: 77 63 6e 74 29 3b 20 20 20 20 20 2f 2a 20 53 70  wcnt);     /* Sp
e850: 61 63 65 20 66 6f 72 20 49 6e 64 65 78 2e 61 41  ace for Index.aA
e860: 76 67 45 71 5b 5d 20 2a 2f 0a 0a 20 20 20 20 70  vgEq[] */..    p
e870: 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20 73  Idx->aSample = s
e880: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e890: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
e8a0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 61     if( pIdx->aSa
e8b0: 6d 70 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mple==0 ){.     
e8c0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
e8d0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
e8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e8f0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
e900: 20 20 20 20 70 53 70 61 63 65 20 3d 20 28 74 52      pSpace = (tR
e910: 6f 77 63 6e 74 2a 29 26 70 49 64 78 2d 3e 61 53  owcnt*)&pIdx->aS
e920: 61 6d 70 6c 65 5b 6e 53 61 6d 70 6c 65 5d 3b 0a  ample[nSample];.
e930: 20 20 20 20 70 49 64 78 2d 3e 61 41 76 67 45 71      pIdx->aAvgEq
e940: 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63   = pSpace; pSpac
e950: 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  e += nIdxCol;.  
e960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 61    for(i=0; i<nSa
e970: 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mple; i++){.    
e980: 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 5b    pIdx->aSample[
e990: 69 5d 2e 61 6e 45 71 20 3d 20 70 53 70 61 63 65  i].anEq = pSpace
e9a0: 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e 49 64 78  ; pSpace += nIdx
e9b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  Col;.      pIdx-
e9c0: 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74  >aSample[i].anLt
e9d0: 20 3d 20 70 53 70 61 63 65 3b 20 70 53 70 61 63   = pSpace; pSpac
e9e0: 65 20 2b 3d 20 6e 49 64 78 43 6f 6c 3b 0a 20 20  e += nIdxCol;.  
e9f0: 20 20 20 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c      pIdx->aSampl
ea00: 65 5b 69 5d 2e 61 6e 44 4c 74 20 3d 20 70 53 70  e[i].anDLt = pSp
ea10: 61 63 65 3b 20 70 53 70 61 63 65 20 2b 3d 20 6e  ace; pSpace += n
ea20: 49 64 78 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20  IdxCol;.    }.  
ea30: 20 20 61 73 73 65 72 74 28 20 28 28 75 38 2a 29    assert( ((u8*)
ea40: 70 53 70 61 63 65 29 2d 6e 42 79 74 65 3d 3d 28  pSpace)-nByte==(
ea50: 75 38 2a 29 28 70 49 64 78 2d 3e 61 53 61 6d 70  u8*)(pIdx->aSamp
ea60: 6c 65 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  le) );.  }.  rc 
ea70: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
ea80: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
ea90: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
eaa0: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
eab0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 53  e3MPrintf(db, zS
eac0: 71 6c 32 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  ql2, zDb);.  if(
ead0: 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 65   !zSql ){.    re
eae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eaf0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  M_BKPT;.  }.  rc
eb00: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
eb10: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  re(db, zSql, -1,
eb20: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
eb30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
eb40: 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63   zSql);.  if( rc
eb50: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
eb60: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
eb70: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
eb80: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
eb90: 68 61 72 20 2a 7a 49 6e 64 65 78 3b 20 20 20 20  har *zIndex;    
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ebb0: 49 6e 64 65 78 20 6e 61 6d 65 20 2a 2f 0a 20 20  Index name */.  
ebc0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
ebf0: 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e index object *
ec00: 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  /.    int nCol =
ec10: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
ec20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ec30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 69 6e 64 65   columns in inde
ec40: 78 20 2a 2f 0a 0a 20 20 20 20 7a 49 6e 64 65 78  x */..    zIndex
ec50: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
ec60: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
ec70: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
ec80: 28 20 7a 49 6e 64 65 78 3d 3d 30 20 29 20 63 6f  ( zIndex==0 ) co
ec90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
eca0: 20 3d 20 66 69 6e 64 49 6e 64 65 78 4f 72 50 72   = findIndexOrPr
ecb0: 69 6d 61 72 79 4b 65 79 28 64 62 2c 20 7a 49 6e  imaryKey(db, zIn
ecc0: 64 65 78 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  dex, zDb);.    i
ecd0: 66 28 20 70 49 64 78 3d 3d 30 20 29 20 63 6f 6e  f( pIdx==0 ) con
ece0: 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68  tinue;.    /* Th
ecf0: 69 73 20 6e 65 78 74 20 63 6f 6e 64 69 74 69 6f  is next conditio
ed00: 6e 20 69 73 20 74 72 75 65 20 69 66 20 64 61 74  n is true if dat
ed10: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
ed20: 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 0a  en loaded from .
ed30: 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74      ** the sqlit
ed40: 65 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 20 49  e_stat4 table. I
ed50: 6e 20 74 68 69 73 20 63 61 73 65 20 69 67 6e 6f  n this case igno
ed60: 72 65 20 73 74 61 74 33 20 64 61 74 61 2e 20 20  re stat3 data.  
ed70: 2a 2f 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 49  */.    nCol = pI
ed80: 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 3b 0a  dx->nSampleCol;.
ed90: 20 20 20 20 69 66 28 20 62 53 74 61 74 33 20 26      if( bStat3 &
eda0: 26 20 6e 43 6f 6c 3e 31 20 29 20 63 6f 6e 74 69  & nCol>1 ) conti
edb0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nue;.    if( pId
edc0: 78 21 3d 70 50 72 65 76 49 64 78 20 29 7b 0a 20  x!=pPrevIdx ){. 
edd0: 20 20 20 20 20 69 6e 69 74 41 76 67 45 71 28 70       initAvgEq(p
ede0: 50 72 65 76 49 64 78 29 3b 0a 20 20 20 20 20 20  PrevIdx);.      
edf0: 70 50 72 65 76 49 64 78 20 3d 20 70 49 64 78 3b  pPrevIdx = pIdx;
ee00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 61 6d 70  .    }.    pSamp
ee10: 6c 65 20 3d 20 26 70 49 64 78 2d 3e 61 53 61 6d  le = &pIdx->aSam
ee20: 70 6c 65 5b 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ple[pIdx->nSampl
ee30: 65 5d 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  e];.    decodeIn
ee40: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73 71  tArray((char*)sq
ee50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
ee60: 74 28 70 53 74 6d 74 2c 31 29 2c 6e 43 6f 6c 2c  t(pStmt,1),nCol,
ee70: 70 53 61 6d 70 6c 65 2d 3e 61 6e 45 71 2c 30 2c  pSample->anEq,0,
ee80: 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  0);.    decodeIn
ee90: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73 71  tArray((char*)sq
eea0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
eeb0: 74 28 70 53 74 6d 74 2c 32 29 2c 6e 43 6f 6c 2c  t(pStmt,2),nCol,
eec0: 70 53 61 6d 70 6c 65 2d 3e 61 6e 4c 74 2c 30 2c  pSample->anLt,0,
eed0: 30 29 3b 0a 20 20 20 20 64 65 63 6f 64 65 49 6e  0);.    decodeIn
eee0: 74 41 72 72 61 79 28 28 63 68 61 72 2a 29 73 71  tArray((char*)sq
eef0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
ef00: 74 28 70 53 74 6d 74 2c 33 29 2c 6e 43 6f 6c 2c  t(pStmt,3),nCol,
ef10: 70 53 61 6d 70 6c 65 2d 3e 61 6e 44 4c 74 2c 30  pSample->anDLt,0
ef20: 2c 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 61 6b  ,0);..    /* Tak
ef30: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
ef40: 73 61 6d 70 6c 65 2e 20 41 64 64 20 74 77 6f 20  sample. Add two 
ef50: 30 78 30 30 20 62 79 74 65 73 20 74 68 65 20 65  0x00 bytes the e
ef60: 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
ef70: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
ef80: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 61 6d   in case the sam
ef90: 70 6c 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  ple record is co
efa0: 72 72 75 70 74 65 64 2e 20 49 6e 20 74 68 61 74  rrupted. In that
efb0: 20 63 61 73 65 2c 20 74 68 65 0a 20 20 20 20 2a   case, the.    *
efc0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
efd0: 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 6d 61 79  ordCompare() may
efe0: 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f 20   read up to two 
eff0: 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
f000: 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
f010: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  he allocated buf
f020: 66 65 72 20 62 65 66 6f 72 65 20 69 74 20 72 65  fer before it re
f030: 61 6c 69 7a 65 73 20 69 74 20 69 73 20 64 65 61  alizes it is dea
f040: 6c 69 6e 67 20 77 69 74 68 0a 20 20 20 20 2a 2a  ling with.    **
f050: 20 61 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72   a corrupt recor
f060: 64 2e 20 41 64 64 69 6e 67 20 74 68 65 20 74 77  d. Adding the tw
f070: 6f 20 30 78 30 30 20 62 79 74 65 73 20 70 72 65  o 0x00 bytes pre
f080: 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 20  vents this from 
f090: 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 61  causing.    ** a
f0a0: 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
f0b0: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 61 6d 70 6c  .  */.    pSampl
f0c0: 65 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  e->n = sqlite3_c
f0d0: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
f0e0: 74 2c 20 34 29 3b 0a 20 20 20 20 70 53 61 6d 70  t, 4);.    pSamp
f0f0: 6c 65 2d 3e 70 20 3d 20 73 71 6c 69 74 65 33 44  le->p = sqlite3D
f100: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
f110: 70 53 61 6d 70 6c 65 2d 3e 6e 20 2b 20 32 29 3b  pSample->n + 2);
f120: 0a 20 20 20 20 69 66 28 20 70 53 61 6d 70 6c 65  .    if( pSample
f130: 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->p==0 ){.      
f140: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
f150: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
f160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
f170: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
f180: 20 20 20 6d 65 6d 63 70 79 28 70 53 61 6d 70 6c     memcpy(pSampl
f190: 65 2d 3e 70 2c 20 73 71 6c 69 74 65 33 5f 63 6f  e->p, sqlite3_co
f1a0: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
f1b0: 20 34 29 2c 20 70 53 61 6d 70 6c 65 2d 3e 6e 29   4), pSample->n)
f1c0: 3b 0a 20 20 20 20 70 49 64 78 2d 3e 6e 53 61 6d  ;.    pIdx->nSam
f1d0: 70 6c 65 2b 2b 3b 0a 20 20 7d 0a 20 20 72 63 20  ple++;.  }.  rc 
f1e0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
f1f0: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
f200: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f210: 20 69 6e 69 74 41 76 67 45 71 28 70 50 72 65 76   initAvgEq(pPrev
f220: 49 64 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Idx);.  return r
f230: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  c;.}../*.** Load
f240: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
f250: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 61  e sqlite_stat4 a
f260: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
f270: 74 61 62 6c 65 73 20 69 6e 74 6f 20 0a 2a 2a 20  tables into .** 
f280: 74 68 65 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c  the Index.aSampl
f290: 65 5b 5d 20 61 72 72 61 79 73 20 6f 66 20 61 6c  e[] arrays of al
f2a0: 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 73 74  l indices..*/.st
f2b0: 61 74 69 63 20 69 6e 74 20 6c 6f 61 64 53 74 61  atic int loadSta
f2c0: 74 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  t4(sqlite3 *db, 
f2d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
f2e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f2f0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
f300: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
f310: 64 65 73 20 66 72 6f 6d 20 73 75 62 72 6f 75 74  des from subrout
f320: 69 6e 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ines */..  asser
f330: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
f340: 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 69  .bDisable );.  i
f350: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
f360: 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
f370: 73 74 61 74 34 22 2c 20 7a 44 62 29 20 29 7b 0a  stat4", zDb) ){.
f380: 20 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61      rc = loadSta
f390: 74 54 62 6c 28 64 62 2c 20 30 2c 0a 20 20 20 20  tTbl(db, 0,.    
f3a0: 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 63 6f    "SELECT idx,co
f3b0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 73  unt(*) FROM %Q.s
f3c0: 71 6c 69 74 65 5f 73 74 61 74 34 20 47 52 4f 55  qlite_stat4 GROU
f3d0: 50 20 42 59 20 69 64 78 22 2c 20 0a 20 20 20 20  P BY idx", .    
f3e0: 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 6e 65    "SELECT idx,ne
f3f0: 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 61 6d 70 6c  q,nlt,ndlt,sampl
f400: 65 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  e FROM %Q.sqlite
f410: 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20 20 7a  _stat4",.      z
f420: 44 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  Db.    );.  }.. 
f430: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f440: 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e  OK && sqlite3Fin
f450: 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
f460: 74 65 5f 73 74 61 74 33 22 2c 20 7a 44 62 29 20  te_stat3", zDb) 
f470: 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 61 64  ){.    rc = load
f480: 53 74 61 74 54 62 6c 28 64 62 2c 20 31 2c 0a 20  StatTbl(db, 1,. 
f490: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 78       "SELECT idx
f4a0: 2c 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25  ,count(*) FROM %
f4b0: 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 33 20 47  Q.sqlite_stat3 G
f4c0: 52 4f 55 50 20 42 59 20 69 64 78 22 2c 20 0a 20  ROUP BY idx", . 
f4d0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 78       "SELECT idx
f4e0: 2c 6e 65 71 2c 6e 6c 74 2c 6e 64 6c 74 2c 73 71  ,neq,nlt,ndlt,sq
f4f0: 6c 69 74 65 5f 72 65 63 6f 72 64 28 73 61 6d 70  lite_record(samp
f500: 6c 65 29 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  le) FROM %Q.sqli
f510: 74 65 5f 73 74 61 74 33 22 2c 0a 20 20 20 20 20  te_stat3",.     
f520: 20 7a 44 62 0a 20 20 20 20 29 3b 0a 20 20 7d 0a   zDb.    );.  }.
f530: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f540: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f550: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
f560: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
f570: 20 4c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Load the conten
f580: 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  t of the sqlite_
f590: 73 74 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65  stat1 and sqlite
f5a0: 5f 73 74 61 74 33 2f 34 20 74 61 62 6c 65 73 2e  _stat3/4 tables.
f5b0: 20 54 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   The.** contents
f5c0: 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 31   of sqlite_stat1
f5d0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 6f 70   are used to pop
f5e0: 75 6c 61 74 65 20 74 68 65 20 49 6e 64 65 78 2e  ulate the Index.
f5f0: 61 69 52 6f 77 45 73 74 5b 5d 0a 2a 2a 20 61 72  aiRowEst[].** ar
f600: 72 61 79 73 2e 20 54 68 65 20 63 6f 6e 74 65 6e  rays. The conten
f610: 74 73 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ts of sqlite_sta
f620: 74 33 2f 34 20 61 72 65 20 75 73 65 64 20 74 6f  t3/4 are used to
f630: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
f640: 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 5b 5d   Index.aSample[]
f650: 20 61 72 72 61 79 73 2e 0a 2a 2a 0a 2a 2a 20 49   arrays..**.** I
f660: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  f the sqlite_sta
f670: 74 31 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  t1 table is not 
f680: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
f690: 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f  atabase, SQLITE_
f6a0: 45 52 52 4f 52 0a 2a 2a 20 69 73 20 72 65 74 75  ERROR.** is retu
f6b0: 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
f6c0: 73 65 2c 20 65 76 65 6e 20 69 66 20 53 51 4c 49  se, even if SQLI
f6d0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 2f  TE_ENABLE_STAT3/
f6e0: 34 20 77 61 73 20 64 65 66 69 6e 65 64 20 0a 2a  4 was defined .*
f6f0: 2a 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61  * during compila
f700: 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 73 71 6c  tion and the sql
f710: 69 74 65 5f 73 74 61 74 33 2f 34 20 74 61 62 6c  ite_stat3/4 tabl
f720: 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6e 6f  e is present, no
f730: 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 72 65 61   data is .** rea
f740: 64 20 66 72 6f 6d 20 69 74 2e 0a 2a 2a 0a 2a 2a  d from it..**.**
f750: 20 49 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   If SQLITE_ENABL
f760: 45 5f 53 54 41 54 33 2f 34 20 77 61 73 20 64 65  E_STAT3/4 was de
f770: 66 69 6e 65 64 20 64 75 72 69 6e 67 20 63 6f 6d  fined during com
f780: 70 69 6c 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  pilation and the
f790: 20 0a 2a 2a 20 73 71 6c 69 74 65 5f 73 74 61 74   .** sqlite_stat
f7a0: 34 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 70  4 table is not p
f7b0: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61  resent in the da
f7c0: 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  tabase, SQLITE_E
f7d0: 52 52 4f 52 20 69 73 0a 2a 2a 20 72 65 74 75 72  RROR is.** retur
f7e0: 6e 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 6e  ned. However, in
f7f0: 20 74 68 69 73 20 63 61 73 65 2c 20 64 61 74 61   this case, data
f800: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f810: 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 0a 2a  e sqlite_stat1.*
f820: 2a 20 74 61 62 6c 65 20 28 69 66 20 69 74 20 69  * table (if it i
f830: 73 20 70 72 65 73 65 6e 74 29 20 62 65 66 6f 72  s present) befor
f840: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
f850: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
f860: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
f870: 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
f880: 73 65 74 73 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  sets db->mallocF
f890: 61 69 6c 65 64 2e 0a 2a 2a 20 54 68 69 73 20 6d  ailed..** This m
f8a0: 65 61 6e 73 20 69 66 20 74 68 65 20 63 61 6c 6c  eans if the call
f8b0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 61 72 65  er does not care
f8c0: 20 61 62 6f 75 74 20 6f 74 68 65 72 20 65 72 72   about other err
f8d0: 6f 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 0a  ors, the return.
f8e0: 2a 2a 20 63 6f 64 65 20 6d 61 79 20 62 65 20 69  ** code may be i
f8f0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
f900: 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f  qlite3AnalysisLo
f910: 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ad(sqlite3 *db, 
f920: 69 6e 74 20 69 44 62 29 7b 0a 20 20 61 6e 61 6c  int iDb){.  anal
f930: 79 73 69 73 49 6e 66 6f 20 73 49 6e 66 6f 3b 0a  ysisInfo sInfo;.
f940: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
f950: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
f960: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f970: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  K;..  assert( iD
f980: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
f990: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
f9a0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
f9b0: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6c  t!=0 );..  /* Cl
f9c0: 65 61 72 20 61 6e 79 20 70 72 69 6f 72 20 73 74  ear any prior st
f9d0: 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 61 73  atistics */.  as
f9e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
f9f0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
fa00: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f   iDb, 0) );.  fo
fa10: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
fa20: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62  rst(&db->aDb[iDb
fa30: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
fa40: 73 68 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61  sh);i;i=sqliteHa
fa50: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
fa60: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
fa70: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
fa80: 0a 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77  .    pIdx->aiRow
fa90: 4c 6f 67 45 73 74 5b 30 5d 20 3d 20 30 3b 0a 23  LogEst[0] = 0;.#
faa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fab0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
fac0: 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  T4.    sqlite3De
fad0: 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73  leteIndexSamples
fae0: 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
faf0: 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 20 3d 20  pIdx->aSample = 
fb00: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  0;.#endif.  }.. 
fb10: 20 2f 2a 20 4c 6f 61 64 20 6e 65 77 20 73 74 61   /* Load new sta
fb20: 74 69 73 74 69 63 73 20 6f 75 74 20 6f 66 20 74  tistics out of t
fb30: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
fb40: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 49 6e 66 6f  table */.  sInfo
fb50: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 49 6e 66  .db = db;.  sInf
fb60: 6f 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 64 62  o.zDatabase = db
fb70: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
fb80: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
fb90: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
fba0: 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 73 49 6e  lite_stat1", sIn
fbb0: 66 6f 2e 7a 44 61 74 61 62 61 73 65 29 21 3d 30  fo.zDatabase)!=0
fbc0: 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   ){.    zSql = s
fbd0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
fbe0: 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
fbf0: 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20  CT tbl,idx,stat 
fc00: 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
fc10: 74 61 74 31 22 2c 20 73 49 6e 66 6f 2e 7a 44 61  tat1", sInfo.zDa
fc20: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
fc30: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
fc40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
fc50: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  MEM_BKPT;.    }e
fc60: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
fc70: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
fc80: 20 7a 53 71 6c 2c 20 61 6e 61 6c 79 73 69 73 4c   zSql, analysisL
fc90: 6f 61 64 65 72 2c 20 26 73 49 6e 66 6f 2c 20 30  oader, &sInfo, 0
fca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fcb0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
fcc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fcd0: 2a 20 53 65 74 20 61 70 70 72 6f 70 72 69 61 74  * Set appropriat
fce0: 65 20 64 65 66 61 75 6c 74 73 20 6f 6e 20 61 6c  e defaults on al
fcf0: 6c 20 69 6e 64 65 78 65 73 20 6e 6f 74 20 69 6e  l indexes not in
fd00: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
fd10: 31 20 74 61 62 6c 65 20 2a 2f 0a 20 20 61 73 73  1 table */.  ass
fd20: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
fd30: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
fd40: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 66 6f 72  iDb, 0) );.  for
fd50: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
fd60: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d  st(&db->aDb[iDb]
fd70: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
fd80: 68 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  h);i;i=sqliteHas
fd90: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49  hNext(i)){.    I
fda0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
fdb0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
fdc0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
fdd0: 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3d 3d 30 20  RowLogEst[0]==0 
fde0: 29 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  ) sqlite3Default
fdf0: 52 6f 77 45 73 74 28 70 49 64 78 29 3b 0a 20 20  RowEst(pIdx);.  
fe00: 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  }..  /* Load the
fe10: 20 73 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d   statistics from
fe20: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
fe30: 34 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64  4 table. */.#ifd
fe40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fe50: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
fe60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fe70: 5f 4f 4b 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  _OK && Optimizat
fe80: 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
fe90: 51 4c 49 54 45 5f 53 74 61 74 33 34 29 20 29 7b  QLITE_Stat34) ){
fea0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
feb0: 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 20  de.bDisable++;. 
fec0: 20 20 20 72 63 20 3d 20 6c 6f 61 64 53 74 61 74     rc = loadStat
fed0: 34 28 64 62 2c 20 73 49 6e 66 6f 2e 7a 44 61 74  4(db, sInfo.zDat
fee0: 61 62 61 73 65 29 3b 0a 20 20 20 20 64 62 2d 3e  abase);.    db->
fef0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
ff00: 6c 65 2d 2d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  le--;.  }.  for(
ff10: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
ff20: 74 28 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t(&db->aDb[iDb].
ff30: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
ff40: 29 3b 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  );i;i=sqliteHash
ff50: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 49 6e  Next(i)){.    In
ff60: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
ff70: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
ff80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ff90: 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 29 3b  pIdx->aiRowEst);
ffa0: 0a 20 20 20 20 70 49 64 78 2d 3e 61 69 52 6f 77  .    pIdx->aiRow
ffb0: 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  Est = 0;.  }.#en
ffc0: 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  dif..  if( rc==S
ffd0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
ffe0: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
fff0: 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  lt(db);.  }.  re
10000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 65 6e  turn rc;.}...#en
10010 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10020 49 54 5f 41 4e 41 4c 59 5a 45 20 2a 2f 0a        IT_ANALYZE */.